2016-05-16 8 views
0

Ich habe vor einiger Zeit ein Spiel in Eclipse gebaut. Ich wollte es wie üblich in ein .jar exportieren. Ich habe das schon mal gemacht und mit meinen anderen Projekten funktioniert es. Dies funktioniert nicht, weil es einen leeren weißen Bildschirm gibt. Ich habe ein System.exit (1) an verschiedenen Stellen eingefügt, um zu sehen, wo das Programm nicht mehr funktioniert. Irgendwann fand ich die Stelle. Es scheint nicht zu sein, meine .txt-Datei zu finden, aber in Eclipse, wenn es funktioniert. Ich habe die .jar mit 7zip (wie winzip) überprüft und die .txt-Datei ist da drin. Ich benutzte auch die Befehlszeile, um es zu öffnen, und es gibt denselben Fehler, die TXT-Datei nicht zu finden. Ich habe viel im Internet und Stackflow für Leute gesucht, die ähnliche Probleme mit ähnlichen Problemen haben, aber leider keine Lösung.Java Spiel Eklipse kann .txt nach dem Export nach .jar nicht finden

Der Code, der eine neue Welt macht, ist dies.

world = new World(handler,"res/worlds/world1.txt"); 

In der Welt nennt es diese Funtion:

loadWorld(path); 

Diese funtion einen String wieder zurück sollte. Zuerst ruft es eine andere Funktion die Zeichenfolge zu erhalten:

String file = Utils.loadFileAsString(path); 

Schließlich ist dies der Code, der nicht funktioniert, weil die Datei nicht gefunden werden kann.

public static String loadFileAsString(String path){ 
    StringBuilder builder = new StringBuilder(); 

    try{ 

     BufferedReader br = new BufferedReader(new FileReader(path)); 
     String line; 
     while((line = br.readLine()) != null) 
      builder.append(line + "\n"); 
     br.close(); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 
    return builder.toString(); 
} 

Gibt es etwas, das ich vermisst habe? Eclipse läuft gut, aber nach dem Exportieren wird die .txt nicht exportiert, aber sie ist immer noch da. Vielen Dank im Voraus.

+3

http://Stackoverflow.com/a/20389418/2958086 es ist nicht Teil der traditionellen Struktur in einem Glas. – Compass

+0

Errata nach oben, traditionelle * Dateipfad * Struktur. – Compass

Antwort

0

Die Java-Klasse File (die von FileReader verwendet wird) operiert auf Betriebssystemebene den Dateisystempfad, entweder absolut oder relativ zum aktuellen Arbeitsverzeichnis. Ihr Beispiel bezeichnet einen relativen Pfad. Ich bitte "res/world/..." direkt hinter deinem Projektordner in Eclipse. Beim Ausführen einer App in Eclipse ist das aktuelle Verzeichnis der Projektpfad selbst. Daher hat dein Code in Eclipse funktioniert.

Wird eigenständig ausgeführt (durch Starten eines JAR), kann die Datei nicht im selben Betriebssystempfad gefunden werden. Es befindet sich im Glas. Daher müssen Sie darauf zugreifen, indem Sie die Funktionen zum Laden von Ressourcen Ihres Classloaders verwenden.

0

Das ist ein relativer Pfad. Relative Pfade werden relativ zu der Stelle aufgelöst, an der Sie sich beim Ausführen der Anwendung befinden. In der Eclipse ist dies standardmäßig das Projektverzeichnis. Wenn Sie das Glas jedoch extern ausführen, hängt es ganz davon ab, wie Sie das Glas ausführen.

Eine gängige Lösung besteht darin, das Glas immer an der gleichen Stelle wie die Ressource (world1.txt) anzuordnen. Beispiel: Die folgende Verzeichnisstruktur ...

-lib 
--main.jar 
-res 
--worlds 
---world1.txt 
main.sh 

Dann müssen Sie ein Basisverzeichnis in Ihre Anwendung importieren. Eine Möglichkeit besteht darin, den absoluten Pfad zu main.jar als Befehlszeilenargument, Systemeigenschaft oder Umgebungsvariable zu übergeben.

Ein anderer gebräuchlicher Ansatz besteht darin, den Pfad der laufenden jar-Datei mit einer Technik wie this zu erhalten.

schließlich in Ihrer Anwendung, statt einen relativen Pfad verwenden, können Sie einen absoluten Pfad verwenden:

String world1Path = baseDirectory + "res/worlds/world1.txt" 
0

Wenn Sie ein Archiv-Lesegerät (wie 7-Zip) haben öffnen Sie die .jar und sehen, ob Ihre .txt-Datei befindet sich in der .jar-Datei. Wenn nicht, kopieren Sie einfach die TXT-Datei in die JAR-Datei.Das ist mir passiert, als ich versucht habe, ein .png für eine Java-Anwendung zu verwenden. Hoffe es klappt!

Verwandte Themen