Bild aus Jar kann nach Export nicht mehr gefunden werden

bennsoncat

Mitglied
Hallo, ich möchte ein Bild als BufferedImage auslesen. Das Bild ist in der Jar. Unter Linux funktioniert es problemlos. Leider musste ich feststellen, dass es unter Windows nur in Eclipse funktioniert, nicht aber, sobald ich dir Jar exportiert habe.
Hier meine Klasse dafür:

Java:
package game;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ImageLoader {

   public static BufferedImage loadBufferedImage(String file) {
     try {
       return ImageIO.read(ClassLoader.getSystemResourceAsStream("images" + File.separator + file));
     } catch (IOException e) {
       e.printStackTrace();
     }
     return null;
   }

}

Meine Bilder sind in einem image Package. Wie gesagt funktioniert es unter Linux und unteer Windows zumindest in Eclipse.

Hier die Ausgabe unter Windows:

Java:
Exception in thread "main" java.lang.NullPointerException
  at game.ImageLoader.loadBufferedImage(ImageLoader.java:15)

Was muss ich ändern, damit es auch als exportierte Jar läuft?
 
Hast du es mal so probiert:

ClassLoader.class.getResourceAsStream(resourcesPath);
Funktioniert leider auch nur in Eclipse.
Auserhalb von Eclipse gibts diese Fehlermeldung:
Java:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: input
 == null!
  at javax.imageio.ImageIO.read(Unknown Source)
  at game.ImageLoader.loadBufferedImage(ImageLoader.java:13)

Ich habe es schon mit einem / davor und ohne versucht. Funktioniert beides nicht.
 
Hmm .... ich habe gerade mal folgendes unter Windows probiert:

Code:
        final String resourcesPath = "images/bumpMap.png";
        InputStream stream = getClass().getResourceAsStream(resourcesPath);
und das funktioniert innerhalb NetBeans und ausserhalb, egal aus welchem Verzeichnis ich die Jar-Datei ausführe. Zu Eclipse kann ich nichts sagen. Und wenn es auf Linux funktioniert scheint es ja eher an irgendwelchen Umgebungsvariablen zu liegen ( z.B. CLASSPATH ??) Wie sieht zum Beispiel die Manifest-Datei im Jar-File aus ?
 
Zuletzt bearbeitet:
Hmm .... ich habe gerade mal folgendes unter Windows probiert:

Code:
        final String resourcesPath = "images/bumpMap.png";
        InputStream stream = getClass().getResourceAsStream(resourcesPath);
und das funktioniert innerhalb NetBeans und ausserhalb, egal aus welchem Verzeichnis ich die Jar-Datei ausführe. Zu Eclipse kann ich nichts sagen. Und wenn es auf Linux funktioniert scheint es ja eher an irgendwelchen Umgebungsvariablen zu liegen ( z.B. CLASSPATH ??) Wie sieht zum Beispiel die Manifest-Datei im Jar-File aus ?
Danke für die Antwort. Das hat mit einem / davor funktioniert.
Ich kenne nun den "Fehler":

Funktioniert NICHT:
Java:
ImageIO.read(ClassLoader.getSystemResourceAsStream("images" + File.separator + file));

Funktioniert:
Java:
ImageIO.read(ClassLoader.getSystemResourceAsStream("images/" + file));

Ich habe zwischen images und file immer File.separator genutzt.
Wenn ich das durch "/" austausche funktioniert es.

Unter Linux gibt File.separator "/" zurück.
Unter Windows jedoch "\".

Mir was das bewusst und es sollte extra so sein, damit es auf jedem System läuft.

Warum funktioniert das nur mit einem / und nicht mit dem System separator?
 
Danke für die Antwort. Das hat mit einem / davor funktioniert.
Ich kenne nun den "Fehler":

Funktioniert NICHT:
Java:
ImageIO.read(ClassLoader.getSystemResourceAsStream("images" + File.separator + file));

Funktioniert:
Java:
ImageIO.read(ClassLoader.getSystemResourceAsStream("images/" + file));

Ich habe zwischen images und file immer File.separator genutzt.
Wenn ich das durch "/" austausche funktioniert es.

Unter Linux gibt File.separator "/" zurück.
Unter Windows jedoch "\".

Mir was das bewusst und es sollte extra so sein, damit es auf jedem System läuft.

Warum funktioniert das nur mit einem / und nicht mit dem System separator?
Du kannst als Trenner entweder "\\" oder "/" verwenden. Ich empfehle den Gebrauch von "/". funktioniert garantiert auf jedem System. 🙂
 
Das benutze ich an anderen Stellen aber ständig und es funktioniert. Und es funktioniert hier ja auch wenn man das ganze in Eclipse oder NetBeans laufen lässt.
Und das "\\" braucht man doch nur zum entwerten des zweiten \ in einem String-Literal ?? Oder sehe ich das falsch ?
 
Das benutze ich an anderen Stellen aber ständig und es funktioniert. Und es funktioniert hier ja auch wenn man das ganze in Eclipse oder NetBeans laufen lässt.
Und das "\\" braucht man doch nur zum entwerten des zweiten \ in einem String-Literal ?? Oder sehe ich das falsch ?
keine Ahnung ich benutze ganz einfach immer "/".
Funktioniert in 101% aller Fälle. 😉
 
Also das mit dem "\\" ist ja nur ein Encoding für den Compiler und da kommt dann halt der einzelne Backslash bei raus. So wie es auch in File.separator (unter Windows) gespeichert ist. Zwei File.separator zu nutzen ist also unsinnig.

Das Problem könnte schlicht daran liegen, dass der Code, der etwas aus einem Jar File holt, nur / verarbeiten kann und er dort den \ nicht als Trenner für Verzeichnisse erkennt. Das erklärt, dass es unter eclipse funktioniert (Da ist es halt nur auf dem Filesystem und dort ist der \ der offizielle Trenner) und eben nicht, sobald es um ein jar File geht.
 

Zurück
Oben