2010-04-14 6 views
9

Ich habe eine jar Datei mit Ressourcen (hauptsächlich Konfiguration für Caches, Protokollierung usw.), die ich verteilen möchte.Zugriff auf JAR-Ressourcen

Ich habe ein Problem mit den relativen Pfaden für diese Ressourcen, so dass ich tat, was ich in einer anderen Frage Stackoverflow gefunden habe, die sagten, dass dies eine gültige Art und Weise ist:

ClassInTheSamePackageOfTheResource.class.getResourceAsStream('resource.xml'); 

Leider dies tut nicht arbeiten.

Irgendwelche Ideen? Vielen Dank!

PS: Natürlich kann ich nicht absolut verwenden Pfade, und ich möchte Umgebungsvariablen vermeiden, wenn möglich

+0

Befindet sich die Ressourcendatei im selben Ordner wie die Klassendatei? Ist dies eine eigenständige Anwendung oder läuft sie auf einem Webserver? – kgiannakakis

+0

Es ist in der Tat in dem gleichen Ordner. Es ist ein Jar, der in einer Webanwendung enthalten sein soll, ja (aber ich denke, das sollte irrelevant sein) –

+2

Es ist relevant, dass die Regeln zum Durchsuchen von Ressourcen, die einer bestimmten Klasse zugeordnet sind, vom definierenden Klassenlader implementiert werden. Der Klassenloader Ihrer Webanwendung verhält sich also je nach Implementierung möglicherweise etwas anders. Nur ein Gedanke. –

Antwort

11

Stellen Sie sicher, dass Ihr Ressourcenordner in Ihren Projekteinstellungen als Quellordner aufgeführt ist. Stellen Sie außerdem sicher, dass der Ressourcenordner beim Erstellen des JARs für den Export festgelegt ist.

Sie können Ihrer JAR-Datei eine ZIP-Erweiterung hinzufügen und sie dann öffnen, um sicherzustellen, dass Ihre Ressourcen am erwarteten Speicherort enthalten sind.

Ich benutze immer absolute Pfade wie folgt aus:

InputStream input = this.getClass().getResourceAsStream("/image.gif"); 

Wenn Sie absolute Pfade verwenden, „/“ ist der Stammordner in der JAR-Datei, nicht der Stammordner des Host-Rechners.

+4

+1 für die zugegriffen werden Beachten Sie, dass Sie der Stammordner des Jars sind. – Powerlord

+0

In der Tat habe ich die (jar) absolute Pfadmethode verwendet, die Sie beschrieben haben, und es hat funktioniert! Ich weiß nicht, warum es mit dem Verwandten nicht so gemacht hat ... aber gut genug ist gut genug –

1

Ich muss immer durch getResourceAsStream Puzzle diese Arbeit zu machen. Wenn "resource.xml" in org/pablo/opus ist, Ich denke Sie dies wünschen:

Name.class.getResourceAsStream("org.pablo.opus.resource.xml"); 
1

wo die resource.xml gefunden? Versuchen Sie im Wurzelverzeichnis der Quellenstruktur, ihm den Präfix/zu geben.

+0

Es ist nicht auf der Wurzel des Quellbaums. Es ist in einem Paket –

+1

, also behandeln Sie den voll qualifizierten Namen als absoluten Pfad, zum Beispiel com.me.and.u.effects.css würde als /com/me/and/u/effects.css – Seffi

1

speichere ich in der Regel Dateien und andere Ressourcen und dann abrufen, sie als URLs:

URL url = MyClass.class.getResource("/design/someResource.png"); 

Innerhalb eines statischen Kontext oder auf andere Weise:

URL url = getClass().getResource("/design/someResource.png"); 

von einer Instanz.

Die obigen Snippets gehen davon aus, dass das Design ein Ordner auf oberster Ebene im Jar ist. Wenn der Pfad mit einem "/" beginnt, nimmt er im Allgemeinen einen absoluten Pfad an, andernfalls ist er vom Klassenstandort relativ.