# Bild aus Jar  kann nach Export nicht mehr gefunden werden



## bennsoncat (8. Feb 2016)

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:


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


```
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?


----------



## Thallius (8. Feb 2016)

Ich würde es mal mit der Suchfunktion probieren. Diese Frage kommt hier jede Woche mindestens einmal...


----------



## JStein52 (8. Feb 2016)

Hast du es mal so probiert:

ClassLoader.class.getResourceAsStream(resourcesPath);


----------



## bennsoncat (8. Feb 2016)

JStein52 hat gesagt.:


> Hast du es mal so probiert:
> 
> ClassLoader.class.getResourceAsStream(resourcesPath);


Funktioniert leider auch nur in Eclipse.
Auserhalb von Eclipse gibts diese Fehlermeldung:

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


----------



## bennsoncat (8. Feb 2016)

Thallius hat gesagt.:


> Ich würde es mal mit der Suchfunktion probieren. Diese Frage kommt hier jede Woche mindestens einmal...


Ich habe diese Funktion bereits genutzt, nur haben mir die Ergebnisse davon nicht weitergeholfen.


----------



## JStein52 (8. Feb 2016)

Hmm .... ich habe gerade mal folgendes unter Windows probiert:


```
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 ?


----------



## bennsoncat (8. Feb 2016)

JStein52 hat gesagt.:


> Hmm .... ich habe gerade mal folgendes unter Windows probiert:
> 
> 
> ```
> ...


Danke für die Antwort. Das hat mit einem / davor funktioniert.
Ich kenne nun den "Fehler":

Funktioniert NICHT:

```
ImageIO.read(ClassLoader.getSystemResourceAsStream("images" + File.separator + file));
```

Funktioniert:

```
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?


----------



## JStein52 (8. Feb 2016)

Huch, stimmt. Ist bei mir auch so aber ich weiss nicht warum ??


----------



## RalleYTN (12. Feb 2016)

bennsoncat hat gesagt.:


> Danke für die Antwort. Das hat mit einem / davor funktioniert.
> Ich kenne nun den "Fehler":
> 
> Funktioniert NICHT:
> ...


Du kannst als Trenner entweder "\\" oder "/" verwenden. Ich empfehle den Gebrauch von "/". funktioniert garantiert auf jedem System.


----------



## JStein52 (12. Feb 2016)

@RalleYTN , das erklärt aber noch nicht warum es mit File.separator nicht funktioniert.


----------



## RalleYTN (12. Feb 2016)

JStein52 hat gesagt.:


> @RalleYTN , das erklärt aber noch nicht warum es mit File.separator nicht funktioniert.


File.separator gibt doch bloß "\" zurück. Du brauchst aber "\\". Hast du es schon mal mit File.separator + File.separator ausprobiert? Es ist bloß witzig. Ich glaube nicht, dass das so sein soll. Vielleicht sollte man das als Bug bei Oracle reporten XD


----------



## JStein52 (12. Feb 2016)

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 ?


----------



## RalleYTN (12. Feb 2016)

JStein52 hat gesagt.:


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


----------



## kneitzel (13. Feb 2016)

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.


----------

