Der Absolute Pfad für die Projekt-Ordner in Java
Viel Verwirrung bei diesem Thema. Mehrere Fragen gestellt zu haben. Die Dinge scheinen immer noch unklar.
ClassLoader, Absolute Dateipfade etc etc
Angenommen ich habe ein Projekt-Verzeichnis-Struktur,
MyProject-- --dist --lib --src --test
Ich eine Ressource, die sagen "txtfile.txt" in "lib/txt" gespeichert. Ich will es in ein system Unabhängiger Weise. Ich brauche den absoluten Pfad des Projekts.
Also kann ich code den Pfad als abspath+"/lib/Dictionary/txtfile.txt"
Nehme an, dass ich dies tun
java.io.File file = new java.io.File(""); //Dummy file
String abspath=file.getAbsolutePath();
Bekomme ich das aktuelle Arbeitsverzeichnis, das ist nicht unbedingt die Projekt-root.
Angenommen, führe ich das Finale 'prj.jar' aus dem "dist" - Ordner, die enthält auch "lib/txt/txtfile.txt" directory-Struktur und-Ressourcen,sollte Es funktionieren, auch hier. Ich soll den absoluten Pfad des dist Ordner.
Hoffe das problem ist klar.
Tatsächlich, Java kümmert sich nicht um die Schrägstrich-Richtungen, aber Sie können nur geben Sie nicht-root-Laufwerke explizit da
/
verweist auf das Stammverzeichnis des aktuellen Datenträgers.System.getProperty("file.separator") return "\" für Windows-Umgebungen und "/" für Unix (und Unix-like).
ja, das ist in der Datei als Trennzeichen, aber Java wird noch erkennen, Pfade mit Hilfe der vorwärts-Schrägstriche zu verwenden, versuchen Sie, das nächste mal müssen Sie einen Pfad auf Windows.
InformationsquelleAutor Nitish Upreti | 2010-07-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie wirklich mit getResource() oder getResourceAsStream() mit Ihrem class-loader für diese Art der Sache. Insbesondere, diese Methoden verwenden Sie Ihre ClassLoader, um zu bestimmen, den suchkontext für die Ressourcen in Ihrem Projekt.
Angeben, so etwas wie
getClass().getResource("lib/txtfile.txt")
um zu Holen die text-Datei.Klären: anstatt darüber nachzudenken, wie man den Pfad der Ressource, die Sie sollten darüber nachdenken immer die Ressource-in diesem Fall eine Datei in einem Verzeichnis irgendwo (möglicherweise innerhalb Ihrer JAR). Es ist nicht notwendig zu wissen, einige absolute Pfad in diesem Fall nur einige URL zu der Datei, und den ClassLoader zurück diese URL für Sie. Wenn Sie möchten, öffnen Sie einen stream zu der Datei, können Sie das direkt tun, ohne Gefummel mit einer URL mit
getResourceAsStream
.Den Ressourcen, die Sie zugreifen möchten, durch den ClassLoader brauchen, um auf dem Class-Path (konfiguriert im Manifest der JAR-Datei). Dies ist kritisch! Der ClassLoader verwendet die Klasse-Pfad zu den Ressourcen, so dass, wenn Sie nicht genügend Kontext, in den Class-Pfad kann es nicht, etwas zu finden. Wenn Sie hinzufügen
.
den ClassLoader beheben sollten, alles, was innerhalb oder außerhalb des JAR-je nachdem, wie Sie beziehen sich auf die Ressource, aber man kann sicherlich genauer sein.Bezogen auf die Ressource Präfix
.
wird die Ursache der ClassLoader zu sehen auch für Dateien, die außerhalb der JAR-Datei, zwar nicht, indem der Ressourcen-Pfad mit einer Frist leitet der ClassLoader zu suchen, die nur innerhalb der JAR-Datei.Dass heißt, wenn Sie eine Datei innen das JAR in ein Verzeichnis
lib
mit dem Namenfoo.txt
und Sie wollen, um die Ressource dann würden Sie laufengetResource("lib/foo.txt");
Wenn die gleiche Ressource, die draußen waren, das GLAS, das Sie laufen lassen würde
getResource("./lib/foo.txt");
Ich Verstand die Tatsache, dass es bearbeitet werden muss, die von der Klasse loader. aber wie? java.net.URL URL =getClass().getResource("lib/txtfile.txt"); gibt zurück ein null-URL für mich!
Die dist-Ordner hatte prj.jar + "lib/txt/txtfile" Ressource. ( Ressource ausgeliefert außerhalb jar ) ich Plane tar den dist Ordner in das Ende, um es zu verteilen
in diesem Fall müssen Sie hinzufügen "." zu den class-path im Manifest der JAR-und der Anruf sollte
getResource("lib/txt/txtfile")
Ich fügte hinzu, dieses java.net.URL URL=getClass().getClassLoader().getResource("english.txt"); java.net.URL url2 =getClass().getClassLoader().getResource("common-misspells.txt"); wo lib/Wörterbuch war in meinem classpath schon. sc.initialize(url.getPath(),url2.getPath()); wo initialisiert wurde eine Bibliothek Methode, die ich verwenden müssen. Dies funktioniert, wenn ich kompilieren von netbeans, aber die jar-Datei im dist-Ordner immer noch nicht finden die Wörterbuch-Dateien(obwohl Sie vorhanden sind). Auch Das MANIFEST.MF enthalten : Class-Path: lib/jaspellbin.jar lib/Wörterbuch
InformationsquelleAutor Mark Elliot
Erstens, stellen Sie sicher, dass die lib-Verzeichnis in den classpath. Sie können tun dies, indem Sie die Kommandozeilen-parameter in der startup-Skript:
speichern Sie diese als MyProject/start.sh oder eine os-abhängige Skript.
Dann können Sie den Zugriff auf die textfile.txt (wie richtig erwähnt von Mark):
InformationsquelleAutor naikus
@Mark richtig ist. Das ist bei weitem die einfachste und robusteste Ansatz.
Jedoch, wenn Sie wirklich haben, um eine
File
, dann Ihre beste Wette ist, versuchen Sie Folgendes:Eine alternative ist die Einbettung der Projekt-Verzeichnis Namen in ein wrapper-Skript und legen Sie es als ein-system-Eigenschaft, die über die option-D. Es ist auch möglich, ein wrapper-Skript herauszufinden, seine eigene absolute Pfadnamen, z.B. über
whence
.InformationsquelleAutor Stephen C