Daten aus Jar laden

Network

Top Contributor
Hi,

selbstverständlich gibt es dazu sehr viel über Google zu finden, aber irgendwie kriege ich es nicht hin.

Die Datenstruktur sieht so aus:
Code:
Ordner/
     Programm.jar/
          Bilder/
               [Bilder]
     Bilder/
          [Bilder]
Der Ordner mit den Bildern ist also sowohl in der Jar als auch nochmals außerhalb dieser.

Nun versuche ich mit
Java:
URL url = this.getClass().getResource(file);
BufferedImage bfimg;
bfimg = ImageIO.read(url);
ein Bild zu laden. Es schlägt fehl, es kommt eine
IllegalArgumentException: input == null
Nach Dokumentation bedeutet das, dass URL == null ist.

Und nur um mir diese Gegenfrage zu ersparen: Das Bild existiert
Vorher habe ich die Bilder einfach aus dem Bilder Odner erfolgreich geladen mit
Java:
ImageIO.read(new File( file ));
Der Dateiname hat sich nicht geändert.

Noch eine Zusatz an Information:
this.getClass().getResource(); wird in einer Jar Datei in der eigentlichen Jar Datei aufgerufen. Ich nehme an der Fehler könnte hier liegen, da er dann in der Jar der Jar sucht (eventuell?).

Irgendwelche Lösungsvorschläge?

Vielen Dank :)
Gruß
Net
 
Zuletzt bearbeitet:
T

tröööt

Gast
schon mal was von DEBUGGING gehört ? lass dir "url" doch einfach mal mit nem sysout ausgeben anstatt hier gleich n topic aufzumachen ...
 

Network

Top Contributor
Tröööt dein "Genie" hat mal wieder zugeschlagen. Das nächste mal wenn du nichts produktives zu sagen hast, geh einfach bitte wieder.

Aber alle guten Dinge sind drei! In der Dokumentation steht das:
Nach Dokumentation bedeutet das, dass URL == null ist.
t
Im SourceCode von ImageLoader steht das
Und jetzt sogar in meinem kleinen Konsolenfenster
Code:
null

Naja ich lasse jetzt dem ImageLoader die Klasse übergeben der Datei die ein Bild anfordert.
So werden die Bilder aus dem richtigen Verzeichnis geladen.
Jetzt müssen wohl einige ihren Code updaten.
 
S

Spacerat

Gast
Die Variable "file" würd' ich zu gerne sehen... oder Moment, Glaskugel sagt: "bild.png". Müsste aber "/Bilder/bild.png", "./Bilder/bild.png" oder "Bilder/bild.png" heissen. Ressourcepfade sind klassenpfadrelativ.
[EDIT]Im übrigen ging mir dieses "URL-File-Ressource-Bläh-Ta-Taig" irgend wann auch mal dermaßen auf den... naja zumindest kam so etwas bei raus.
http://www.java-forum.org/allgemein...ve-pfade-arbeitsverzeichnisse.html#post956646[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
T

tröööt

Gast
Tröööt dein "Genie" hat mal wieder zugeschlagen. Das nächste mal wenn du nichts produktives zu sagen hast, geh einfach bitte wieder.

Aber alle guten Dinge sind drei! In der Dokumentation steht das:

Im SourceCode von ImageLoader steht das

Und jetzt sogar in meinem kleinen Konsolenfenster
Code:
null

Naja ich lasse jetzt dem ImageLoader die Klasse übergeben der Datei die ein Bild anfordert.
So werden die Bilder aus dem richtigen Verzeichnis geladen.
Jetzt müssen wohl einige ihren Code updaten.

gut ... und was macht man wenn man weis das die exception bedeutet das der parameter NULL ist ?

normalerweise würde man jetzt anfangen zu gucken WARUM der parameter NULL ist ... was auch unter den "debugging" fällt ...

und da du ja so verbissen auf die DOC bist hier die antwort
Returns:A URL object or null if no resource with this name is found
ergo : es wurde keine resource mit dem übergebenen namen gefunden ...
also lässt man sich den parameter von getResource() mal mit sysout ausgeben und prüft ob dieser richtig ist ...

