Wenn ich eine Sammlung von Ressourcendateien in einem Verzeichnis in meinem Klassenpfad habe, kann ich sie mit ClassLoader.getResources(location)
aufzählen.
Wenn ich zum Beispiel /mydir/myresource.properties
im Klassenpfad habe, kann ich das getResources("mydir")
des Klassenladers aufrufen und eine Aufzählung von URLs mit myresource.properties
erhalten.
Wenn ich genau dieselben Ressourcen in ein .jar-Paket packe, erhalte ich bei der Aufzählung von URLs nichts, wenn ich den Anruf tätige. Ich habe nur die Ordnerstruktur durch ein Jar ersetzt, das diese Ordner enthält (es ist eine Webapp, also wird das Jar in /WEB-INF/lib
). Ich habe auch eine Reihe von anderen Anrufen mit getResourceAsStream(location)
, um andere Ressourcen einzeln mit Namen zu bekommen und sie funktionieren alle gut.
Was ist beim Auflisten von Ressourcen anders, wenn sich die Ressourcen in einem .jar befinden?
Update - Ich habe das Verhalten außerhalb des Containers reproduziert (ish). Das folgende Snippet führt dazu, dass das Objekt dirProperties
Schlüssel auf die Ressourcennamen im Paket setzt, aber wenn das Paket in einem .jar ist, wird während der Methode Properties.load (InputStream) eine NullPointerException ausgelöst.
Derselbe Code auf dem Container (Tomcat 5.5) löst keine Ausnahme aus, erzeugt aber ein leeres Properties-Objekt, wenn sich die Dateien in einer .jar befinden.
Obwohl ich viele Fragen an Sie stellen muss, um genau eine Lösung vorzuschlagen, kann ich Sie bitten, diesen einfachen Schritt zu versuchen, der Ihnen helfen kann, die Ressourcen zu finden. Ich glaube, der Klassenlader, mit dem Sie die Ressourcen finden, kann die Ressourcen nicht finden. So können Sie versuchen, wie unten (mehr von einer Arbeit):
Packen Sie die Klasse zusammen mit den anderen Ressourcen in der JAR. Lassen Sie diese Klasse auf derselben Ebene der Ordnerhierarchie wie andere Ressourcen gepackt werden. In JAR zum Beispiel:
/resources/ResourceGetter.class
/resources/myprop.properties ....
Verwenden Sie ResourceGetter.class.getClassLoader (). getResourceAsStream () oder getResources () in Ihrem Code, wo Sie diese Ressourcendateien haben möchten.
Wenn Sie auf die Ressourcen zugreifen können, können Sie den Klassenlader finden, der sie geladen hat und Sie können dort Ihr Problem lösen.
Tags und Links java resources classpath classloader