# (Eclipse) .jar File erstellen



## Ci (11. Jul 2011)

Hallo,

unter eclipse möchte ich ein .jar File erstellen. 
Mit *Export* erscheint ein Fenster in dem ich *Runnable JAR file* auswählen kann und mit *Next...* auf die nächste Seite komme! 
Dort wähle ich nun im Feld _Launch configuration:_ das Projekt, dass ich in JAR haben will und gebe im Feld _Export destination:_ einen Ort an mit dem Namen des Projektes.jar 

dann hab ich noch die Möglichkeit eine Option auszuwählen.
Da hab ich mich für _Extract required libraries into generated JAR_ entschieden.

Mein JAR file wird auch ordnungsgemäß erstellt, nur wenn ich es auf einem anderen Rechner starte, dann werden meine Icons, die ich in meiner Oberfläche implementiert habe, nicht erkannt. Es erscheinen also keine Bilder auf meiner GUI!!!

Hab ich nun etwas beim erstellen meiner JAR falsch gemacht?

gruß


----------



## MiDniGG (11. Jul 2011)

Das mit der JAR-Erstellung klingt ganz gut so weit.

Hast Du evtl. statische Pfade für die Bilder genommen?

Wie bindest Du diese ein?

Wo liegen sie?


----------



## Tente (11. Jul 2011)

Hast du die Bilder in einen zusätzlichen Ordner deines Projekts gepackt und der Ordner ist ein Source-Folder? Eclipse würde dann beim Kompilieren feststellen, dass es einer ist und ihn in den Class-Path packen.

Beim JAR erstellen, muss dieser dann manuell in den Class-Path der manifest-Datei im Jar stehen, zB.

Class-Path: images/


----------



## faetzminator (11. Jul 2011)

Das Jar hast du schon richtig erstellt. Die Resourcen müssen einfach mit [c]Class.getResource()[/c] statt [c]new File()[/c] geladen werden.


Ci hat gesagt.:


> Da hab ich mich für _Extract required libraries into generated JAR_ entschieden.


Da würde ich aber lieber die Libs extern mitgeben.


----------



## Gast2 (11. Jul 2011)

Hier ein paar Threads die dein Problem auskömmlich behandeln: 

http://www.java-forum.org/java-basics-anfaenger-themen/116911-bilder-jar-datei-laden.html?highlight=Bilder+Jar+laden
http://www.java-forum.org/java-basics-anfaenger-themen/115664-bild-resource-runnable-jar.html?highlight=Bilder+Jar+laden
http://www.java-forum.org/awt-swing-swt/98685-image-jar-einbauen.html?highlight=Bilder+Jar+laden
http://www.java-forum.org/ides-tools/109445-grafik-mitgeladen.html?highlight=Bilder+Jar+laden
http://www.java-forum.org/java-basics-anfaenger-themen/97063-resourcen.html?highlight=Bilder+Jar+laden
http://www.java-forum.org/awt-swing-swt/76795-images-jar-datei-laden.html?highlight=Bilder+Jar+laden

Und der Oberhammer: 
http://www.java-forum.org/spiele-multimedia-programmierung/86159-jar-erstellen.html?highlight=Bilder+Jar+laden

Sorry aber ich unterstelle dir mal, dass du die Forumssuche nicht bemüht hast... 
Hat mich ca. 1 Minute gekostet. Vor allem einen Thread zu finden der EXAKT deinen Titel hat, auch wenn der verfehlt war. Such das nächste mal bevor du fragst.

EDIT: Sorry doch nicht Exakt. Du hast kein * im Thread Titel ...


----------



## Ci (11. Jul 2011)

Beispiel für eines meiner Pfade sieht so aus:


```
toggleButtonBild1.setIcon(new ImageIcon("C:\\Dokumente und Einstellungen\\xyz\\workspace\\Projektxyz\\img\\Bild1.png"));
```

wie schon zu erkennen ist, habe ich in meinem Ordner zusätlich zu den vorhandenen Ordnern: *bin, src* und * .settings* einen weiteren Ordner *img* angelegt und die ganzen Bilder da hineingepackt!

