Laden einer (Resourcendatei) aus einem Jar-File

HarryR

Mitglied
Hallo,

ich bin neu im Forum und grüße euch alle.

Ich programmiere eigentlich schon eine Weile mit Java,
Google ist mein Freund, wenn ich nicht weiter weiß.

Aber in diesem Fall hat mir auch Freund Google nicht helfen können.

So, erst mal die Randbedingungen, ich verwende als Dev-Oberfläche
Eclipse Oxygen.1a Release (4.7.1a)

Worum es in meinem Programm geht ist nebensächlich,
das Feature was nicht klappt ist das laden eines Resourcefiles.

Aus Eclipse heraus klappt alles wunderbar, die Datei wird gefunden,
Parameter werden ausgelesen, fertig.

Da mein Programm aber natürlich auch außerhalb der IDE funktionieren soll lasse ich Eclipse eine JAR-Datei generieren. Ich habe nach einigen Versuchen das Modell
"Extract required libraries into generated JAR" als das beste befunden und verwende es daher auch.

So, die bewusste Konfigurationsdatei settings.txt befindet sich im
gleichen Verzeichnis wie die Quelltext *.Java-Dateien.

Im JAR-File befindet sie sich in
"jar:file:/C:/test/myproject.jar!/PACKAGENAME/settings.txt"

Das ergibt folgender Aufruf
System.out.println(settings.class.getResource("settings.txt").toString());

settings ist die Klasse, die (ihre) Resourcedatei laden soll.

So weit so gut, ich weiß also, das die Datei prinzipiell auffindbar ist. Es ist auch bekannt, dass sie sich innerhalb des JAR-Files befindet, aber wenn ich mir einen InputStream basteln will scheitere ich bisher bei allen Versuchen (also mit Slashes, vorangestelltem Pfad etc).

Nach Aufruf von
Inputstream stream = settings.class.getResourceAsStream("settings.txt");
ist stream immer = null

Ich habe schon viel gefunden und ausprobiert, leider hatte ich bisher keinen Erfolg.

Seht ihr woran es liegt ?
Viele Grüße Harry
 

HarryR

Mitglied
Befindet sich die Datei denn in der jar (die kannst du einfach als zip entpacken)?
Ja, ich habe natürlich mit meinem Lieblingstool, dem TotalCommander reingeschaut
(nachdem ich in *.jar *.tar umbenannt habe). Sie befindet sich im "Package"-Verzeichnis bei den *.class-Dateien der
diversen anderen Klassen (also auch settings.class aus der heraus ich die Datei ja laden will).
Grüßle
 

Harry Kane

Top Contributor
Bei mir funktioniert in der Klasse mainpackage.subpackage folgendes
Java:
java.net.URL url = getClass().getResource("/resources/test.config");
Das "resources"-Verzeichnis liegt im selben Verzeichnis wie mainpackage, d. h. "resources" und "mainpackage" haben denselben parent.
 

RalleYTN

Bekanntes Mitglied
Java:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("mein/gesamter/package/path/innerhalb/der/jar/datei.txt");
Sollte auf allen Systemen funktionieren so.
Wenn du jetzt also das Package "de.meinname.meinprodukt.meinpackage" mit der Datei "settings.txt" drinne hättest dann wäre der Parameter für getResourceAsStream "de/meinname/meinprodukt/meinpackage/settings.txt".
 

HarryR

Mitglied
Bei mir funktioniert in der Klasse mainpackage.subpackage folgendes
Java:
java.net.URL url = getClass().getResource("/resources/test.config");
Das "resources"-Verzeichnis liegt im selben Verzeichnis wie mainpackage, d. h. "resources" und "mainpackage" haben denselben parent.

Ja, getResource() funktioniert ja bei mir auch, aber den InputStream für die Resource bekomme ich nicht hin.
 

mrBrown

Super-Moderator
Mitarbeiter
Dann öffne doch den Stream mal direkt über die URL, dann bekommst du die Exception mit, die möglicherweise fliegt
 

HarryR

Mitglied
Der Hammer, ich glaube wir wären nie drauf gekommen.
Die Lösung ist sowas von .. crazy.

Erst mal, die Lösung von RalleYTN ist korrekt,
so habe ich es auch die ganze Zeit probiert, es hat aber nie funktioniert.


Ich habe eben folgendes gemacht (im Output sind ein paar Debugzeilen):
Java:
c:\tmp\!!!!>java -jar mein.jar
classpath=mein.jar
Resourcepath: jar:file:/C:/tmp/!!!!/mein.jar!/PACKAGENAME/settings.txt
TYP: JAR
stream: null

Man sieht es gibt keinen Stream (null-Pointer)

Dann wollte ich euch den Stand der Dinge zusenden , fand aber
den Namen meines Testverzeichnis doof und habe daher in einem anderem Verzeichnis getestet
Also :

Java:
c:\tmp\!!!!>cd ..
c:\tmp>cd pzd
c:\tmp\pzd>java -jar mein.jar
classpath=mein.jar
mein.jar
Resourcepath: jar:file:/C:/tmp/pzd/mein.jar!/PACKAGENAME/settings.txt
TYP: JAR
stream: sun.net.[URL='http://www.protocol.jar.JarURLConnection$JarURLInputStream@27c170f0']www.protocol.jar.JarURLConnection$JarURLInputStream@27c170f0[/URL]

Voila, stream ist da (!= null), funktioniert also.
Wo liegt das Problem ?
Im Verzeichnisnamen "!!!!".

getResourceAsStream() scheint wenn es die Resource sucht
intern getResource() zu verwenden, der Resourcenpfad ist aber in meinem Fall
Java:
jar:file:/C:/tmp/!!!!/mein.jar!/PACKAGENAME/settings.txt

Da findet sich weit vorne wohl der Delimiter "!",
der den Beginn des Pfades IM Jar-File anzeigen sollte,
aber hier schon im Pfad zum JAR-File auftaucht.
So wird natürlich die Resource nicht gefunden.

Ob ich das als Fehler in der Implementierung bezeichnen kann ?!
Auf jeden Fall wäre es evtl. besser die Suche nach dem Delimiter von hinten zu beginnen,
das wird abner scheitern, wenn der Packagename oder die Resource ein "!" enthält.

So, danke für die Hilfe.

Grüßle
Harry
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
Das ist ein bekannter Bug, der leider vermutlich nie gefixt wird, weil dann alles mögliche Brechen würde :/
 

pcfreak9000

Mitglied
Der Hammer, ich glaube wir wären nie drauf gekommen.
Die Lösung ist sowas von .. crazy.

Erst mal, die Lösung von RalleYTN ist korrekt,
so habe ich es auch die ganze Zeit probiert, es hat aber nie funktioniert.


Ich habe eben folgendes gemacht (im Output sind ein paar Debugzeilen):
Java:
c:\tmp\!!!!>java -jar mein.jar
classpath=mein.jar
Resourcepath: jar:file:/C:/tmp/!!!!/mein.jar!/PACKAGENAME/settings.txt
TYP: JAR
stream: null

Man sieht es gibt keinen Stream (null-Pointer)

Dann wollte ich euch den Stand der Dinge zusenden , fand aber
den Namen meines Testverzeichnis doof und habe daher in einem anderem Verzeichnis getestet
Also :

Java:
c:\tmp\!!!!>cd ..
c:\tmp>cd pzd
c:\tmp\pzd>java -jar mein.jar
classpath=mein.jar
mein.jar
Resourcepath: jar:file:/C:/tmp/pzd/mein.jar!/PACKAGENAME/settings.txt
TYP: JAR
stream: sun.net.[URL='http://www.protocol.jar.JarURLConnection$JarURLInputStream@27c170f0']www.protocol.jar.JarURLConnection$JarURLInputStream@27c170f0[/URL]

Voila, stream ist da (!= null), funktioniert also.
Wo liegt das Problem ?
Im Verzeichnisnamen "!!!!".

getResourceAsStream() scheint wenn es die Resource sucht
intern getResource() zu verwenden, der Resourcenpfad ist aber in meinem Fall
Java:
jar:file:/C:/tmp/!!!!/mein.jar!/PACKAGENAME/settings.txt

Da findet sich weit vorne wohl der Delimiter "!",
der den Beginn des Pfades IM Jar-File anzeigen sollte,
aber hier schon im Pfad zum JAR-File auftaucht.
So wird natürlich die Resource nicht gefunden.

Ob ich das als Fehler in der Implementierung bezeichnen kann ?!
Auf jeden Fall wäre es evtl. besser die Suche nach dem Delimiter von hinten zu beginnen,
das wird abner scheitern, wenn der Packagename oder die Resource ein "!" enthält.

So, danke für die Hilfe.

Grüßle
Harry

ich dachte Windoof verbietet spezielle Sonderzeichen (auch !) in Datei- und Ordnernamen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
L Seite einer Partner Website neu laden Allgemeine Java-Themen 1
RalleYTN Audiolänge einer MP3 Datei erhalten ohne diese vollständig zu laden Allgemeine Java-Themen 15
V Input/Output Gif Bilder Animiert aus einer Jar laden Allgemeine Java-Themen 4
G StackoverflowError beim laden einer FXMML Datei Allgemeine Java-Themen 1
Apo JNI-Problem beim erneuten Laden einer dll Allgemeine Java-Themen 28
reibi Klassenpfad mal anders - dynamisches Laden einer Klasse Allgemeine Java-Themen 7
D Verschiedene Datein aus einer Zip Datei ins Programm laden Allgemeine Java-Themen 4
N ClassLoader - Laden von Bytecode aus einer Datenbank Allgemeine Java-Themen 6
D Exception beim Laden einer 32bit DLL ! Allgemeine Java-Themen 2
M Beim Laden einer Klasse implizit weitere Klassen mitladen Allgemeine Java-Themen 3
O Maven ein externes jar laden ohne die Applikation neu zu kompilieren Allgemeine Java-Themen 4
F Laden von bestimmten Daten aus TAR Archiv Allgemeine Java-Themen 23
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
Tobero .jar Dateine aus einem Ordner laden (Java 16) Allgemeine Java-Themen 5
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
C Wav-Datei aus Jar laden? Allgemeine Java-Themen 11
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
F Arraylist vollständig abspeichern und laden Allgemeine Java-Themen 1
I Laden von Informationen aus Dateien: Austauschbarkeit: 2 Dateien sinnvoll? Allgemeine Java-Themen 2
B Von String zu <Objekt> ||Speichern/Laden Allgemeine Java-Themen 17
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
X Klassen aus jar in jar Laden Allgemeine Java-Themen 1
X Mehrere booleans in Datei Speichern, Updaten und Laden Allgemeine Java-Themen 1
L Mapdaten laden Allgemeine Java-Themen 10
B Aktuellen Sourcecode aus Browser laden Allgemeine Java-Themen 43
HoloYoitsu Kann .dll nur aus Eclipse heraus laden Allgemeine Java-Themen 7
F Teil eines Bildes laden Allgemeine Java-Themen 1
L JavaFX JavafX externe FXML laden? Allgemeine Java-Themen 4
M Eine Datei im Speicher erneut laden(?) Allgemeine Java-Themen 1
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Allgemeine Java-Themen 3
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
V Input/Output Sound Dateien aus Jar laden Allgemeine Java-Themen 18
V Input/Output Swing Icons in Jar Archiv laden Allgemeine Java-Themen 10
C BufferedImages in Jar laden. Allgemeine Java-Themen 1
Developer_X Input/Output Serialisiertes Objekt speichern und laden Allgemeine Java-Themen 1
J Arraylist speichern und laden? Allgemeine Java-Themen 5
S Applet in html laden; InvocationTargetException,.. nur warum ? Allgemeine Java-Themen 0
M Klassen Klasse Dynamisch laden und Konstruktor aufrufen Allgemeine Java-Themen 1
A Anderes Fenster neu laden Allgemeine Java-Themen 16
N Daten aus Jar laden Allgemeine Java-Themen 10
N Klasse via ClassLoader laden Allgemeine Java-Themen 2
antonbracke Aus Jar eine Class laden und damit arbeiten! Allgemeine Java-Themen 5
K Input/Output Daten speichern / laden Allgemeine Java-Themen 2
A Class Datei aus Verzeichnis über URLClassLoader laden Allgemeine Java-Themen 2
A mit getClassLoader Bild laden Allgemeine Java-Themen 8
S Speichern/Laden/Hinzufügen/Löschen der Array-Wörter; unerwartete Ausgabe Allgemeine Java-Themen 6
G Native Library / Fehler beim Laden der .so/.dll Datei Allgemeine Java-Themen 17
antonbracke Klassen Klassen gegenseitig laden Allgemeine Java-Themen 4
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3
T Java Klassen aus externer .jar laden und ausführen Allgemeine Java-Themen 3
P Textdatei aus Ressourcen laden. Allgemeine Java-Themen 8
R Java Array speichern & laden Allgemeine Java-Themen 23
N Input/Output Bild von WebSite laden? Allgemeine Java-Themen 3
G Interface Laden der Konfiguration über Interfaces sinnvoll? Allgemeine Java-Themen 28
Z Bilder aus JAR laden Allgemeine Java-Themen 2
D Ressourcen(config) laden Allgemeine Java-Themen 11
J Laden von JAR Files geht ohne ADMIN Rechte sehr langsam Allgemeine Java-Themen 6
S IMAGE ARRAY laden Allgemeine Java-Themen 6
J Methoden Fehler beim serialisieren und laden!? help Allgemeine Java-Themen 4
Grejak 2D-Grafik Resourcen laden Allgemeine Java-Themen 4
firefexx ResourceBundle laden Allgemeine Java-Themen 2
V Klassen in "abgeschirmten Bereich" laden? Allgemeine Java-Themen 7
I bibliotheken nur via kommandozeile laden Allgemeine Java-Themen 16
U Classpath DLLs mittels System.load() laden: Allgemeine Java-Themen 6
F Vierdimensionellen String Array speichern/laden Allgemeine Java-Themen 5
T Api in Quellcode laden Allgemeine Java-Themen 8
O Jar und Iconbild laden Allgemeine Java-Themen 19
A Problem mit Bilder laden mit sum.kern Allgemeine Java-Themen 9
F Laden von externen Bibliotheken Allgemeine Java-Themen 3
hdi Ressourcen dynamisch zur Laufzeit laden Allgemeine Java-Themen 15
P Laden von Dateien mit und ohne JavaWebStart Allgemeine Java-Themen 3
I HTML Seite laden Allgemeine Java-Themen 6
A Klassen dynamisch aus jar-datei laden Allgemeine Java-Themen 5
D Bilder aus externer .jar laden Allgemeine Java-Themen 3
reibi Files über Classpath laden Allgemeine Java-Themen 22
S Dynamisches Manipulieren/Laden von Klassen Allgemeine Java-Themen 4
M Klasse aus xyz.class Datei laden / package entfernen? Allgemeine Java-Themen 4
multiholle Resourcen aus Jar-Archiv laden Allgemeine Java-Themen 5
F Bild aus externer Quelle laden und Skalieren? Allgemeine Java-Themen 11
hdi Kann Substance LAF nicht laden Allgemeine Java-Themen 3
T Eclipse Dateien einzeln aus einem Verzeichnis laden! Allgemeine Java-Themen 6
H Extra-Thread sinnvoll für XML-Datei laden? Allgemeine Java-Themen 4
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
SuperSeppel13 Bilder auf Anfrage laden - Threading Allgemeine Java-Themen 3
Developer_X Aus Datei in Arrays laden-Problem Allgemeine Java-Themen 5
L Applet immer wieder neu laden - Problem Allgemeine Java-Themen 25
N Klassen laden Allgemeine Java-Themen 5
Developer_X Java Applet - Font aus datei laden Allgemeine Java-Themen 15
N Speichern und laden in XML nicht via JAXB Allgemeine Java-Themen 4
F Klasse ohne voll qualifizierenden Namen laden Allgemeine Java-Themen 5
O Große Anzahl Bilder laden Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben