Eclipse Runnable jar exportiert keine Textures?

Tobero

Mitglied
2021-03-01 15_17_22-Workspace - Planets_src_Planets_tile_Tile.java - Eclipse IDE.png
Ich möchte gerne Projekt exportieren, aber als ich es probiert habe es zu öffnen, stand da, das es die Textures nicht findet. Mach ich etwas falsch? Muss ich da etwas anders machen als wie einfach nur export as runnable drücken? Ich benutze übrigens Eclipse
 
Frage: Wie lädst du die Daten aus dem res Ordner? Ich vermute direkt über das Filesystem -> Dies musst du über das Laden von Resourcen machen (also getRessource / getRessourceAsStream von Class oder Classloader.)

Generell müssen die Dateien in einem Pfad sein, der für Eclipse einen Source Ordner darstellt. Dazu entweder den Ordner mit den Dateien in src verschieben oder den Ort als Source Ordner hinzu fügen.

Dann werden die Dateien auch in das jar File kopiert aus dem Du es dann laden kannst (So Du es übe den Classloader lädst).
 
Ich habe den res folder als Bibliothek hinzugefügt und lade die dann über res/textures
[CODE lang="java" title="Mein Dateien Lade Klasse"]public class ImageLoader {

public static BufferedImage loadImage(String path) {
try {
System.out.println(path);
return ImageIO.read(ImageLoader.class.getResource(path));
} catch (IOException e) {
e.printStackTrace();
System.out.println("Didn't find: " + path);
System.exit(1);
return null;
}
}

}[/CODE]
 
Ok, das Gute ist dann wohl, dass Du das laden schon korrekt machst über getRessource/getRessourceAsStream.

Aber Bibliothek einbinden besagt ja nur, dass dies eine Abhängigkeit ist, die er mit betrachten soll. Dadurch wird da nichts gebaut und auch nichts in JAR File kopiert (ggf. wenn Du ein sogenanntnes fat Jar baust vielleicht, weil dann alle Abhängigkeiten mit kopiert werden ...)

Aber das ist es doch nicht unbedingt. Es ist mehr ein Bestandteil deiner Applikation, daher sollte das innerhalb eines Source Ordners sein. Also wie gesagt: entweder direkt in src verschieben oder den Ordner als Source Ordner hinzufügen (Aber wenn Du den Ordner res als Source Ordner hinzufügst, dann geht das aus dem classpath verloren und statt /res/... ist es nur noch /....)
 
Ich habe jetzt den res Ordner in den Source gegeben und aus den Bibliothek gelöscht. Ich habe auch das res/textures zu /textures geändert, doch wenn ich es exportiere, dann wird es immer noch nicht gefunden. Wenn ich es über eclipse mache, dann geht aber alles
 
Wie sieht denn der Inhalt der Jar-Datei aus? Sind die Dateien dort enthalten, und wenn ja, unter welchem Pfad?
 
Ich weiß nicht ganz, was du unter Inhalt meinst. Eigentlich will ich ja, das ich damit mein Programm aufrufen kann. Und ich habe alles in dieser Datei.
 
Ich weiß nicht ganz, was du unter Inhalt meinst.
Eine .jar-Datei ist nichts anderes als eine .zip-Datei.
Du kannst die .jar-Datei kopieren (sicherheitshalber), sie (möglicherweise) von .jar in .zip umbenennen und sie dann entpacken.
Dann kannst du dir den Inhalt der Datei ansehen (und insbesondere gucken, ob und wo deine Textures liegen).
 
Zuletzt bearbeitet:
Wenn die so direkt im jar File sind, dann solltest Du diese mittels getResource oder getResourceAsStream laden können. Dabei ist die Gross-/Kleinschreibung zu beachten und es darf kein führendes /res geben. Also etwas wie:
getClass().getResourceAsStream("/textures/MyTexture.png")
 
Ich erhalte damit ein Bild, wenn ich es manuell mache, aber ich habe das ganze mit einem lade system gemacht. Ich denke, das es nicht funktioniert weil es keine Files bekommt?
[CODE lang="java" title="Assets Klasse"]private static void showFiles(String path, String directory) throws IOException {
//In diesem Fall ist es: path = "/textures"; directory = "textures"
File[] files = new File(path).listFiles();
if (files == null) {
return;
}

for (File file : files) {
if (file.isDirectory()) {
showFiles(path + "/" + file.getName(), directory + "/" + file.getName());
} else {
textureAtlas.put(file.getName(), ImageLoader.loadImage("/" + directory + "/" + file.getName()));
}
}
[/CODE]
 
Ja, das musst du dann so ändern, dass es über den Classloader läuft und nicht mehr über File.

Und bezüglich auflisten der Ressourcen in einem gegebenen Classpath wäre dann ggf. folgender Link interessant:
 
Jetzt habe ich das problem, das die Ordner nicht mehr als Ordner erkannt werden. Es läd alle Datei die in dem ersten Ornder, aber geht dann nicht weiter
Code:
List<String> files = ImageLoader.getResourceFiles(path);
        
        if (files == null) {
            return;
        }
        
        for (String nameOfFile : files) {
            File file = new File(path +"/"+ nameOfFile);
            if (file.isDirectory()) {
                showFiles(path + "/" + nameOfFile, directory + "/" + nameOfFile);
                System.out.println(path + "/" + nameOfFile);
[CODE lang="java" title="ImageLoader"]public static List<String> getResourceFiles(String path) throws IOException {
List<String> filenames = new ArrayList<>();

try (
InputStream in = getResourceAsStream(path);
BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
String resource;

while ((resource = br.readLine()) != null) {
filenames.add(resource);
}
}

return filenames;
}

private static InputStream getResourceAsStream(String resource) {
final InputStream in
= getContextClassLoader().getResourceAsStream(resource);

return in == null ? ImageLoader.class.getResourceAsStream(resource) : in;
}

private static ClassLoader getContextClassLoader() {
return Thread.currentThread().getContextClassLoader();
}[/CODE]
 

Zurück
Oben