2017-06-19 10 views
2

Ich verwende eine JAR, die nur ein ClassPath Element enthält, um den Klassenpfad für meine Java-Anwendung zu erstellen, und ich habe ein merkwürdiges Verhalten festgestellt: Ich kann Klassen aus den JARs im Element ClassPath aber einige (oder alle) Ressourcen laden fehlen.Warum kann ich eine Klasse aus einer JAR laden, aber keine Ressource?

Beispiel: Mein full-classpath.jar enthält nur eine META-INF/MANIFEST.MF mit dem üblichen Inhalt und dieser Zeile:

ClassPath: foo-service.jar bar-service.jar service-main.jar 

service-main.jar enthält com.pany.project.Main.

Wenn ich java -cp full-classpath.jar com.pany.project.Main ausführen, funktioniert das.

Aber foo-service.jar und bar-service.jar enthalten Service-Definitionen in META-INF/services/....

Als ich java.util.ServiceLoader von einem Maven Unit-Test aufrufen, kann es sehen sowohl die foo und die bar Service. Als ich java -cp full-classpath.jar com.pany.project.Main -service foo sehe, sehe ich eine leere Serviceliste in meinem Protokoll.

Schlimmer, wenn ich anrufen, bekomme ich nur das Manifest von full-classpath.jar. Die Manifest-Dateien von den anderen drei JARs fehlen, was nicht sinnvoll ist, da ich Klassen aus diesen JARs laden kann! Es funktioniert auch, wenn ich den gesamten Klassenpfad manuell erstelle. Es schlägt nur fehl, wenn ich das ClassPath Element in full-classpath.jar verwende.

Irgendwelche Ideen, was könnte falsch sein oder wie könnte ich dies debuggen?

Ich bin mit Java 8.

Antwort

0

Das Manifest Attribut Class-Path in sun.misc.URLClassPath.JarLoader.parseClassPath(URL, String) behandelt wird. Diese Methode wird einmal von sun.misc.URLClassPath.JarLoader.getClassPath() aufgerufen. Zu Beginn des getClassPath(), können Sie diesen Code finden:

 if (index != null) { 
      return null; 
     } 

     if (metaIndex != null) { 
      return null; 
     } 

was bedeutet: Wenn Ihr Classpath JAR einen Index oder „Meta-Index“ enthält (was immer das ist), das Class-Path Attribut ignoriert.

Ich kann nicht sagen, warum Java noch Klassen aus JARs laden kann, die im Class-Path Attribut erwähnt werden, aber das Löschen des Indexes behebt das Problem des Ladens von Ressourcen.

Verwandte Themen