# Jar Datei ist ausführbar aber zeigt keine icon's an



## Coca (7. Jan 2008)

Halli hallo und frohes neues erstmal
Ich habe folgendes Problem, ich habe ein kleines Projekt erstellt und es funktioniert auch soweit. Mein Problem ist wenn ich das projekt zu einer Jar File hinufüge, und dann starte funktioniert alles nur werden mir die Icons auf dem JLabel nicht angezeigt. Ich denke es liegt am Datei Pfad. Habe hier auch schon viele Threads gefunden zu dem Thema. ich google mindest auch schon 2 Stunde und stoße immer wieder auf getClass().getResource aber ich verstehe es überhaupt nicht.
So habe es dann endlich hin bekommen das es in eclipse mit getClass().getResource ging, aber dann startete die anwendung als jar überhaupt nicht mehr :S
 wenn ich es so ausführe 
	
	
	
	





```
movingLabel.setIcon(new ImageIcon ("img/movement1.jpg"));
```
 klappt es in eclipse wunderbar aber in der jar sehe ich die bilder nicht. und wenn ich es so ausfuehre
	
	
	
	





```
ImageIcon pic = new ImageIcon(getClass().getResource("/img/movement1.jpg"));
```
 und bei setIcon dann pic angebe klappt es wieder in Eclipse, aber startet dafür die jar garnicht mehr ich weiß nicht mehr weiter  ???:L 
Danke für die Hilfe


----------



## Verjigorm (8. Jan 2008)

ich glaube nur getResource() reicht da nicht.
getResourceAsStream(String name) musste in der Jar benutzen


----------



## The_S (8. Jan 2008)

getResource sollte reichen und ist auch der richtige Weg um Bilder/Dateien aus einem JAR zu laden.

Wenn dein JAR nicht mehr startet, muss es wohl zu einer Fehlermeldung kommen. Führe dein JAR doch mal über die Konsole aus, und zeige uns die entsprechende Fehlermeldung.


----------



## Verjigorm (8. Jan 2008)

hast du auch den Ordner img mit in die Jar exportiert?


----------



## coca (8. Jan 2008)

also wenn ichs über java -jar test.jar starte dann gibt mir die cmd folgende aus gabe :
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(Unkown Source)
at test.Spieler.<init>(Soieler.java:6)
at test.MoveLabelFrame.<init>(MoveLabelFrame.java:16)
at test.MoveLabelMain.main(MoveLabelMain.java:5)
was mir das sagt, das die Pfade falsch angegeben sein müssen. jetzt frage ich micht warum es dann in Eclipse funtzt. Oder liegt das daran das die bilder fehlen? oder vll sollte ich selber eine Manifest.txt schreiben und nicht von eclipse erstellen lassen
Vielen Dank schon mal für die Antworten


----------



## The_S (8. Jan 2008)

Die Bilder "fehlen" :shock: !? Hast du sie denn nicht mit in die JAR gepackt?


----------



## Coca (8. Jan 2008)

Schade dass ich meine Antowrt nicht editieren kann, aber ein kleiner nachtrag:
Ich exportiere das Project mit Eclipse und folgenden Einstellungen
Export generated class files and resources
Export java source files and resources
compress the contents of the JAR file
add directory entires
overwrite existing files without warning
Export class files with compile errors
Export classes files with compile warnings
Gernerate the manifest file
Save the manifest in the workspace
Manifest file /swing/Manifest.txt
Seal contents:Seal some packages
Select the class of application entry point: Main class:MoveLabelMain


----------



## Verjigorm (8. Jan 2008)

das nutzt dir aber nix, wenn der Ordner/Files nicht angehakt sind im Eclipse
das hatte ich auch schonmal, deswegen kontrollier ich immer alle Häkchen!
Bei : "Select the Resources to Export"


----------



## coca (8. Jan 2008)

Da werden mir aber die img nicht angezeigt, also kann ich da auch keine harken machen. Wie kann ich das einstellen, das Eclipse erkennt, dass im ProjektOrder Swing ein unterordner img mit zwei bild exestiert?
neben bei, wenn das 
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
	<classpathentry kind="output" path="bin"/>
