# SomeClass.class.getResourceAsStream(String filename) funktioniert nicht in jar)



## MusicIsLife (7. Apr 2012)

Guten Abend Leute,

ich habe ein Problem beim laden einiger *.png-Dateien, die als ImageIcons für einige Buttons in meinem GUI verwendet werden sollen. Das ganze funktioniert per

```
InputStreamm is = ImagePanel.class.getResourceAsStream("/resource/edit.png");
ImageIcon editIcon = new ImageIcon(ImageIO.read(is));
```
Das Ganze klappt auch ganz wunderbar, wenn ich das Programm aus NetBeans heraus starte. Wenn ich mir allerdings ein .jar builde und dieses ausführen möchte, gibt es eine Exception und das Programm stürzt ab.

Die Fehlermeldung lautet:


```
java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
```

Ich habe bereits probiert, den Stream in nen BufferedInputStream zu kapseln, ich habe \\ statt / im filename geschrieben, ich habe den ersten slash vor resource weggelassen, ich habe 
	
	
	
	





```
ImagePanel.class.getResource(String filename)
```
statt des Streams probiert, und nichts klappt. Er findet die Datei partout nicht. Ob sie im jar sit, habe ich selbstverständlich überprüft. Ich weiß nciht was ich falsch mache. Wenn jemand mich erleuchten möchte: Bitte!!

Vielen Dank!

Gruß

K


----------



## njans (7. Apr 2012)

So würde ich sagen, dass du den Pfad falsch angibst. Du könntest einfach mal deine Verzeichnisstruktur hier reinstellen und dann kann man das ja leicht überprüfen.


----------



## eRaaaa (7. Apr 2012)

Wie sieht denn die Paketstruktur aus von deinem Projekt? 
/resource bedeutet, dass du absolut adressierst, was mir eig. komisch vor kommt, denn dann wäre dein Hauptpackage resource ?!
Ansonsten mal den führenden Slash weglassen (relative Adressierung), dann würde es bedeuten, dass das Paket in welchem sich deine ImagePanel-Klasse befindet, noch ein Unterpaket resource hat (würde für mich mehr Sinn machen)


----------



## L-ectron-X (7. Apr 2012)

Forumsuche?
Grafikdateien laden und anzeigen ? Byte-Welt Wiki


----------



## Noctarius (7. Apr 2012)

```
Foo.class.getClassLoader().getResource("...");
```

ohne [c]getClassLoader()[/c] wird relativ zum Package-Pfad der Klasse gesucht.


----------



## mvitz (7. Apr 2012)

Das ist nicht richtig @Noctarius, durch die Voranstellung eines / ist es wieder absolut und nicht relativ!


----------



## Noctarius (7. Apr 2012)

Ja ok so geht es auch, stimmt.


----------



## MusicIsLife (7. Apr 2012)

Dateistruktur:


```
--dist
  -application.jar
    --core
       - someclass.class
       - someclass.class
       - someclass.class
    --gui
       - someclass.class
       - someclass.class
       - ImagePanel.class
    --main
      - main.class
    --resource
      - draw.png
      - edit.png
      - refresh.png
```


----------



## MusicIsLife (7. Apr 2012)

Das einfachste wär wahrscheinlich, den resource-ordner in den gui-ordner zu verschieben, vllt klappts dann ja. das kann ich mal probieren.


----------



## Noctarius (7. Apr 2012)

Sind doch schon beide Lösungswege genannt worden...


```
ImagePanel.class.getResourceAsStream("/edit.png")
```


```
ImagePanel.class.getClassLoader().getResourceAsStream("edit.png")
```


----------



## MusicIsLife (7. Apr 2012)

Die haben beide witzigerweise ja auch nicht geklappt


----------



## Noctarius (7. Apr 2012)

Was sind denn deine Sourcefolder? Ist resource auch einer? Sonst wird es nicht klappen, das stimmt.


----------



## MusicIsLife (10. Apr 2012)

Gut, wenn der resource-Ordner in den gui-Ordner verschoben und der Pfad dementsprechend angepasst wird, funktiniert es auch nicht.
Könnte es vllt daran liegen, dass ich mein Projekt in NetBeans hab und das (bis jetzt) mit NetBeans auch builde? Ich werd auf jedenfall mal probieren, dass "per Hand" zu builden, wer weiß, keine Ahnung was das ändern sollte, aber versuchen kann mans ja.

Ansonsten bin ich mir 100%ig sicher, dass mit der Pfadangabe alles stimmt und dass die Packagestruktur korrekt ist und der Pfadangabe entspricht.

Schade, dass niemand eine Vermutung hat, worans liegen könnte.


----------



## L-ectron-X (10. Apr 2012)

Ja, wenn man sich fest beißt, ohne mal die Alternativen zu probieren...


----------



## GUI-Programmer (10. Apr 2012)

MusicIsLife hat gesagt.:
			
		

> Ansonsten bin ich mir 100%ig sicher, dass mit der Pfadangabe alles stimmt und dass die Packagestruktur korrekt ist und der Pfadangabe entspricht.



Das hatte ich bei einem meiner Projekte auch mal gedacht. Der Fehler war letztendlich ein Leerzeichen am Ende irgendeines Ordners. Also auch mal die Namen ganz genau nachschauen


----------



## MusicIsLife (14. Apr 2012)

L-ectron-X hat gesagt.:


> Ja, wenn man sich fest beißt, ohne mal die Alternativen zu probieren...



Das ist nicht korrekt. Ich habe diverse Möglichkeiten ausprobiert:


```
ImagePanel.class.getResource("/resource/edit.png")
```


```
ImagePanel.class.getResourceAsStream("/resource/edit.png")
```


```
ImagePanel.class.getClassLoader().getResource("resource/edit.png")
```


```
ImagePanel.class.getClassLoader().getResourceAsStream("resource/edit.png")
```

Bei den Pfaden dann auch jeweils alle Möglichkeiten mit Slashs ausprobiert, ohne, mit /, mit \ mit //, mit \\, die Dateien mitsamt des resource Ordners in den Ordner gesteckt, in dem ImagePanel liegt, sie "lose" reingepackt (und natürlich den Pfad dementsprechend modifiziert), und was nicht alles. 



GUI-Programmer hat gesagt.:


> Das hatte ich bei einem meiner Projekte auch mal gedacht. Der Fehler war letztendlich ein Leerzeichen am Ende irgendeines Ordners. Also auch mal die Namen ganz genau nachschauen



Daran kanns definitiv nciht liegen, wie gesagt, ich arbeite mit netBeans, und wenn cih das Programm aus NetBeans raus ausführe, läuft alles wunderbar. Nur wenn ich mir ein .jar-File erstelle, funktioniert es nciht. habe übrigens auch mal das jarfile über die kommandozeile erstellt, auch das funktioniert nciht.


----------



## L-ectron-X (14. Apr 2012)

MusicIsLife hat gesagt.:


> Das ist nicht korrekt. Ich habe diverse Möglichkeiten ausprobiert...


Dann sag das doch dazu! 

Hast du es mal so probiert?

```
ImagePanel.class.getResource("../resource/edit.png")
```

ImagePanel liegt doch in einem ganz anderen Package als dein Bildchen. Dann musst du es auch erstmal verlassen, um in ein Package/Verzeichnis auf der gleichen Ebene zu gelangen. Du möchtest doch ausgehend von der Datei ImagePanel (welches im Package _gui_ liegt) dein Bild aus dem Package (Verzeichnis) _resource_ laden.
Ansonsten gehst du doch nur in der Verzeichnisstruktur tiefer.


----------



## MusicIsLife (15. Apr 2012)

Nein, funktioniert auch nicht. Von NetBeans aus schon, aber nicht als jar.


----------



