Projektstruktur & nicht-geladene Bilder im .jar file

kaffee_trinken

Grünschnabel
Hallo allseits,

ich habe ein Problem, mit dem ich mich schon intensiv einige Tage herumärgere, was ich allerdings im Moment nicht gelöst bekomme. Primär geht es darum, das Graphiken die in eine Komponente eines JFrames geladen werden in der Eclipse Umgebung funktionieren, nicht allerdings exportiert als .jar file. Ich denke das das Problem in meiner (konfusen?) Projektstruktur liegt... Vielleicht kann mir ja jemand helfen.

Gegeben:
----------------
Eclipse
Projekt proj
| ---SourceFolder src
|------- package aa
|----- xyz.java
|------- package res
|--- equationNONE.JPG
|--- Folder resource
|--- equationNONE.JPG
|--- Folder libs

Problem:
-------------
In einer Klasse xyz.java im Package aa versuche ich ein Bild zu laden durch:

String sPath2Jpg= "/res/equationNONE.JPG";
java.net.URL url = ClassLoader.getSystemResource( sPath2Jpg);
//System.out.println(url);

File fi = null;
try {
fi = new File (url.toURI());
} catch (URISyntaxException e) {
e.printStackTrace();
System.out.println("ohje");
}
viewComponentSettingsFrameDrawEquationUnit1.setImage( fi );

Nehme ich String sPath2Jpg= "res/equationNONE.JPG"; dann wird das Bild in der Eclipse Umgebung ganz wunderbar geladen, nicht aber beim .jarExport.
Nehme ich eines hiervon:
String sPath2Jpg= "/resource/equationNONE.JPG";
String sPath2Jpg= "/resource/equationNONE.JPG";
String sPath2Jpg= "/resource/equationNONE.JPG";
String sPath2Jpg= "/resource/equationNONE.JPG";
String sPath2Jpg= "/resource/equationNONE.JPG";
String sPath2Jpg= "/resource/equationNONE.JPG";
wird das Bild weder in eclipse noch im .jar angezeigt...

Eigentlich hätte ich ja gerne alle Bilder im Verzeichnis resources, aber dann klappt es mit der URL nichtmals in eclipse (bei alle wo es nicht klappt null pointer exception). Ohne URL, also mit absoluten Pfaden klappt natürlich in eclipse Umgebung noch (file= "resources/equationNONE.jpg";) - bringt aber nix für's jar file.

Vielleicht hat das ganze ja auch etwas mit den exporteinstellungen zu tun, oder mit der verzeichnisstruktur des jar-files das erzeugt wird:
bla.jar
|--- lib
|--- META-INF
|--- res
|--- resources
|--- src
|--- aa

erstaunlicherweise steht das package bb auch nicht im jar file in scr sondern eine ebene höher :mad:

projekt properties sind übrigens:
Java Build Path:
proj/src
Default output folder:
proj/bin

Ich bin jedenfalls verwirrt. Vielleicht kann jemand etwas aufklären. Ich wäre jedenfalls sehr dankbar.

Grüße.. Rene
 
Meine schönen ascii Folders wurden nicht übernommen :rolleyes:

Gegeben:
----------------
Eclipse
Projekt proj
| ---SourceFolder src​
|------- package aa​
|----- xyz.java​
|------- package res​
- equationNONE.JPG​
| ---Folder resource​
-equationNONE.JPG​
| ---Folder libs​



verzeichnisstruktur des jar-files:
bla.jar
|--- lib
|--- META-INF
|--- res
|--- resources
|--- src
|--- aa​
 
Hi,

ein direkter Zugriff auf dein Bild im JAR ist so nicht möglich!

Du brauchsteinen ClassLoader, der quasi ins x.jar reinschauen kann:

Code:
ClassLoader cl = XClass.class.getClassLoader();

Jetzt kannst du auf deine Resourcen zugreifen, (angenommen sie liegen in der Jar unter res/!)

Code:
String picPath = "res/bild.gif";

Der Zugriff erfolgt wie folgt:

Code:
java.net.URL url = cl.getResource( picPath );

Et voilá, du solltest eine URL bekommen. Hoffe es hilft.
 
Also ich würde in das Package res noch eine kleine Java-Klasse ResourceLoader packen mit der du die resourcen laden kannst.

In der ResourceLoader kannst du mit this.getClass().getResourceAsStream(String name); auf die Resourcen zugreifen die im selben package liegen.

Das sollte in eclipse in jedem Fall funktionieren da eclipse die Resourcen mit zu den classfiles kopiert.

Wenn das ganze im jar nicht funktioniert dann liegt es eventuell daran dass die Resourcen nicht mit im jar liegen. Guck mal in das jar rein mit WinZip oder so und schau ob in dem Package die Bilder drinliegen wie sie sollten.
 
Ich habe es nun wie von euch beschrieben:


ClassLoader cl = Gui.class.getClassLoader();
String picPath = "res/equationNONE.JPG";
java.net.URL url = cl.getResource( picPath );
// path anschauen...
System.out.println("CL:"+url);
jLabelSettingsFrameGeneralOptions.setText(url.toString());



File fi=null;
try {
fi = new File (url.toURI());
} catch (URISyntaxException e) {
e.printStackTrace();
}


viewComponentSettingsFrameDrawEquationUnit1.setImage( fi );
viewComponentSettingsFrameDrawEquationUnit1.setVisible(true);



--> Bilder in Eclipse werden angezeigt
--> Bilder in ausgeführtem Jar werden nicht angezeigt
--> der relative Pfad, den ich mir in einem label anzeigen lasse lautet in eclipse:
file:/C:/Documents%20and%20Settings/Admin/workspace/GUI/bin/res/equationNONE.JPG
--> der relative pfad wenn ich das jar starte und die bilder nicht angezeigt werden:
jar:file:/C:/Documents%20and%20Settings/Admin/Desktop/test.jar!/res/equationNONE.JPG

(Die Bilder sind übrigens alle im jar File unter /res vorhanden)

Hat jemand noch eine Idee ?
 
Ja machs so wie ich das beschrieben habe.

Wenn du den normalen ClassLoader nimmst kann erst ja nicht finden weil du dann den kompletten package pfad angeben müsstest.
 
Hi,

dein: this.getClass().getResourceAsStream(String str);

kann doch auch in meiner Klasse stehe oder? er muss doch nicht zwingend in einer ResourceLoader stehen oder?

Und kannst du etwas detallierter angeben, wie wende ich das anwende? Ist das eingabeargument String str eine URL.toString() ? und was bekomme ich da überhaupt für einen rückgabewert? Wie baue ich also dein Codefragment bei mir ein ?
 
Zurück