</classpath>
bei classpath steht und ich will jetzt auf das bild movement zugreifen, das im ordner img liegt und dieser direkt im projekt swing liegt?
dann ist doch

```
ImageIcon pic1 = new ImageIcon(getClass().getResource("./img/movement1.jpg"));
```
richtig? also in eclipse zeigt er es mir so an


----------



## Verjigorm (8. Jan 2008)

wenn du auf Export -> Jar gehst, kriegste doch oben in 2 Fenstern alle Projekte/Packages etc angezeigt.
Da klickste auf das + für deinem Projekt, dann siehste alle Unterordner, auch deinen "img"-Ordner.
da muss ein Häkchen davor sein


----------



## Coca (8. Jan 2008)

vll habe ich mich dumm ausgedrückt, aber genau den sehe ich nicht


----------



## Lulumann6 (9. Jan 2008)

also ich kann dir mit dem export und eclipse nicht weiterhelfen,
aber ich hatte heute genau das selbe problem wie du, die bilder wurden einfach nicht angezeigt. 
1. eclipse scheint die bilder auch zu finden wenn man den dateinamen klein schreibt obwohl er eigentlich groß geschrieben werden muss. wenn du dann eine jar machst musst du umbedingt auf die groß- und kleinschreibung achten.
2. die endung muss aufjedenfall auch entweder groß oder klein geschrieben werden, also PNG muss groß und gif klein (bei jpg weis ich das nicht).


mfg. Lulumann


----------



## The_S (10. Jan 2008)

Das liegt daran, dass du in Eclipse auf das Windows-Filesystem zugreifst und selbiges nicht Case-Sensetive ist. Eine JAR ist in sich so ne Art Mini-Filesystem (wenn ich das mal so nennen darf), da gepackt und nur eine Datei. Und hier ist wieder alles Case-Sensetive.

@Coca schau doch einfach ins jar, ob da die bilder drin liegen oder nicht ???:L


----------



## Verjigorm (10. Jan 2008)

mit winrar z.b. kannste dir die Jar anschauen
(Achtung mit permanenten Verknüpfungen von winrar zu jar  )


----------



## lhein (10. Jan 2008)

Verjigorm hat gesagt.:
			
		

> mit winrar z.b. kannste dir die Jar anschauen
> (Achtung mit permanenten Verknüpfungen von winrar zu jar  )



Du kannst das JAR auch im Winzip öffnen oder benenn es halt um in *.zip.

lr


----------



## The_S (10. Jan 2008)

Du kannst auch ein Java-Programm schreiben, dass dein JAR nach deinen Bildern durchsucht - definitiv die stylischste Lösung


----------



## Java-dev (21. Jan 2008)

Probiers mit : 

Image icontitle = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("ressourcepfad/icon.png"));
setIconImage(icontitle);


Gruß 

CW


----------



## Dozor (22. Feb 2008)

Hi Coca

sag mal hatt es jetzt bei dir funktioniert oder nicht?

Bei dateien in Java Archiven(Jar) ist das sogenannte "Filesystem"Case sensitive,
=> Java unter Windows ist sogesehen bei der ausführung egal ob es klein oder groß geschrieben ist währe da nicht dieser kleine punkt der sich groß auswirkt die Plattform unabhängigkeit.

Das hat zufolge das Jar Dateien ebenfalls Plattform unabhängig sein sollen , DIE SIE AUCH SIND deswegen beziehen sie ihr "Filesystem" auf den "kleinsten gemeinsamen Nenner" aller Betriebsysteme und das ist in diesem fall die Groß und klein schreibung 
=> Wird ein Programm aus einer Jar gestartet und greift auf die Sourcen im Jar File zurück ist auf jedenfall CASE SENSITIVE angesagt.

Desweiteren weiß ich jetzt natürlich nicht wie genau deine Projektstruktur / Ordnersystem aussieht aber ich empfehle dir eine Classe anzulegen womit du auf die Bilder zugreifst 
und die am besten einen Ordner vor den Tatsächlichen Bildern liegt.

Desweiteren habe ich bei meinen versuchen festgestellt das ein URL Objekt in einer Jar nichts mit Pfad angaben anfangen kann die ./ oder ../ beinhalten 

zweiter beitrag folgt zugleich


----------



## Dozor (22. Feb 2008)

Dozor hat gesagt.:
			
		

> Desweiteren habe ich bei meinen versuchen festgestellt das ein URL Objekt in einer Jar nichts mit Pfadangaben anfangen kann die ./ oder ../ beinhalten



Zweiter Beitrag:

und die all erwähnten forgehen 


			
				Java-dev hat gesagt.:
			
		

> Image icontitle = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("ressourcepfad/icon.png"));
> setIconImage(icontitle);





			
				Coca hat gesagt.:
			
		

> new ImageIcon(getClass().getResource("img/movement1.jpg"));




```
ClassName.class.getResource("img/mevement1.jpg");
```

alle diese drei forgehensweisen bringen ein URL Objekt zurück

an diesen Drei ist nichts auszuzusetzen.

nun zu der Tatsache:
hast du deine Bilder in einem einfachen "Folder" wie es in  Eclipse heißt unterlegt 
oder liegen bei dir die Bilder in einem "Package"  

Nun zu meiner Lösung:

Ich geh jetzt mal von der tatsache aus das Sie im Package liegen
(so hatte ich es meistens und meine Methode die Bilder dann zu laden hat immer in einer Jar datei funktioniert
desweiteren erwähne ich das in meinem Projekt der alle Packages als erste Kommponente gleich waren 
zb.     de
         de.bilder
         de.home.gui
         de.home.caller
         de.logic     ect....)

nun hatte ich mir eine Classe im aller ersten Package ( de ) geschrieben 

meine einfach kleine Classe :

```
package de;

import java.net.URL;
import javax.swing.ImageIcon;

public class ImageLoadManager {
	private ImageLoadManager(){

	}

	public static ImageIcon loadImage(String path) {
		ImageIcon icon;

		URL fis = ImageLoadManager.class.getResource(path);
		System.out.println(fis);
		// Abfragen auf Null ... vermeidung des Fehlers NullPointerException die bei
		// icon = new ImageIcon(fis); geben würde  wenn hier fis Null wäre
		if (fis != null) {
			icon = new ImageIcon(fis);
			return icon;
		} else {
			return null;
		}
	}
}
```

Diese Classe ist eine "statische" Classe und damit sogesehen nicht über einen Konstruktur initialisierbar
hatt eine Methode  namens loadImage(String path)
wobei mit Path nicht nur der Pfad gemeint ist sondern auch der name des Bildes/ der Datei
fürs anpassen müsst ihr sogehen nur den Return Wert anpassen müsst.


desweiteren kannst du nun auf alle Bilder zugreifen die in Packages nach "de" liegen 
sowäre ein guter Aufruf aus ner anderen Classe wie folgt
hierbei ist immer noch auf Groß und klein schreibung zu achten

Bitte beachten dass bei dem parameter path der weg zum bild vom package de beschrieben werden muss


```
ImageIcon meinIcon = new ImageIcon(ImageLoadManager.loadManager("hans.jpg"));    // Bild liegt im Package de
    ImageIcon meinIcon = new ImageIcon(ImageLoadManager.loadManager("bilder/hans.jpg"));    // Bild liegt im Package de.bilder
    ImageIcon meinIcon = new ImageIcon(ImageLoadManager.loadManager("home/hans.jpg"));    // Bild liegt im Package de.home
    ImageIcon meinIcon = new ImageIcon(ImageLoadManager.loadManager("home/gui/hans.jpg"));    // Bild liegt im Package de.home.gui
    ImageIcon meinIcon = new ImageIcon(ImageLoadManager.loadManager("home/caller/hans.jpg"));    // Bild liegt im Package de.home.caller
    ImageIcon meinIcon = new ImageIcon(ImageLoadManager.loadManager("logic/hans.jpg"));    // Bild liegt im Package de.logic
```

Also gibt mir bitte feedback ob es bei euch so funktioniert.

und wie ihr die Lösung findet.

Hoffe euch allen Geholfen zu haben 

    Dozor         :roll:


----------