@Tante: 





> Beim JAR erstellen, muss dieser dann manuell in den Class-Path der manifest-Datei im Jar stehen, zB.
> Class-Path: images/



...verstehe ich leider nicht ganz 

@faetzminator: 





> Da würde ich aber lieber die Libs extern mitgeben.



...wie kann ich das machen?
Ich hab ja die Auswahl zwischen Extract required..., Package required... und Copy required...
welche Auswahl soll ich da nehmen?

gruß


----------



## diggaa1984 (11. Jul 2011)

bezüglich der Bilder solltest du diese wie folgt laden .. ich habe dazu einen "resources" - Ordner direkt im src-Ordner des Projektes erstellt und in ihm die Bilder abgelegt. Geladen werden sie dann wie folgt:


```
Icon icon = new ImageIcon(getClass().getResource("/resources/addGrammar.png"));
```


----------



## Gast2 (11. Jul 2011)

Also seid mir nicht böse aber ich helfe persönlich nicht mehr wenn der Themenstarter zu faul ist die 6 Links auch nur mal anzugucken die ich gepostet habe. 

Da ist der selbe Sachverhalt x-mal durchgekaut. Hätte er sich das mal angeschaut wäre alles klar. Und falls nicht kann man DANN ja nochmal nachfragen. 

Aber so...


----------



## faetzminator (11. Jul 2011)

Ci hat gesagt.:


> Ich hab ja die Auswahl zwischen Extract required..., Package required... und Copy required...
> welche Auswahl soll ich da nehmen?



Öhm, ich würde mal auf "copy required" tippen, die Jars musst du dann einfach im Ordner zusammen mit deinem Jar ausliefern (oder irgendwo sonst, den CP / das Manifest anpassen). Da hast du zwei Vorteile: erstens hast du nicht eine riiiesige Datei und zweitens kann bei einem Bug in einer Fremdlib einfach diese ersetzt werden, ohne dass du deine ganze Software neu ausliefern musst.


----------



## Ci (11. Jul 2011)

@kappesf:

hab erst einmal versucht die offenen Fragen von den anderen zu beantworten. Zu deinen Links: bin jetzt alle durch, nur haben die mir nicht wirklich geholfen!
Bei den meisten steht ja so was wie:


```
ImageIcon icon = new ImageIcon("images/config.png");
```

so klappt es zwar wieder unter eclipse, jedoch nachher als JAR nicht mehr.
Bin im Grunde nich weit gekommen!

dann ist noch unter dem Link hier:
http://www.java-forum.org/awt-swing-swt/76795-images-jar-datei-laden.html

das Bsp. mit:

```
URL bildURL = getClass().getClassloader().getResource("Bilder/x.gif");
```

wie kann ich das bei mir so anwenden, wenn bei mir bisher das hier drin steht?


```
toggleButtonBild1.setIcon(new ImageIcon("C:\\Dokumente und Einstellungen\\xyz\\workspace\\Projektxyz\\img\\Bild1.png"));
```

@faetzminator:


> "copy required"


hat leider auch nichts gebracht!


----------



## Gast2 (11. Jul 2011)

Ci hat gesagt.:


> @kappesf:
> 
> hab erst einmal versucht die offenen Fragen von den anderen zu beantworten. Zu deinen Links: bin jetzt alle durch, nur haben die mir nicht wirklich geholfen!
> Bei den meisten steht ja so was wie:
> ...



Ich habe meine Bilder immer in einem Resource Package im Source Path. Da wird dann der voll qualifizierte Package Name + Bild verwendet. 

Beispiel: 

bild.jpg im Package com.test.resources 

```
URL bildURL = getClass().getClassloader().getResource("com/test/resources/bild.jpg")
```

Das funktioniert dann sowohl unter Eclipse als auch im executable jar. 

Man kann sich dann natürlich auch einen eigenen Resource Loader schreiben, der den Resource Pfad selber vorhält und die Bildzuweisungen ggfls. noch über ein resource Bundle lädt (Zum Beispiel im src code nur noch Angaben wie "IconExitSmall").


----------



## Ci (11. Jul 2011)

> Ich habe meine Bilder immer in einem Resource Package im Source Path. Da wird dann der voll qualifizierte Package Name + Bild verwendet.



...wie mache ich das mit dem Resource Package im Source Path? Sorry, kenn mich nicht so gut aus!
Muss ich da im Code was machen oder Ordnerstruktur?


----------



## Gast2 (11. Jul 2011)

kappesf hat gesagt.:


> Falls du die Lösung nicht schon gefunden hast probier doch mal eine einfache Resource Loader Klasse. Da man eine solche auch nur einmal braucht ist ein Singleton sinnvoll.
> 
> Hier mal Beispielcode wie sowas aussehen kann:
> 
> ...



Hab das mal ausgegraben. 

Bilder kannst du genauso in einem Package ablegen wie die Java Dateien. Einfach ein Package resources anlegen und dort die Bilder reinpacken. Fertig. 

Den Code oben kannst du dann als Loader nutzen.


----------



## Asgar13 (11. Jul 2011)

Verstehe ich das richtig, du hast deine .jar-datei und dadrin die Bilder, diese führst du aus?

Wenn ja, wieso hast du dann einen absoluten Pfad?

Das Programm sucht bei deinen anderen Rechner nach 


```
C:\Dokumente und Einstellungen\xyz\workspace\Projektxyz\img\Bild1.png
```

und nicht nach dem Bildern in der Jar-Datei.


----------



## Ci (11. Jul 2011)

hab das jetzt so verstanden:

In meinem Projekt Ordner einen Resource Ordner erstellen, da die ganzen Bilder reinpacken.
Dann die Klasse _ResourceLoader_ erstellen, mit in die package reinpacken, wo die anderen Klassen sich auch befinden.

alle meine Bilder muss ich jetzt quasi in meinen _ResourceLoader_ Klasse implementieren, nur die Pfad Angabe, also diesen Teil:


```
URL url = getClass().getClassLoader().getResource(iconsURL + iconName);
```
oder nicht?


----------



## Michael... (11. Jul 2011)

Gehören die Bilder zum Projekt und werden Sie mit ins jar gepackt? (Einfach mal rein schauen, ob die Bilder darin enthalten sind und in welchem Verzeichnis sie liegen)
Wenn ja, dann kann man die Bilder z.B. so laden:

```
new ImageIcon(getClass().getResource("/img/Bild1.png"));
```


----------



## Ci (11. Jul 2011)

> Verstehe ich das richtig, du hast deine .jar-datei und dadrin die Bilder, diese führst du aus?
> 
> Wenn ja, wieso hast du dann einen absoluten Pfad?
> Das Programm sucht bei deinen anderen Rechner nach
> ...



der Absolute Pfad ist falsch, da gebe ich dir Recht, denn wenn ich mein JAR file unter einem anderen Rechner laufen lasse, werden die Bilder nicht angezeigt, ist ja auch klar, da der Pfad nicht erkannt wird.

aber mit der Methode von Michael...

```
new ImageIcon(getClass().getResource("/img/Bild1.png"));
```
funktioniert das auch nicht! Wie gesagt, ich habe einen Ordner mit der Bezeichnung _resources_  erstellt und da einfach meine Bilder reingepackt. der Ordner befindet sich in meinem Projekt Ordner


----------



## Michael... (11. Jul 2011)

Ci hat gesagt.:


> ich habe einen Ordner mit der Bezeichnung _resources_


Weiter oben hieß der Ordner noch *img*. Wenn Du das Package umbenennst, musst Du selbstverständlich auch den Aufruf anpassen.
Hab ja gesagt: Schau in das jar rein, wo und wie die Bilder dort abglegt sind (sollte der Projektstruktur entsprechen) und dementsprechend passt Du den Aufruf an.

Hier was zu  Nachlesen aus der API:
Class (Java Platform SE 6)


----------



