2009-12-14 18 views
19

Ich habe ein Projekt A, das einige Java-Dateien und eine Klassenpfad-Ressource R.txt enthält. Innerhalb des Projekts verwende ich ClassLoader.getSystemResource ("R.txt"); R.txt abrufen.Klassenpfad-Ressource in jar

Dann habe ich ein Projekt B, das die Jar-Datei von Projekt A enthält. Nun wird getSystemResource ("R.txt") die Textdatei nicht finden (und ja, sie befindet sich immer noch im Wurzelverzeichnis der JAR-Datei). Selbst "/R.txt" zu versuchen, wie es auf einer anderen Seite vorgeschlagen wurde, hat nicht funktioniert. Irgendwelche Ideen?

Antwort

42

Verwenden Sie getResource anstelle von getSystemResource, um eine Ressource zu verwenden, die für einen bestimmten Klassenlader anstelle des Systems spezifisch ist. Zum Beispiel, versuchen Sie eine der folgenden Aktionen:

URL resource = getClass().getClassLoader().getResource("R.txt"); 
URL resource = Foo.class.getClassLoader().getResource("R.txt"); 
URL resource = getClass().getResource("/R.txt"); 
URL resource = Foo.class.getResource("/R.txt"); 

Hinweis das führende Schrägstrich, wenn Class.getResource statt ClassLoader.getResource Aufruf; Class.getResource ist relativ zu dem Paket, das die Klasse enthält, es sei denn, Sie haben einen führenden Schrägstrich, während ClassLoader.getResource immer absolut ist.

+0

Erstaunlich. Das hat mein Problem vollständig gelöst. Danke für den superschnellen Eingang // Johan –

+0

Eine weitere verwandte Frage: wir können InputStream von diesen URL-Ressourcen erhalten, aber wie könnten wir ein ** File ** -Objekt aus dem zurückgegebenen URL-Objekt erstellen. Ich habe versucht, ein ** URI ** -Objekt mit dem "URLObject.toURI()" zu erstellen, und benutze dieses URI-Objekt, um eine Datei zu erstellen, leider wirft es eine "URI ist keine hierarchische Ausnahme". Könnten Sie mir etwas Hilfe geben? Danke vielmals . –

+2

@EnsomHodder: Äh, nicht sicher - aber nicht alle Ressourcen * sind * Dateien - insbesondere wird es nicht sein, wenn es in einer Jar-Datei ist. –

5

Anscheinend wird Ihre JAR nicht vom System Classloader geladen, so getSystemResource() kann nicht funktionieren. Dies sollte funktionieren:

ClassFromProjectA.class.getClassLoader().getResource("R.txt") 

IMO bequemer ist Ressourcen innerhalb der gleichen Paket wie die Klassen setzen, die sie verwenden, so können Sie die kürzere verwenden

ClassFromProjectA.class.getResource("R.txt") 

(oder innerhalb dieser Klasse nur getClass().getResource("R.txt"))

2

Funktioniert ClassLoader.getResource()? Im Moment geben Sie einfach an, dass der System-Classloader verwendet werden soll.

+0

Funktioniert wie ein Zauber. Musste nur den richtigen Classloader benutzen :) –

Verwandte Themen