## Noctarius (15. Apr 2012)

Also noch mal ganz von vorne ...


```
-JAR-Root
 - gui
  - Foo.class
  - resource
   - Bar.png
```

Pfad ist [c]Foo.class.getResource("resource/Bar.png")[/c] oder [c]Foo.class.getClassLoader().getResource("gui/resource/Bar.png")[/c]


```
-JAR-Root
 - gui
  - Foo.class
 - resource
  - Bar.png
```

Pfad ist [c]Foo.class.getResource("../resource/Bar.png")[/c] oder [c]Foo.class.getClassLoader().getResource("resource/Bar.png")[/c]


----------



## L-ectron-X (15. Apr 2012)

MusicIsLife hat gesagt.:


> Nein, funktioniert auch nicht. Von NetBeans aus schon, aber nicht als jar.


Wie genau erzeugst du dein Jar-File? Wichtig ist, dass du beim Erzeugen vorher das gesamte Kompilat löschst / löschen lässt und danach alles neu erzeugst.

Dafür gibts den Button 
	

	
	
		
		

		
			





 (clean and build).


----------



## MusicIsLife (15. Apr 2012)

Keine der vier Versionen funktioniert als jar, in NetBeans funktioniert alles. Ordnerstruktur selbstverständlich dementsprechend angepasst.

Gibt es evtl. noch andere Möglichkeiten diese Dateien aus dem jar zu laden? 
Notfalls könnte man auch einen lib-Ordner machen, das Zeug darein verschieben und daraus laden?

Ich hab das mal probeirt, bekomme aber auch da nen Fehler. Code:


```
ImageIcon = new ImageIcon(ImageIO.read(ImagePanel.class.getClassLoader().getResourceAsStream("../resource/edit.png")));
```

Verzeichnisstruktur:


```
--lib
  -- resource
    - edit.png
-- Bla.jar
  -- gui
    - ImagePanel.class
```

ClassPath: lib/resource

in Netbeans funktioneirt es mal wieder, aber als jar mit lib ordner im selben Verzeichnis funktioniert auch das nicht. Wobei ich mir hier nciht sicher bin ob mit dem ClassPath und dem Pfad so alles korrekt ist.


----------



## GUI-Programmer (15. Apr 2012)

Ok, dann erstell doch bitte mal deine JAR "von Hand" oder mit ner anderen IDE wie etwa Eclipse. Falls es danach immer noch nicht geht, evtl. Java mal neu installieren - aber nur ne Vermutung. Ansonsten fällt mir da nichts weiter ein.


----------



## L-ectron-X (15. Apr 2012)

MusicIsLife hat gesagt.:


> ```
> ImageIcon = new ImageIcon(ImageIO.read(ImagePanel.class.getClassLoader().getResourceAsStream("../resource/edit.png")));
> ```


Hier fehlt die ImageIcon-Referenz.

Der Code sollte so aussehen:

```
ImageIcon icon = new ImageIcon(getClass().getResource("../resource/edit.png"));
```
oder

```
ImageIcon icon = new ImageIcon(ImagePanel.class.getResource("../resource/edit.png"));
```
Sollte auf jeden Fall funktionieren.


----------



## MusicIsLife (15. Apr 2012)

Sry, die ImageIcon-Referenz ist natürlich da, das hatte ich irgendwie weg "gecopy-pasted". Wie gesagt, aus NetBeans raus funktioniert es ja auch alles.

Und das jar selbst gebaut hab ich auch schon, wie ich weiter oben bereits erwähnt habe.


----------



## GUI-Programmer (15. Apr 2012)

Ok, dann muss es wohl wirklich an etwas anderes liegen. Welche Java Version hast du? Welches Betriebssystem mit Daten?


----------



## L-ectron-X (15. Apr 2012)

Stimme GUI-Programmer zu. Möglicherweise gibt es einen Versionsunterschied zwischen Compiler und Interpreter.