## Gast2 (11. Jul 2011)

Du redest hier ständig von Ordnern. 

Am einfachsten ist du erstellst in deiner IDE ein ganz normales java package. 
zum Beispiel: 

dein.name.resources

den Class Loader fütterst du dann mit dein/name/resources/bild.jpg

Da du das ganze dann in einem Source Package hast wird das ja auch automatisch in die jar kopiert.


----------



## diggaa1984 (11. Jul 2011)

vielleicht hattest du das auch überlesen, aber ich find so kompliziert war mein beitrag nicht


----------



## Gast2 (11. Jul 2011)

diggaa1984 hat gesagt.:


> vielleicht hattest du das auch überlesen, aber ich find so kompliziert war mein beitrag nicht



Da sind wir einer Meinung.


----------



## Ci (13. Jul 2011)

@Michael...



> Hab ja gesagt: Schau in das jar rein, wo und wie die Bilder dort abglegt sind (sollte der Projektstruktur entsprechen) und dementsprechend passt Du den Aufruf an.



hab jetzt in mein JAR reingeschaut, da befinden sich nur lediglich zwei Ordner:
zum einen ein Ordner von meinem bin Verzeichnis (bin Verzeichnis von meinem Projekt Ordner )und zum anderen ein META-INF Ordner. Darin befindet sich nur die Datei MANIFEST.MF!

also keine Spur von irgendwelchen Bildern. 
Mitlerweile habe im Netz so einiges durchgekaut, nur steh ich immer noch mit leeren Händen da 

PS: Sorry wegen der Verwirrung mit der Bezeichnung von meinem Ordner mit den Icons! bleiben wir bei *img*


----------



## diggaa1984 (13. Jul 2011)

Ci .. schau dir doch bitte mein beitrag an und wenn noch was unklar sein sollte, bitte fragen!

du musst einfach nur den resource-ordner in den src-ordner vom projekt schieben und kannst dann per getClass().getResource(...)  die sachen laden


----------



## Michael... (13. Jul 2011)

Merkwürdig, dass bei Dir ein bin Verzeichnis mit drin ist. Wie ist das dann weiter aufgebaut?

Auf jeden fall musst Du das Verzeichnis _img_ mit den Bildern ebenfalls mit ins jar exportieren.


----------



## Ci (13. Jul 2011)

@diggaa1984:

ich versteh leider das mit getClass().getResource(...) nicht ganz! Oder weiß ehrlich gesagt nicht, wie ich das in meinem Code einsezen soll!
wie würdest du das in meinem Code hier platzieren?

GUI_ATR.class

```
package getATR;

import javax.swing.*;

public class GUI_ATR extends JFrame{
	
	public GUI_ATR(){
		
		setTitle("TEST");
		
		this.setVisible(true);
		setSize(200, 200);
		setLocation(150, 100);
		JPanel panel = new JPanel();
		getContentPane().add(panel);
		panel.setLayout(null);
		
		JLabel label = new JLabel("New label");
		label.setIcon(new ImageIcon("C:\\Dokumente und Einstellungen\\dsv\\workspace\\ProjektIcon\\src\\img\\OK.png"));
		label.setBounds(50, 50, 63, 60);
		panel.add(label);
	}
}
```

MainKlasse.class

```
package getATR;

import java.awt.EventQueue;

public class MainKlasse {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
			try {
				GUI_ATR frame = new GUI_ATR();
				frame.setVisible(true);

			} catch (Exception e) {
					e.printStackTrace();
			}
			}
		});			
	}
}
```

@ Michael:

...nicht das *bin *Verzeichnis, sonderen der Inhalt von meinem *bin* Verzeichnis, das in meinem Projekt Ordner liegt. In meinem Fall also: *getATR*
Ich kann auch nirgendswo beim erstellen des JAR files die Bilder mit hineinpacken!


----------



## Gast2 (13. Jul 2011)

Ci hat gesagt.:


> @diggaa1984:
> 
> ich versteh leider das mit getClass().getResource(...) nicht ganz! Oder weiß ehrlich gesagt nicht, wie ich das in meinem Code einsezen soll!
> wie würdest du das in meinem Code hier platzieren?



???:L  mein Post

Ersetze dein setIcon halt mit z.B. dem ResourceLoader Aufruf. Was gibts da nicht zu verstehen? Wenn du keinen Resource Loader willst kopiert halt die Zeilen in deinen Code. 

Musst nur deine Bilddatei halt in ein Source Package verschieben?! Ich versteh dein Problem irgendwie nicht.

Zumal dir Digga1984 das gleiche auch nochmal auf andere Art erklärt hat. So langsam hast du schon einige Vorschläge zur Hand ... 

PS: In allen von mir zu Beginn des Threads geposteten Links gehts um dein Problem. Und in ALLEN wurde es gelöst ...


----------



## Asgar13 (13. Jul 2011)

Bisschen unschön aber leicht verständlich:

Wenn dein "bin" Verzeichnis nur in die Jar geladen wird, dann nimm doch die Bilder in das "bin" Verzeichnis und lade diese, wie oben gepostet, mit:


```
new ImageIcon(getClass().getResource("Bild1.png"));
```

PS:

Wäre wohl eine gute Signatur:

Meckern können wir alle aber eine Sache für alle verständlich zu machen, das schafft keiner.

COMMIT:

alle verständlich zu machen -> kann man auch den Rechner mit meinen


----------



## RySa (13. Jul 2011)

Das Ansprechen von Dateien in einem .jar File ist so ne Sache an sich. Solange du die Datei nicht veränderst geht das ja noch.
Wenn Eclipse dir Die Dateien nicht in das .jar verschiebt und du nicht weißt wie man ANT benutzt, dann muss du einfach die Dateien selber in das .jar reinpacken. Dazu öffnest du das .jar File und verscheibst dein ordner mit den Grafiken (nennen wir es "img") einfach in das .jar rein. Achte darauf, dass der Ordner mit Grafiken sich im gleichen Verzeichnis wie die .class Dateien befindet. Dann muss du nur noch die Grafik Dateien entsprechend ansprechen.
Versuche dazu, das:

```
label.setIcon(new ImageIcon("C:\\Dokumente und Einstellungen\\dsv\\workspace\\ProjektIcon\\src\\img\\OK.png"));
```
mit dem hier zu ersetzen:

```
label.setIcon(new ImageIcon(getClass().getResource("img/OK.png");
```

Das sollte funktionieren 

EDIT: 
Heh, habe wohl zu lange gebraucht es zu schreiben (wurde abgelenkt ) und jetzt steht quasi 2 mal das gleiche. Naja, hoffentlich wird das Thema damit aber auch erledigt


----------



## TheDarkRose (13. Jul 2011)

Wenn man die Bilder in ein Package, z.b. ressource innerhalb des Sourcefolders packt, dann sollte Eclipse auch das Bild mit in die .jar packen.


----------



## Ci (13. Jul 2011)

Die Idee, den img Ordner in das bin Verzeichnis zu packen ist gut, denn wenn ich nun meine Jar file entpacke, dann sind die Bilder tatsächlich vorhanden! Nur funktionierts immer noch nicht!

Unter eclipse wird das Bild angezeigt, aber als Jar file dann nicht mehr!!!

Hab auch mein Code damit ersetzt:

```
label.setIcon(new ImageIcon(getClass().getResource("img/OK.png");
```
 !!!


----------



## TheDarkRose (13. Jul 2011)

Mach mal einen Screenshot von deinem Package Explorer.


----------



## diggaa1984 (13. Jul 2011)

Die Bilder ins /bin zu packen ist aber nur ne Krücke, richtig wäre es anders ^^


----------



## Gast2 (13. Jul 2011)

Irgendwie beschleicht mich das Gefühl der TO weiss nicht so recht was packages sind. Denn gesagt wurde bereits alles.


----------



## Michael... (13. Jul 2011)

Das Projekt sollte in etwa wie folgt aufgebaut sein

