Zunächst habe ich viele S.O. Fragen zu diesem Thema und ich habe die darin vorgeschlagenen Dinge ausprobiert.Wie sollte auf Ressourcen in einem kompilierten Jar zugegriffen werden?
Hier ist meine Situation. Ich schreibe eine Java-App mit dem Processing-Framework und bin in den letzten Phasen, in denen ich über die Verpackung der App nachdenken muss. Eine JAR-Datei, die über die Befehlszeile ausführbar ist, versuche ich mithilfe der Exportfunktion in Eclipse zu erstellen.
Die Struktur meines Projekts sieht wie folgt aus:
src/
multiple packages/
libs/
jar files and natives
data/
fonts and images
config/
json files
Wenn ich exportieren Sie die JAR-Datei und uzip das Glas seinen Inhalt zu untersuchen, finde ich, dass der Inhalt dieser Verzeichnisse auf der obersten Ebene abgeladen wurden des .jar.
die wie folgt aussieht:
.jar
packages
jar files
fonts
json files
Also, wenn ich versuche, wie eine Konfigurationsdatei mit etwas zu laden:
BufferedReader reader = new BufferedReader(new FileReader(path));
alles funktioniert file, wenn ich die app in Eclipse ausgeführt werden. Aber die JAR-Datei wirft eine FileNotFoundException
.
Viele der Fragen, die ich auf S.O. In Bezug auf solche Probleme empfehlen wir die Verwendung von class.getClass().getResource()
oder class.getResourceAsStream()
. Ich habe diese beiden mit relativen Pfaden versucht und nur den Dateinamen wie in:
class.getResource('config.json');
class.getResources('cfg/config.json');
class.getResourceAsStream('../../config.json');
Alle diese Methoden null zurück, wenn entweder von Eclipse oder das Glas laufen mit:
java -jar myjarfile.jar
Ich bin auch offen für die Verwendung einer Ant-Datei. Tatsächlich benutze ich jetzt die Ant-Datei, die von der Exportfunktion generiert wurde, um das Jar zu erstellen. Wenn es etwas gibt, das ich hinzufügen kann, um die Verzeichnisse in das Glas hinzuzufügen, das auch großartig wäre.
Vielen Dank für Ihre Antwort. Schlägst du vor, dass ich den Schrägstrich in einem Zusatz zu getResource() verwende? – JeremyFromEarth
Dies scheint viel näher zu kommen. Dies ist der Pfad, den dieser zurückgibt: jar: file:/C: /path_to_project/myjarfile.jar! /config.json Wenn ich das jar ausführe, erhalte ich trotzdem eine Ausnahmedatei, obwohl der Pfad korrekt ist. Ich sollte auch erwähnen, dass es innerhalb von Eclipse funktioniert. – JeremyFromEarth
Sie können FileReader nicht mit Ressourcen innerhalb von jars verwenden. Sie müssen den von getResourceAsSTream zurückgegebenen InputStream verwenden. –