Wenn ich eine Sammlung von Ressourcendateien in einem Verzeichnis auf meinem Klassenpfad habe, kann ich sie mit der folgenden Methode aufzählen ClassLoader.getResources(location)
.
Wenn ich zum Beispiel /mydir/myresource.properties
auf dem Klassenpfad, kann ich den Classloader getResources("mydir")
und erhalten eine Aufzählung von URLs, die myresource.properties
.
Wenn ich genau dieselben Ressourcen in eine .jar-Datei packe, erhalte ich beim Aufruf nichts in der Aufzählung der URLs. 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 Aufrufen mit getResourceAsStream(location)
um andere Ressourcen einzeln nach Namen abzurufen, und sie funktionieren alle einwandfrei.
Was ist anders bei der Aufzählung von Ressourcen, wenn die Ressourcen in einer .jar-Datei enthalten sind?
Update - Ich habe das Verhalten außerhalb des Containers reproduziert (ish). Das folgende Snippet führt zu der dirProperties
Objekt, dessen Schlüssel auf die Ressourcennamen im Paket gesetzt sind, aber wenn das Paket in einer .jar-Datei enthalten ist, wird bei der Methode Properties.load(InputStream) eine NullPointerException ausgelöst.
Properties dirProperties = new Properties();
dirProperties.load(this.getClass().getClassLoader().getResourceAsStream(location));
Derselbe Code auf dem Container (Tomcat 5.5) löst keine Ausnahme aus, erzeugt aber ein leeres Properties-Objekt, wenn die Dateien in einer .jar-Datei enthalten sind.