# SourceCode + Bilder in EIN Jar File packen



## babuschka (5. Jan 2010)

Zuerst einmal die Frage ist es möglich Bilder zu einem Jar Archiv hinzuzufügen?
Mit Bildern meine ich 5 Icons (für JButtons) + eine Image (für JPanel).
Ich verwende JBuilder 2005. Ich habe ein JAR Archiv mittels Datei-Neu-Archiv-Source erstellt.
Dieses funktioniert soweit auch, allerdings nur dann, wenn die Images im richtigen Pfad sind.
bsp. ich habe die jar datei in C:\MeinProgramm\ liegen, die Images dazu sind auf C:\MeinProgramm\Images.
führe ich nun die jar datei in C:\MeinProgramm aus, so funktioniert alles einwandfrei. Führe ich die gleiche Datei in C:\ aus, so werden die Bilder nicht angezeigt (Funktion bleibt erhalten).
Deshalb meine Frage, ist es möglich EINE ausführbare Datei (aus meinem SourceCode + Bilder) zu erstellen?


----------



## Wildcard (5. Jan 2010)

Ja, einfach die Bilder mit ins jar packen und über den Classloader laden. Class#getResourceAsStream


----------



## babuschka (5. Jan 2010)

Wildcard hat gesagt.:


> Ja, einfach die Bilder mit ins jar packen und über den Classloader laden. Class#getResourceAsStream



und wie kann ich die bilder ins jar packen?
im jbuilder gibt es die auswahl All classes and resources, damit müssten die bilder auch  mit gepackt werden.

wie verwende ich den Classloader?

derzeit sieht mein source code so aus:
Icon img = new ImageIcon("Images\\Button.png");
button.setIcon(img);


----------



## Wildcard (8. Jan 2010)

Wie das beim JBuilder im Detail funktioniert kann ich dir nicht sagen.
Classloader, wie gesagt mit Class#getResourceAsStream.


----------



## babuschka (10. Jan 2010)

Wildcard hat gesagt.:


> Wie das beim JBuilder im Detail funktioniert kann ich dir nicht sagen.
> Classloader, wie gesagt mit Class#getResourceAsStream.



und wie sieht der java code genau aus?

ich brauche immer ein beispiel um ihn anwenden zu können :lol:

derzeit sieht mein source code so aus:

```
Icon img = new ImageIcon("Images\\Button.png");
button.setIcon(img);
```


----------



## Wildcard (10. Jan 2010)

```
Icon img = new ImageIcon(this.getClass().getResource(path));
```


----------



## U2nt (10. Jan 2010)

Hab deine Lösung:
Das Eclipse Plugin "FatJar"
FatJar - Sourceforge

Installation wird da beschrieben. Einfach die Bilder in deinem Workspace in den bin Folder reinpacken, aufs Project Rechtsklick "Build FatJar..." drücken... Wie beim exportieren.
Jedoch wenn die ersten Einstellungen übernommen sind auf "Next" drücken, und dort kannste deine Bilder mit auswählen.

Habs auch selber ausprobiert! 

Source:

```
import java.awt.FlowLayout;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;


public class Frame extends JFrame {
	private static final long serialVersionUID = 1L;
	
	private JButton button = null;
	private String path = "A.png";
	private Icon icon = new ImageIcon(this.getClass().getResource(path));
	
	public Frame() {
		super("Bild im Jar");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(100, 100);
		setLocationRelativeTo(null);
		setResizable(false);
		setLayout(new FlowLayout());
		
		button = new JButton();
		button.setIcon(icon);
		
		add(button);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new Frame();
	}
}
```

Und die Jar ist im Anhang  Hoffe das ist das, was du suchst!


----------



## babuschka (10. Jan 2010)

U2nt hat gesagt.:


> Hab deine Lösung:
> Das Eclipse Plugin "FatJar"
> FatJar - Sourceforge
> 
> ...



vielen dank für deine antwort.

hab das gleich einmal probiert (*nur* den source code geändert).
da bekomm ich folgenden fehler:

```
java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(ImageIcon.java:138)
	at MyConverter.Window.Initialize(Window.java:272)
	at MyConverter.Window.<init>(Window.java:54)
	at MyConverter.MyConverter.<init>(MyConverter.java:20)
	at MyConverter.MyConverter.main(MyConverter.java:29)
Exception in thread "main"
```

das gleiche, wenn ich dein programm ausführe.


ich besorg mir schnell eclipse und hoffe, dass es dort funktioniert.


----------



## U2nt (10. Jan 2010)

Müsste eigentlich funktionieren, wäre nett wenn du deinen geänderten Sourcecode mal posten würdest (falls es dann immernochnicht geht...)


----------



## Wildcard (10. Jan 2010)

1. Man legt niemals Resourcen in bin ab, immer in einem source folder
2. FatJar kann nichts was Eclipse nicht von Haus aus kann, ist also obsolete


----------



## U2nt (10. Jan 2010)

Um erlich zu seien finde ich beim Exportieren via normalen eclipse export KEINE Auswahl an Bilder bzw. anderen Resourcen. Ich kann lediglich die java und jar Files mitnehmen. Das sieht in FatJar viel besser aus - meiner Meinung nach.

Gut das mit den Resources in den src Ordner sollte man machen.
-> Was man dann aber bei FatJar beachten muss, ist das man den src Ordner als neuen dir einladen muss, damit man das Bild auch bekommt.


----------



## babuschka (10. Jan 2010)

U2nt hat gesagt.:


> Müsste eigentlich funktionieren, wäre nett wenn du deinen geänderten Sourcecode mal posten würdest (falls es dann immernochnicht geht...)



nein funktioniert auch mit Eclipse SDK Version: 3.5.1 nicht.

hier mein programm:
File-Upload.net - MyConverter.zip


----------



## U2nt (10. Jan 2010)

Und der Source-Code?...
Mit dem Programm das ein Error aufruft kann ich nicht viel anfangen.


----------



## babuschka (10. Jan 2010)

U2nt hat gesagt.:


> Und der Source-Code?...
> Mit dem Programm das ein Error aufruft kann ich nicht viel anfangen.



source code ist mit dabei?
src\*.java


----------



## U2nt (10. Jan 2010)

Also als erstes ist mir aufgefallen: Bilder wie "info.png" gibt es nicht, willst du aber haben in deinen java Files. ACHTUNG: Java achtet auf Groß und Kleinschreibung!

Außerdem wirste das nie jemand anderen schicken können bei dem es funktioniert (außer mit Zufall), weil nicht jeder hat den Benutzer "Admin". Geb doch das Layout relativ an und nicht absolut.

Ansonsten sind mir noch ein paar "sinnlose" Sachen aufgefallen wie:


```
public class MyConverter {
    public MyConverter() {
        new Window();
    }
    
    public static void main(String[] args) {
        new MyConverter(); 
    }
}
```

Warum nicht einfach:


```
public class MyConverter {
    public static void main(String[] args) {
        new Window(); 
    }
}
```

Achja und sorry das es so lang gedauert hat 
-> Hab auch mit FatJar den Ordner "Images" (den Ordner würde ich auch lieber "images" nennen) in das .jar File mit einbezogen.


----------



## babuschka (10. Jan 2010)

U2nt hat gesagt.:


> Also als erstes ist mir aufgefallen: Bilder wie "info.png" gibt es nicht, willst du aber haben in deinen java Files. ACHTUNG: Java achtet auf Groß und Kleinschreibung!



stimmt bei info und und back.png stimmt die groß und kleinschreibung nicht.
ich will die bilder nicht in meinen java files haben, sondern in einem ordner images, der im projektverzeichnis liegt. 



U2nt hat gesagt.:


> Außerdem wirste das nie jemand anderen schicken können bei dem es funktioniert (außer mit Zufall), weil nicht jeder hat den Benutzer "Admin". Geb doch das Layout relativ an und nicht absolut.



ich versteh nicht ganz, was du damit meinst, bzw was ich ändern muss.
bezüglich layout? meinst du damit, dass ich es nicht fix für eine größe darstellen soll?




U2nt hat gesagt.:


> Ansonsten sind mir noch ein paar "sinnlose" Sachen aufgefallen wie:
> 
> 
> ```
> ...



mein jbuilder erzeigt die main methode automatisch, deswegen hab ich nur den konstruktor geändert, seh darin aber auch kein problem?



U2nt hat gesagt.:


> Achja und sorry das es so lang gedauert hat
> -> Hab auch mit FatJar den Ordner "Images" (den Ordner würde ich auch lieber "images" nennen) in das .jar File mit einbezogen.



bis jz hab ich nur die dateinamen der bilder geändert, trotzdem hat sich an der fehlermeldung nichts geändert?
ps. ich führe das programm mit eclipse aus!


----------



## U2nt (10. Jan 2010)

Das mim Konstruktor is einfach nur "überflüssiger" Code finde ich. Du hast ja ein Layout das nicht offiziell beim JRE dabei ist, also gibst du im Buildpath eine jar file an die das Layout drinne hat. Doch diesen haste Absolut festgelegt also:
C:\Dokumente und Einstellungen\*Admin*\..
Und nicht jeder hat zufälligerweise genau da diese jar datei  Die solltest du also relativ zum Projekt festlegen und am besten im jar direkt mitliefern.


----------



## babuschka (10. Jan 2010)

U2nt hat gesagt.:


> Das mim Konstruktor is einfach nur "überflüssiger" Code finde ich. Du hast ja ein Layout das nicht offiziell beim JRE dabei ist, also gibst du im Buildpath eine jar file an die das Layout drinne hat. Doch diesen haste Absolut festgelegt also:
> C:\Dokumente und Einstellungen\*Admin*\..
> Und nicht jeder hat zufälligerweise genau da diese jar datei  Die solltest du also relativ zum Projekt festlegen und am besten im jar direkt mitliefern.



sogar hier weiß ich nicht weiter.

ich klicke rechte maustaste - buildpath - configure build path.
dort kann ich aber nur einen fixen pfad angeben und keinen relativen.



ansonsten funktioniert jz endlich das jar file erstellen. mit einer ausnahme: nur dann, wenn ich die bilder in den bin ordner ablege, sind sie im src ordner lässt sich mein programm nicht ausführen.


----------



## U2nt (11. Jan 2010)

lisaaa17 hat gesagt.:


> ansonsten funktioniert jz endlich das jar file erstellen. mit einer ausnahme: nur dann, wenn ich die bilder in den bin ordner ablege, sind sie im src ordner lässt sich mein programm nicht ausführen.



Also meinste das es komplett nicht geht wenne die im src Ordner ablagert, oder das er Sie einfach nicht im jar file mit reinnimmt. Beim Zweiten Fall sieht die Lösung so aus:

-> FatJar: ErsteBildschirm wie gewünscht ausfüllen -> Next drücken
-> Rechts auf "Add Dir..." drücken und den Src Ordner auswählen. Anschließend NUR die Bilder ausm Source Ordner nehmen (esseiden du willst auch die java files im jar).

Ich gucke mal ob ichs rasch ma hinkrieg mit dem Buildpath.


----------



## U2nt (11. Jan 2010)

Hey -> Ging ja schnell, bei mir funktioniert der Converter nun einwandfrei: Die Pictures werden mitgeliefert, das Layout und es wird keine Exception geliefert.

Hab die Source und das funktionierende Jar (mit FatJar erstellt) im Anhang 

PS: Wieso setze des eigentlich aufs Windows LAF?


----------



## babuschka (13. Jan 2010)

U2nt hat gesagt.:


> Hey -> Ging ja schnell, bei mir funktioniert der Converter nun einwandfrei: Die Pictures werden mitgeliefert, das Layout und es wird keine Exception geliefert.
> 
> Hab die Source und das funktionierende Jar (mit FatJar erstellt) im Anhang
> 
> PS: Wieso setze des eigentlich aufs Windows LAF?



danke, genau so hab ich mir das vorgestellt.
aber auch bei dir sind die bilder im src ordner. auch ich hbas mit fatjar erstellt.
zu der miglayout.jar, die sollte doch auch in das jar file gepackt werden, zumindest war das meine überlegung. ich will keine zusätzliche dateien, sondern wirklich nur 1 ausführbare Datei, die ich auf mehreren Rechnern ausführen kann. ich habe meine JAR Datei bereits auf anderen Rechnern (auch ohne Admin User) getestet und funktioniert einwandfrei. 
was mir noch aufgefallen ist, dass meine jar datei 277kB groß ist, deine nur 155kB. Liegt vl daran, dass ich wirklich alles gepackt habe. Die 120kB machen das Kraut aber auch nicht fett.
zum Layout: Mir gefällt dieses JAVA Design einfach nicht, dunkelgraue Fenster, die violetten Markierungen, bei aktiven (im Focus ??? stehende) Buttons, ..., deshalb hab ich mich für das klassische Windows Design entschieden. Wenns da noch andere Windows Styles gibt wäre ich über jede Information erfreut.

nocheinmal vielen dank, für die Mühe, die ich euch gemacht habe


----------



## fjk88 (5. Apr 2010)

habe das selbe problem.

ich hab den ganzen heutigen Tag damit verschwendet, ein ausführbares jar File zu erstellen, das sämtliche Bilder beinhaltet.
Mein Programm wurde im JBuilder geschrieben, mittlerweile habe ich mir Eclipse+FatJar herunter gleaden und es dort zum ausführen gebracht.

Nach zahlreicher Forenrecherche habe ich jz alle Lösungsvorschläge durch, trotzdem funktioniert es nicht.


*Punkt1:*
Bilder müssen mit 
	
	
	
	





```
URL url = getClass().getClassLoader().getSystemResource(Filename);
img = Toolkit.getDefaultToolkit().getImage(url);
```
 geladen werden.
In diversen Foren findet man folgende Angaben zum Filename:

"Images/help.png"
"/Images/help.png"
"./Images/help.png"

ich habe mir das Programm MyConverter, das hier zum Download bereitgestellt wurde, disassembliert und festgestellt Lösung 1 also ohne / zu Beginn müsste funktionieren.


*Punkt2:*
wo gehöhren die bilder gespeichert.
meine ordnerübersicht für mein programm sieht wie folgt aus:








JBuilder fragt mich beim Erstellen eines Projektes nach dem Namen. Aufstellungsassistent ist der Name des Projektes, das im gleichnamigen Ordner erstellt wird. aufstellungsassistent ist der packagename.

gehört nun der Images Ordner auf die gleiche Ebene wie die Bak, Classes, SRC; in den SRC; in den CLASSES Ordner oder generell in den ersten Aufstellungsassistent Ordner?

*
Punkt3:*

Mit JBuilder kann man eine ausführbare JAR Datei erstellen. Das klappt auch wunderbar, allerdings nur solange, solange die Bilder auf der gleichen Ebene gespeichert sind. 
Mein nächster Schritt war dann, dass ich das JAR Archiv mit 7zip aufgemacht habe und die Bilder nachträglich hinzugefügt habe. Das funktioniert nicht.

Daraufhin habe ich, das in diesem Thread erwähnte Plugin FatJar in Eclipse probiert. das Archiv enthält die Bilder, es ist auch dementsprechend groß, lässt sich allerdings nicht ausführen. Damit meine ich es geschieht nichts, wenn ich auf das JarArchiv doppelklicke.
In einem anderen Forum steht geschrieben, dass man beim ausführen des FatJar Plugins einen classPath angeben muss. 
jar File startet nicht - Java @ tutorials.de: Forum & Hilfe
Nur weiß ich nicht, wie das funktioniert.


----------



## fjk88 (6. Apr 2010)

der class path unterscheidet sich je nach verwendeten programm.
jbuilder: projektname/projektname/classes
eclipse:  projektname/projektname/bin

ich habe wieder mit beiden programmen ein jar archiv erstellt:
beide lassen sich nicht ausführen, deswegen habe ich in der konsole folgendes probiert:


```
java -jar test.jar
```

liefert 

*1. Eclipse JAR:*


```
Exception in thread "main" java.lang.NoClassDefFoundError: D:\java-programme\eclipse\AufstellungsAssistent\bin\AufstellungsAssistent/class
Caused by: java.lang.ClassNotFoundException: D:\java-programme\eclipse\Aufstellu
ngsAssistent\bin\AufstellungsAssistent.class
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: D:\java-programme\eclipse\AufstellungsAssistent\bin\AufstellungsAssistent.class. Program will exit.
```


*2. JBuilder JAR
*

```
jar:file:/D:/Java_Programme/AufstellungsAssistent/AufstellungsAssistent/Aufstell
ungsAssistent.jar!/feld.png
null
SaveIcon.png nicht gefunden
Exception in thread "main" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(Unknown Source)
        at aufstellungsassistent.Einstellungen.InitButton(Einstellungen.java:114
)
        at aufstellungsassistent.Einstellungen.<init>(Einstellungen.java:68)
        at aufstellungsassistent.Fenster.<init>(Fenster.java:29)
        at aufstellungsassistent.AufstellungsAssistent.main(AufstellungsAssisten
t.java:28)
```


----------

