9 Stimmen

Wie finde ich Ressourcen in einer .jar-Datei auf dem Klassenpfad?

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.

1voto

sugaGenius Punkte 11

Obwohl ich Ihnen viele Fragen stellen muss, um eine genaue Lösung vorzuschlagen, kann ich Sie bitten, diesen einfachen Schritt zu versuchen, der Ihnen helfen kann, die Ressourcen zu finden. Ich glaube, dass der Klassenlader, den Sie verwenden, um die Ressourcen zu finden, nicht in der Lage ist, die Ressourcen zu finden. Sie können es also wie folgt versuchen (eher ein Workaround):

  1. Erstellen Sie eine einfache leere Klasse (z. B. ResourceGetter.class)

  2. Verpacken Sie die Klasse zusammen mit den anderen Ressourcen im JAR. Lassen Sie diese Klasse auf der gleichen Ebene der Ordnerhierarchie wie die anderen Ressourcen verpackt werden. Innerhalb des JAR, zum Beispiel :

    /resources/ResourceGetter.class

    /resources/myprop.properties ....

  3. Verwenden Sie ResourceGetter.class.getClassLoader().getResourceAsStream() oder getResources() in Ihrem Code, wo Sie diese Ressourcendateien benötigen.

Wenn Sie auf die Ressourcen zugreifen können, finden Sie den Klassenlader, der die Klasse geladen hat, und können so Ihr Problem lösen.

-1voto

Schildmeijer Punkte 20362
this.getClass ().getClassLoader ().getResourceAsStream(location);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X