wie Spacerat schon sagte sucht ClassLoader.getResource() an die Class.getResource() delegiert relativ zur klasse ...

wenn die klasse also im JAR unter "/Klasse.class" zu finden ist und man nur "bild.png" übergibt sucht der CL nach "/bild.png" ... was bei dir aber falsch wäre ... du müsstest stattdessen "/Bilder/bild.png" übergeben ...
ist zwar absolut zum jar-root ... und hier würde auch relativ "Bilder/bild.png" reichen ... aber es empfiehlt sich immer zum jar-root absolut anzugeben wenn man sich nicht ganz sicher ist wo nachher was landet ...
 

Network

Top Contributor
Vielen Dank erstmal, jetzt kommt das ins Rollen und verstehe warum das Thema so eklig ist.
"Weil es zu oft gefragt wird".
Das dachte ich mir schon ein bisschen nach meiner rumgoogelei. Scheint ja auch eins der ersten Dinge zu sein die sich Anfänger allgemein aneignen.

Habe versucht dem immer aus dem Weg zu gehen und die Bilder in einem extra Ordner zu lagern, aber manch einer mag das anscheinend nicht, weshalb ich dazu angehalten wurde genau das zu verändern.

Das Problem ist wie gesagt, dass die Bilder/Daten ladende Klasse eigentlich nochmals selbst als Library in der Jar liegt. Entweder das oder ich übersehe das einfachste.
Deshalb meine Frage ob jemand weiss was man in diesem Falle coden muss.
Umgedreht funktioniert es genauso nicht, also wenn sich die Bilder in einer jar der jar befinden, und die ladende Klasse nur in der Jar, wobei man hier einfach den erweiterten Pfad angibt.
Es funktioniert aber wenn ich von einer Klasse getClass() aufrufe die sich in der selben Jar aufhält - logischerweise.

Das ist natürlich ärgerlich, ich habe den SourceCode durchforstet um nach einer "Lücke"/Workaround zu suchen, aber nichts gefunden bis jetzt.

Und zum Abschluss: Werde ich jetzt 2 Codes zeigen mit folgender komplettierter Datenstruktur:
Code:
Ordner/
     Programm.jar/
          Engine.jar    // Lädt die Bilddatei
          Bilder/
               [Bilder]
     Bilder/
          [Bilder]

Code 1 - IllegalArgumentException
Java:
String file = "Bilder/TestBild.png";
URL url = this.getClass().getResource(file);
BufferedImage bfimg;

System.out.println( url ); // -> null
bfimg = ImageIO.read(url);
System.out.println( "Image loaded" ); // [not called]

Code 2
Java:
String file = "Bilder/TestBild.png";
File f = new File(file);
BufferedImage bfimg;

System.out.println( f.exists() ); // -> true
bfimg = ImageIO.read(f);
System.out.println( "Image loaded" ); // -> Image loaded

Vielen Dank :)
Gruß
Net

PS: Was mich auch wundert: Ich dachte (so hatte ich es gelesen) wenn getResource() nichts findet, wird der Ordner indem sich die Jar befindet danach durchsucht.

[EDIT]
Und danke für den "/"-Unterschied. Wusste nicht dass das ein Unterschied macht, hatte es zwar gelesen wobei eher "überlesen". Wird mir in Zukunft sicherlich von Nützen sein. In diesem Fall glaube ich nicht, bin auf Nummer Sicher gegangen und habe die Pfade entsprechend angepasst.
[/EDIT]
 
Zuletzt bearbeitet:
T

tröööt

Gast
das sind solche dinge wo ich am liebsten einfach nur hierauf verweisen würde : http://www.java-forum.org/forum-faq-beitraege/7407-man-fragen-richtig-stellt.html

solche wichtigen dinge ... wie eben das man JAR-IN-JAR verwendet ... werden leider von den meisten anfängern verschwiegen ... entweder weil sie denken das es daran nicht liegen kann oder weil sie nicht wissen das es mit sowas probleme gibt ..

