2011-01-04 5 views
4

ich mit zwei Gläsern in der Class-Path-Eintrag seiner Manifest-Datei ein lauffähiges Glas haben:Wie bekomme ich Gläser aus Manifest Class-Path-Einträge

Class-Path: module1-0.0.1-SNAPSHOT.jar base-0.0.1-SNAPSHOT.jar 
Main-Class: test.MySPI 

Das Programm läuft gut und alle Abhängigkeiten in der referenzierte Gläser sind erfüllt. Allerdings, wenn ich versuche, den Klassenpfad zu gelangen, sind die Gläser nicht da:

String classpath = System.getProperty("java.class.path"); 
String[] entries = classpath.split(System.getProperty("path.separator")); 
for (String entry : entries) { 
    System.out.println("Entry: " + entry); 
} 

Nur gibt

Entry: .\module2-0.0.1-SNAPSHOT.jar 

Gibt es eine Möglichkeit, die tatsächliche Classpath des Zugriffs auf, da offensichtlich findet das System diejenigen Gläser auf dem Weg?

+0

Sie können sich nicht auf Systemeigenschaften verlassen. Fragen Sie die JVM. –

Antwort

3

Sie benötigen tatsächlich die Position der JAR-Dateien, oder Sie tun müssen nur Ressourcen von ihnen laden?

Wenn Sie nur Ressourcen laden möchten, interessiert Sie java.lang.ClassLoader, seine statische getSystemClassLoader() Methode und die statische java.lang.Thread.currentThread().getContextClassLoader() Methode.

Wenn Sie herausfinden wollten, was sie waren, weil Sie die Versionszeichenkette vom Jar-Dateinamen lesen wollten ... und wenn sie irgendwie unter Ihrer Kontrolle waren ... möchten Sie vielleicht Package.getPackage("my.package").getImplementationVersion() verwenden und organisieren, um die zu haben Erforderliche Werte, die in das Manifest der Komponentengläser geschrieben werden.

+1

Eigentlich wollte ich Details über alle JAR-Dateien auf meinem bekommen Classpath, um Versionen für alle Module anzugeben. Ich habe es gelöst, indem ich this.getClass(). GetClassLoader(). GetResources ("META-INF/MANIFEST.MF"); –

5

Ich glaube, Sie müssen die Manifest Klasse verwenden, in der MANIFEST.MF Datei lesen und das Class-Path-Attribut extrahieren, dass die Klasse mit

+0

Sie haben Recht! Dies ist praktisch, wenn Sie mit der Java-Spezifikationslinie brake/wrapping für den Klassenpfad-Eintrag in Manifest arbeiten müssen. Ich hatte dieses Problem und diese Antwort hat mir sehr geholfen! In der bereitgestellten Webanwendung habe ich dieses Codefragment verwendet: new Manifest ((InputStream) httpRequest.getServletContext(). GetResource ("/ META-INF/MANIFEST.MF"). GetContent()); SN: http://stackoverflow.com/questions/7402271/maven-archiver-putting-in-weird-line-breaks-in-classpath-for-manifest – David

Verwandte Themen