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.