grundsätzlich gilt : JAR-IN-JAR erfordert spezielle ClassLoader-implementierungen ...
es gibt zwar entsprechende tools im netz ... und IDEs können auch sog. "FAT-JARs" bauen ... also alles aus den source-JARs extrahieren und zu einem großen kompletten JAR wieder zusammen setzen ...
es ist halt ein etwas anspruchvolleres thema und längst nicht so banal wie man denkt ... auch weit fortgeschrittene java-entwickler haben damit immer mal wieder so ihre probleme wenn sie sich mit sowas noch nicht beschäftigt haben ...

als einfach lösung würde ich also ein "FAT-JAR" vorschlagen ... also das nachher am ende ALLE dateien in einer einzigen JAR liegen ... ohne das die JAR selbst noch weitere JARs enthält ... deine IDE sollte das auf die reihe bekommen (so fern du denn eine nutzt) ...

eine weitere möglichkeit wäre wenn man die JARs nicht alle in einem JAR zusammenpackt ... sondern sie ins FileSystem neben das main-JAR legt ... also das es dann z.b. so aussieht
Code:
/dir
/dir/main.jar
/dir/support.jar
/dir/lib.jar
/dir/resource.jar
und dann im manifest den parameter "Class-Path" richtig setzt ...
natürlich kann man bei dieser variante die zusatz-JARs noch in einem unterordner organisieren ...

die letzte "einfache" möglichkeit wäre vor dem laden halt die JARs in TEMP zu extrahieren und dann im FileSystem auf diese zuzugreifen ... das würde dann mit nem URLClassLoader gehen

die wirkliche "königsdiziplin" wäre dann am ende ein "JarInJarClassLoader" der es halt ermöglicht beliebig rekursiv durch die in der aktuellen JAR enthalten JARs geht und resourcen laden kann ... sowie von anfragen von "tieferen ebenen" nach resourcen die in "höheren ebene" liegen beantworten und laden kann ...
stichwort dazu wie schon gesagt : jar-in-jar classloader ...

natürlich muss dann der code entsprechend angepasst werden ... und funktioniert auch nur mit libs die sowas unterstützen ...
 

Network

Top Contributor
Ah okay vielen Dank.

Also das "Jar in Jar" steht bereits ganz oben in meiner Anfangsfrage.
Hatte sogar darauf hingewiesen, dass ich denke, dass es sich hierbei um den Fehler handelt.
Google liefert mir dafür aber nur Müll (Ich weisse darauf hin, dass die Googlesuche an die einzelnen Benutzer angepasst ist).

Eclipse bietet zwar ein "Extract requierd libraries into generated JAR" an, das ist aber leider in diesem Fall nicht möglich. Lizenzierungen n stuff.
Aber vielen Dank. Jetzt weiss ich auf jedenfall, dass es nicht so einfach ist.

Das macht es geistig schon ein bisschen einfacher und klarer :)
Dann habe ich ja eigentlich auch gute Argumente, dass beim laden von Daten die Klasse mit angegeben werden muss. Wenn es ohne größeren Aufwand nicht anderst geht. :)

Vielen Dank
Gruß
Net

PS: Ich entschuldige mich für den rauen Ton von mir, Tröööt. Hatte mich eine Minute vorher mit einem Kollegen herumgeschlagen - eine gute halbe Stunde - der so absolut nervtötend abweisend war im Sinne von "Oh sorry, what was the matter again?" das ich ein bisschen am Rande der Verzweiflung in dem Moment war. Jetzt sind meine Nerven wieder beieinander. :D
 
S

Spacerat

Gast
Jetzt sind meine Nerven wieder beieinander. :D
Du Glücklicher...
Die wahre Königsdisziplin bringt mich grad' an den Rand der Verzweiflung - beliebige Daten aus beliebiger Quelle (inkl. Jar-In-Jar) standardtisiert laden. Nix da mit File hier, String dort, URL anderswo und InputStream LMAA... Eine einzige statische Anweisung soll's werden.
Ich muss das endlich auf die Reihe kriegen. Das Projekt entpuppt sich aber anscheinend als Lebensaufgabe.
 