Führe dein Jar-File mal in der Konsole aus: 
	
	
	
	





```
java -jar MeinProgramm.jar
```
Möglicherweise wird dann auch eine Fehlermeldung ausgegeben, die uns/dir weiterhilft.


----------



## Noctarius (15. Apr 2012)

Hört sich eher so an als ob die Resources nicht mit eingepackt werden.


----------



## MusicIsLife (15. Apr 2012)

Das der resource-ordner + inhalt mit im jar liegt, oder auhc im lib ordner, habe ich bestimmt scvhon 5 mal gecheckt. Daran kanns nicht liegen.

Der Fehler:


```
D:\[pfad]\YouFractale\dist>java -jar YouFractale.jar
java.lang.IllegalArgumentException: input == null!
        at javax.imageio.ImageIO.read(Unknown Source)
        at gui.ImagePanel.getResource(ImagePanel.java:222)
        at gui.ImagePanel.<init>(ImagePanel.java:135)
        at gui.FractalFrame.initFrame(FractalFrame.java:28)
        at gui.FractalFrame.<init>(FractalFrame.java:20)
        at youfractale.Main$1.run(Main.java:57)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$000(Unknown Source)
        at java.awt.EventQueue$1.run(Unknown Source)
        at java.awt.EventQueue$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
```

Betriebssystem: Windows 7 SP 1, 64-Bit
Java-Version: 6 update 27
NetBeans: 6.9.1

Ich werde mal auf NetBeans 7.0.1 und java 6u31 updaten, mal sehn ob das was bringt

[EDIT]:

Achwas, warum nicht gleich java 7u3....


----------



## L-ectron-X (15. Apr 2012)

Ja, das kannst du machen, wird aber an der Situation nichts ändern.
Das Image wird nicht gefunden/geladen, deshalb wird eine IllegalArgumentException generiert. 
	
	
	
	





```
null
```
 wird als Argument für die read()-Methode nicht zugelassen.

Das hängt wahrscheinlich an der von dir gewählten Konstellation ImageIO und ImageIcon.
Machs doch nicht so kompliziert...
Du kannst das Image direkt dem ImageIcon übergeben.

Aus der Fehlermeldung ist zu entnehmen, dass du den oben geposteten Code wahrscheinlich noch nicht ausprobiert hast.


----------



## mvitz (15. Apr 2012)

Liegen die Resourcen jetzt im JAR oder im lib Ordner? Und wenn sie im lib Ordner liegen, wie sieht das MANIFEST.MF deiner JAR Datei aus?


----------



## MusicIsLife (15. Apr 2012)

Bei resourcen im lib-ordner:

Manifest.mf:

```
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_27-b07 (Sun Microsystems Inc.)
Class-Path: lib/resource
X-COMMENT: Main-Class will be added automatically by build
Main-Class: youfractale.Main
```


```
ImageIcon i = new ImageIcon(ImagePanel.class.getClassLoader().getResource("../resource/edit.png"));
```


----------



## MusicIsLife (15. Apr 2012)

OK, jetzt funktioneiert es. Und zwar:


```
-- resource
  - bla.png
  - blub.png
--Foo.jar
  -- gui
    - Foo.class
```


```
ImageIcon i = new ImageIcon("resource/bla.png");
```


----------



## mvitz (15. Apr 2012)

MusicIsLife hat gesagt.:


> Bei resourcen im lib-ordner:
> 
> Manifest.mf:
> 
> ...



In dem Falle genügt ein entweder 
	
	
	
	





```
new ImageIcon(ImagePanel.class.getResource("/edit.png"));
```

oder 
	
	
	
	





```
new ImageIcon(ImagePanel.class.getResource("/resource/edit.png"));
```
 wenn du die MANIFEST.MF in folgende änderst

```
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_27-b07 (Sun Microsystems Inc.)
Class-Path: lib
X-COMMENT: Main-Class will be added automatically by build
Main-Class: youfractale.Main
```


----------