```
src 
   |- getATR
   |     |- GUI_ATR.java
   |     |- ....java
   |- img
         |- OK.png
         |- ....png
```

Die selbe Struktur nur mit class-Files sollte in binary Verzeichnis zu finden sein.
Wenn man das Projekt exportiert sollten im jar u.a. folgende Einträge zu finden sein:

```
getATR/GUI.class
img/OK.png
```

Dann kann man das Bild mit folgender Zeile in der GUI_ATR laden:

```
label.setIcon(new ImageIcon(getClass().getResource("/img/OK.png");
```


----------



## Ci (14. Jul 2011)

Hallo Michael..

habs jetzt so probiert, wie du es beschrieben hast.
Hat allerdings nicht ganz hingehauen 
Dann hab ich den img Ordner in den getATR Ordner gepackt. Sowohl im src Verzeichnis als auch im bin.

und im Code musste ich den ersten Slash enfernen, also:


```
label.setIcon(new ImageIcon(getClass().getResource("img/OK.png");
```

jetzt wird das Bild auch unter einem anderen Rechner angezeigt! 

Allen die helfen wollten vielen Dank

PS: manche Menschen verstehen die Dinge schnell, andere wiederrum eher weniger schnell! So ist der Mensch eben. Aber ich bewundere immer wieder Menschen, die einen nicht aufgeben, auch wenns manchmal hoffnungslos scheint! 

Grüße und schönen Tag noch


----------



## RySa (14. Jul 2011)

RySa hat gesagt.:


> ...Achte darauf, dass der Ordner mit Grafiken sich im gleichen Verzeichnis wie die .class Dateien befindet. Dann muss du nur noch die Grafik Dateien entsprechend ansprechen.
> Versuche dazu, das:
> 
> ```
> ...


Habe doch gesagt der img Ordner muss sich da befinden, wo die .class Dateien  Ich weiss, dass sich img gar nicht im bin Ordner befinden sollte, weil es etwas unschön ist, habe es aber so vorgeschlagen, da der ClassLoader ab dem bin Verzeichnis sucht (weil ja von da die Klasse geladen wurde - glaube ich zumindest) also müsste man einen Schritt zurückgehen und ich wusste auf die schnelle nicht wie das zu realisieren wäre also habe die etwas unschöne Lösung genommen. Freu mich, dass es geholfen hat


----------



## Michael... (14. Jul 2011)

Eclipse übernimmt normalerweise die Packages inkl. Resourcen automatisch ins bin Verzeichnis.

Warum mein Vorschlag bei Dir nicht funktioniert kann ich nicht sagen. Mittlerweile hast Du ja einen Weg gefunden.

Falls noch interessant hab ich noch ein Bsp angehängt.


----------



## Ci (14. Jul 2011)

war ein *Hartes Ringen*, aber jetzt ists ja rum 

nochmals danke, auch für das Beispiel jetzt!:toll:
...witziges Bild


----------



## Asgar13 (14. Jul 2011)

Bitte noch das Thema als "gelöst" anklicken


----------



## Datacron (18. Jan 2013)

Ich glaube die Lösung gefunden zu haben woran es harkt. Hatte gerade das selbe Problem und hab mir alles von oben bis unten + Links durchgelesen. Alles nicht schwer zu verstehen und gute Lösung...bei mir war es bloß so:

1. Meine Icons wurde ebenfalls nach dem exportieren nicht angezeigt
2. Beiträge gelesen
3. in eclipse rechtsklick auf Projekt --> new --> Package das benennst du dann com.beispiel*.img* oder wie auch immer
4. icons zB mit folgendem gesucht :
ImageIcon icon = new ImageIcon(getClass().getResource("/*img*/stat_ok.png"));

5. kein Erfolg sowohl in eclipse als auch in der .jar

6. Lösung: .getResource("*../*img/stat_ok.png")); man muss erst einen Ordner zurück also aus dem package raus wo die class datein drin sind und dann in den Ordner img navigieren :toll:

ich hoffe das konnte nochmal helfen


----------