T

tröööt

Gast
@TO
ja .. ich habs auch noch gelesen ... aber irgendwie völlig verpeilt ... mein fehler ... passiert jedem mal ..

wenn es wegen lizenzen nicht ein fat-jar zu bauen solltest du auf jeden fall die variante nutzen nur deine klassen im jar zu haben ... alle abhängigkeiten solltest du in einen ordner "lib" packen der im selben ordner wie dein jar liegt und darin alle anderes jars ablegen ...

ich weis jetzt nicht aus dem stehgreif ob man so im manifest nur "lib" als ordner angeben muss oder jedes einzelne jar ... letzteres würde ich aber empfehlen ...

@Spacerat
wäre schön wenn du dazu mal an passender stelle im forum n thread auf machst und dort mal den code postest ... wäre nämlich sehr interessant und würde gerne mit dran arbeiten ...
 
S

Spacerat

Gast
@Spacerat
wäre schön wenn du dazu mal an passender stelle im forum n thread auf machst und dort mal den code postest ... wäre nämlich sehr interessant und würde gerne mit dran arbeiten ...
Schon oft geschehen... datatypeslibrary - reading first come along files with only one instruction - Google Project Hosting
Einfach mal nach suchen.
z.B.
http://www.java-forum.org/spiele-mu...886-vorstellung-hotsound-meinung-gefragt.html
http://www.java-forum.org/awt-swing-javafx-swt/145047-gif-macht-mir-probleme.html
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Laden von bestimmten Daten aus TAR Archiv Allgemeine Java-Themen 23
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
K Input/Output Daten speichern / laden Allgemeine Java-Themen 2
D GPS-Daten aus GUI in GoogleEarth laden Allgemeine Java-Themen 8
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
padde479 Collections Daten in Dreiecksform Allgemeine Java-Themen 13
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
A Hartgecodete Daten auslagern Allgemeine Java-Themen 4
S Webservices für binäre Daten? Allgemeine Java-Themen 5
OnDemand Daten in RAM zwischenspeichern oder lieber aus DB holen? Allgemeine Java-Themen 24
J Daten über serielle Schnittstelle empfangen Allgemeine Java-Themen 4
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
S Entities aus XML - Daten. Allgemeine Java-Themen 1
M Schnelleres Speichern von XML-Daten über URLConnection Allgemeine Java-Themen 4
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
C Daten für Klassifikationsverfahren gewinnen Allgemeine Java-Themen 6
J Daten von Quelltext Allgemeine Java-Themen 5
K OOP Daten addieren sich bei GUI-Eingabe Allgemeine Java-Themen 10
J Jasper Reports - Daten vom Hoster Allgemeine Java-Themen 2
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
J Millisekunde zwischen 2 Daten Allgemeine Java-Themen 6
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
J Daten aus Website-Quelltext auslesen Allgemeine Java-Themen 62
R Android Daten online senden Allgemeine Java-Themen 0
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
K Gespeicherte Daten von einer LinkedList auf vier LinkedList verteilen Allgemeine Java-Themen 6
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
K Datei (CSV-ähnlich) in Java einlesen & mit teil der Daten Graphen erstellen Allgemeine Java-Themen 9
A Erste Schritte Daten aus einer Website auslesen Allgemeine Java-Themen 7
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
S Erste Schritte Fehlender Gedanken-Ansatz bei Interpretation von Daten Allgemeine Java-Themen 1
J Auslesen Daten Java/HTML Allgemeine Java-Themen 15
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
A Swing FileWriter schreibt keine Daten in Datei Allgemeine Java-Themen 13
M Daten aus anderen Programmen auslesen Allgemeine Java-Themen 2
D Best Practice Login-Daten: Wie am besten abrufen? Allgemeine Java-Themen 6
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
J Serial Port Daten empfangen Allgemeine Java-Themen 5
H Daten via COM Schnittstelle erhalten Allgemeine Java-Themen 2
J Daten persistent speichern Allgemeine Java-Themen 14
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
G Daten aus Website auslesen Allgemeine Java-Themen 7
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
O Serial Port Daten als Tastaturanschlag senden Allgemeine Java-Themen 0
N Zeitabstand zwischen 2 Daten(Mehrzahl von Datum) Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
Z daten bindung Allgemeine Java-Themen 1
A Datentypen Gregorian Calendar - 2 Daten sind gleich?? Allgemeine Java-Themen 3
L Vergleich-Xml-Daten Allgemeine Java-Themen 3
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
A Daten in Formularen/Vorlagen erstellen und ausdrucken Allgemeine Java-Themen 3
C HtmlUnit Daten einer Tabelle bekommen ohne, dass diese eine ID aufweist Allgemeine Java-Themen 1
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
Todesbote Excel Blattschutz aufheben und Daten einfügen Allgemeine Java-Themen 3
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
OnDemand PC identifizieren / Daten auslesen Allgemeine Java-Themen 15
G Combobox füllen mit daten aus einer Tabelle Allgemeine Java-Themen 4
J Maven .war enthält veraltete Daten Allgemeine Java-Themen 3
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
M Best Practice: Daten aufnehmen-speichern-bereitstellen Allgemeine Java-Themen 8
T Daten effizient verwalten Allgemeine Java-Themen 4
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
C Daten über URL an PHP verschicken Allgemeine Java-Themen 4
R Daten aus DB auslesen in ein formular (JSP) Allgemeine Java-Themen 13
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
H OOP Daten über TCP Allgemeine Java-Themen 5
H Input/Output Binäre Daten konvertieren, Output hat Zeilenumbrüche?? Allgemeine Java-Themen 9
D Daten eines User auslesen. Allgemeine Java-Themen 5
B Input/Output Einbinden von Daten in Java Allgemeine Java-Themen 3
L Einbinden von Daten in ausführbare Jar Allgemeine Java-Themen 6
N Methoden Einzelne Daten aus "Person" auslesen Allgemeine Java-Themen 3
R SerialPort auslesen und Daten verarbeiten Allgemeine Java-Themen 23
ARadauer Wo liegen die Daten der Preferences Klasse Allgemeine Java-Themen 3
Madlip Erste Schritte Java speichert Daten im Programm?!? Allgemeine Java-Themen 9
S JDialog Daten ins JFrame übergeben Allgemeine Java-Themen 5
F Threads synchronisierung des Zugriffes auf daten Allgemeine Java-Themen 4
O Amazon S3 Anmelden / Daten downloaden Allgemeine Java-Themen 2
A Daten aufbereiten Allgemeine Java-Themen 11
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
L Speichern von Daten in JKS Allgemeine Java-Themen 5
K JFreeCharts - Dummy für fehlende Daten Allgemeine Java-Themen 6
M Daten aus doc, pdf .... auslesen Allgemeine Java-Themen 12
Z Daten von einer Klasse in eine andere übertragen Allgemeine Java-Themen 8
A Login-Daten Formular automatisch ausfüllen Allgemeine Java-Themen 10
C Daten speichern und verwalten Allgemeine Java-Themen 3
Z Daten aus einer Internetseite auslesen? Allgemeine Java-Themen 2
E BlueJ Daten in Textdatei schreiben Allgemeine Java-Themen 21
T Gleichzeitige Zugriffe auf Daten auf dem Server Allgemeine Java-Themen 11
ruutaiokwu META-INF-daten bei ungepackten library-projekten während der entwicklung mit einbeziehen...? Allgemeine Java-Themen 2
K Server Daten Visualisieren Allgemeine Java-Themen 3
F HashMap überschreibt Daten von anderen HashMap Allgemeine Java-Themen 5
A Java Projekt (Daten Eingeben, Speichern und in Listen Ausgeben) Allgemeine Java-Themen 6
L Sicherstellen das 2x die gleichen Daten unter bestimmten Keys enthalten sind. Allgemeine Java-Themen 6
A XML-Daten komprimieren Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben