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

MusicIsLife

Mitglied
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
Java:
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:

Code:
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
Java:
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

Top Contributor
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

Top Contributor
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)
 

Noctarius

Top Contributor
Java:
Foo.class.getClassLoader().getResource("...");

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

MusicIsLife

Mitglied
Dateistruktur:

Code:
--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
 

Noctarius

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

Java:
ImagePanel.class.getResourceAsStream("/edit.png")
Java:
ImagePanel.class.getClassLoader().getResourceAsStream("edit.png")
 

MusicIsLife

Mitglied
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.
 

GUI-Programmer

Top Contributor
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

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

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

Java:
ImagePanel.class.getResource("/resource/edit.png")
Java:
ImagePanel.class.getResourceAsStream("/resource/edit.png")
Java:
ImagePanel.class.getClassLoader().getResource("resource/edit.png")
Java:
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.

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

Gesperrter Benutzer
Das ist nicht korrekt. Ich habe diverse Möglichkeiten ausprobiert...
Dann sag das doch dazu! ;)

Hast du es mal so probiert?
Java:
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.
 

Noctarius

Top Contributor
Also noch mal ganz von vorne ...

Code:
-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]

Code:
-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]
 
Zuletzt bearbeitet:

L-ectron-X

Gesperrter Benutzer
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
l-ectron-x-albums-bilder-beitraegen-picture136-netbeans-clean-build.gif
(clean and build).
 

MusicIsLife

Mitglied
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:

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

Verzeichnisstruktur:

Code:
--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.
 
Zuletzt bearbeitet:

GUI-Programmer

Top Contributor
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

Gesperrter Benutzer
Java:
ImageIcon = new ImageIcon(ImageIO.read(ImagePanel.class.getClassLoader().getResourceAsStream("../resource/edit.png")));
Hier fehlt die ImageIcon-Referenz.

Der Code sollte so aussehen:
Java:
ImageIcon icon = new ImageIcon(getClass().getResource("../resource/edit.png"));
oder
Java:
ImageIcon icon = new ImageIcon(ImagePanel.class.getResource("../resource/edit.png"));
Sollte auf jeden Fall funktionieren.
 

MusicIsLife

Mitglied
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.
 

L-ectron-X

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

Führe dein Jar-File mal in der Konsole aus:
Code:
java -jar MeinProgramm.jar
Möglicherweise wird dann auch eine Fehlermeldung ausgegeben, die uns/dir weiterhilft.
 

MusicIsLife

Mitglied
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:

Code:
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....
 
Zuletzt bearbeitet:

L-ectron-X

Gesperrter Benutzer
Ja, das kannst du machen, wird aber an der Situation nichts ändern.
Das Image wird nicht gefunden/geladen, deshalb wird eine IllegalArgumentException generiert.
Code:
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

Top Contributor
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

Mitglied
Bei resourcen im lib-ordner:

Manifest.mf:
Code:
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

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

MusicIsLife

Mitglied
OK, jetzt funktioneiert es. Und zwar:

Code:
-- resource
  - bla.png
  - blub.png
--Foo.jar
  -- gui
    - Foo.class

Java:
ImageIcon i = new ImageIcon("resource/bla.png");
 
Zuletzt bearbeitet:

mvitz

Top Contributor
Bei resourcen im lib-ordner:

Manifest.mf:
Code:
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

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

In dem Falle genügt ein entweder
Java:
new ImageIcon(ImagePanel.class.getResource("/edit.png"));

oder
Java:
new ImageIcon(ImagePanel.class.getResource("/resource/edit.png"));
wenn du die MANIFEST.MF in folgende änderst
Code:
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Fehlermeldung: Error: Could not find or load main class set Caused by: java.lang.ClassNotFoundException: set AWT, Swing, JavaFX & SWT 5
T Szene wechselen JavaFX mit If in Main Class AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
F JavaFX ListView füllen in Controller Class AWT, Swing, JavaFX & SWT 12
L JavaFX Control Pseudo Class AWT, Swing, JavaFX & SWT 1
J Swing The serializable class FMFrame does not declare a static final serialVersionUID field of type long AWT, Swing, JavaFX & SWT 5
K JavaFX Unresolved class button bar AWT, Swing, JavaFX & SWT 8
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
A JavaFX Controller Class saveFile AWT, Swing, JavaFX & SWT 2
J private inner class AWT, Swing, JavaFX & SWT 4
C JavaFX Controller class AWT, Swing, JavaFX & SWT 2
T FileFilter: class File wird nicht gefunden AWT, Swing, JavaFX & SWT 2
H Could not find main class: ... AWT, Swing, JavaFX & SWT 10
F Applet JApplet per html einbinden - Main class kann nicht gefunden werden AWT, Swing, JavaFX & SWT 15
U AWT local variable * is accessed from within inner class; needs to be declared final AWT, Swing, JavaFX & SWT 6
A Applet main class aus anderer main class aufrufen AWT, Swing, JavaFX & SWT 15
A Zeichnen auf JFrame aus anderer class heraus AWT, Swing, JavaFX & SWT 12
D LayoutManager Main layout auf andere Class Dateien verweisen? AWT, Swing, JavaFX & SWT 17
K Cannot find symbol: class JCanvas AWT, Swing, JavaFX & SWT 8
J Calling a method from another class AWT, Swing, JavaFX & SWT 2
T Compiler erzeugt mehrere .class Dateien AWT, Swing, JavaFX & SWT 2
G JButton aus JPanel Class nicht erreichbar AWT, Swing, JavaFX & SWT 7
R Methode der Class im JComboBox abfragen AWT, Swing, JavaFX & SWT 2
J serializable class GUI does not declare a static final s. AWT, Swing, JavaFX & SWT 2
S Class in einer anderen Class ausführen? AWT, Swing, JavaFX & SWT 5
P ImageIconDemo.class AWT, Swing, JavaFX & SWT 2
D Eclipse RCP & Hibernate: <Class> not mapped AWT, Swing, JavaFX & SWT 4
5 JFileChooser und JPanel in Java Class einbauen. AWT, Swing, JavaFX & SWT 3
R DataVector bei TableModel - Class Cast Exception AWT, Swing, JavaFX & SWT 9
M GridbagLayout&Class will Member nicht kennen =( AWT, Swing, JavaFX & SWT 2
H JFileChooser und Class Instanz AWT, Swing, JavaFX & SWT 2
Tom299 JavaFX -> fxmlLoader -> getResourceAsStream Problem AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben