Nach dem kompilieren werden Bilder nicht mehr gefunden

Bomati

Mitglied
Hey,

ich versuche mein Problem so leicht wie möglich zu beschreiben:

1. In IntellJ kann ich mein Spiel ohne Probleme mit allen Bildern und Funktionen ausführen.
2. Nach dem Kompelieren zu einer Jar findet er meine Bilder aus der Map nicht mehr. (Siehe Bild)
3. Klassen wo ich die Bilder einfach rein geschrieben habe funktionieren einwandfrei nach dem Kompelieren.

Code:

Image background = (new ImageIcon(this.getClass().getResource("/Account.png"))).getImage();

funktioniert ohne Probleme.

----------------------------------

Map:

public class MenuIcons extends IconProvider {

public static final int ITEM_SHOP_BUTTON = 1;
public static final int LEVEL_BUTTON = 2;
public static final int MAIN_MENU = 3;
public static final int BACKGROUND_BUTTON = 4;
public static final int LEVEL_BACKGROUND = 5;



private static final Map<Integer, ImageIcon> ICON_MAP;
static {
Map<Integer, ImageIcon> tempMap = new HashMap<>();

tempMap.put(ITEM_SHOP_BUTTON, getImageFromResources("/ItemshopBtn.png"));
tempMap.put(LEVEL_BUTTON, getImageFromResources("/LevelBtn.png"));
tempMap.put(MAIN_MENU, getImageFromResources("/MainMenu.png"));
tempMap.put(BACKGROUND_BUTTON, getImageFromResources("/NothingField.png"));
tempMap.put(LEVEL_BACKGROUND, getImageFromResources("/LevelLayout.png"));


ICON_MAP = Collections.unmodifiableMap(tempMap);
}

public static ImageIcon getIcon(int iconId) {
return ICON_MAP.get(iconId);
}
}

-------------------------------------------------------------

IconProvider:

public abstract class IconProvider {

protected static ImageIcon getImageFromResources(String path) {
return new ImageIcon(IconProvider.class.getResource(path));
}
}

--------------------------------------------------------------

In der Klasse:

this.getContentPane().add(GuiFactory.createBtn(new Rectangle(80, 135, 300, 50), MenuIcons.getIcon(4), this.ActionListenerPlayer1()));


funktioniert alles in IntellJ perfekt! Wo liegt mein Fehler, dass es in der Jar nicht mehr funktioniert?Console.PNG
 
Hast Du mal in die jar Datei geschaut: Sind da die Bilder enthalten? Evtl. sind die Bilder nicht mit in die JAR Datei kopiert worden?

Und wo im jar File sind die Bilder? Direkt im root?
 
Sind enthalten und liegen direkt beim öffnen drin. Bzw. liegen sie dort eventuell verkehrt? ( In Intellj liegen sie in resources / root )
 
Du entwickelst unter Windows? Evtl. Gross/Kleinschreibung? Windows Dateisystem ist nicht Case Sensitive aber im Jar ist es evtl. Case Sensitive ....

Ist nur eine Vermutung denn ich bin sonst immer unter Unix unterwegs mit Case sensitive Filesystemen ... da stellt sich so eine Problematik nicht erst.
 
Ja unter Windows 10. Habe alle Dateien am Anfang groß geschrieben... ( Im Code auch )

Meinst du wirklich das es daran liegen könnte? Wäre sehr viel Aufwand alles klein zu schreiben bei ca. 100 Bildern.
 
Das ist ok. So Du diese gleich geschrieben hast, ist das nicht das Problem. Also z.B.:
/ItemshopBtn.png hast du im Code geschrieben. Das sollte also dann auch genau so im Jar-File drin sein und nicht als ItemShopBtn.png oder ItemshopBtn.PNG oder so ... (Also einmal noch das S gross und dann beim zweiten die Endung gross ... so als Beispiel ...)

Evtl. einmal Deine Methode ergänzen, so dass da noch die Resource, welche nicht geladen werden konnte, gelogt wird. (Wobei Du das ja auch aus dem StackTrace entnehmen kannst so du das immer so im Code angegeben hast.)

Und das sollte dann soweit richtig sein. Bei "/name" wird "name" an den ClassLoader gegeben mit getSystemResource und das sucht dann nach "name" im classpath. Das jar File selbst ist ja auch im classpath, denn sonst wären die Klassen daraus ja auch nicht zu finden ...

So ist zumindest mein Verständnis der Dokumentation.
 
Bin grade alle Bilder nochmal durchgegangen. Alle richtig mit .png und richtiger Gross/Kleinschreibung. (Bin den Code auch abgegangen richtiger Pfad überall...)

Mir gehen so langsam die Ideen aus... So wie du es dokumentiert hast funktioniert es auch einwandfrei in Intellj.
 
Um sicher zu gehen, dass ich's richtig verstanden habe. Dieses Image background = (new ImageIcon(this.getClass().getResource("/Account.png"))).getImage(); funktioniert aber? Auch wenn als jar gebaut?
 
Hast Du die Lokation der NPE auch genau lokalisiert?
Was mich stört ist, dass dieses blöde "40 more" zu früh kommt. Da hätte ich gerne noch etwas mehr gesehen ....
MenuIcons.java Zeile 25 - Kannst Du da mal den Konstruktor zeigen mit Zeile 25 markiert? Nicht dass wir hier evtl. doch noch an einer falschen Stelle etwas suchen ...
 
X5-599 richtig.

Hab es endlich rausgefunden...

public abstract class IconProvider {

protected static ImageIcon getImageFromResources(String path) {
try {
return new ImageIcon(ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream(path)));
} catch (Exception ex) {
System.out.println(path);
}

return null;
}
}

Warum das andere nicht gegangen ist Frag mich nicht... bin einfach grade glücklich^^

Vielen Dank trotzdem für eure Hilfe!
 
Also nach meinem Verständnis ist der Hauptunterschied bei der Ressourcen-Findung nun, dass beim ClassLoader keine relativen Pfade gegeben werden können. Eine mögliche Erklärung, die mir hier gerade einfallen würde, wäre:
Hast Du evtl. bei einem Aufruf den "/" vergessen? Beim Aufruf auf der Klasse hätte er dann den Namespace der Klasse als relativen Startpunkt genommen. Beim Aufruf über den Classloader ist der relative Pfad nicht gegeben und er startet immer im "root" (wenn man das so bezeichnen möchte).

Aber super, dass Du eine Lösung gefunden hast!
 

Zurück
Oben