Dies ist ein sehr verwirrendes Thema, und wir müssen einige Konzepte verstehen, bevor wir eine echte Lösung bieten können.
-
Die Ansätze File und NIO File Api mit relativen Pfaden ""
oder "."
verwenden intern den Systemparameter "user.dir"
Wert, um den Rückgabeort zu bestimmen.
-
Der Wert von "user.dir
" basiert auf dem Benutzer-Arbeitsverzeichnis, und das Verhalten dieses Wertes hängt vom Betriebssystem und der Art und Weise ab, wie das JAR ausgeführt wird.
-
Zum Beispiel wird das Ausführen eines JAR von Linux aus einem Datei-Explorer (Öffnen durch Doppelklick) user.dir
auf das Benutzerverzeichnis setzen, unabhängig vom Standort des JARs. Wenn das gleiche JAR von der Befehlszeile aus ausgeführt wird, wird es den JAR-Standort zurückgeben, weil jeder cd
-Befehl zum JAR-Standort das Arbeitsverzeichnis geändert hat.
Nachdem das gesagt wurde, werden die Lösungen unter Verwendung von Java NIO
, Files
oder "user.dir"
Eigenschaft für alle Szenarien funktionieren, sofern "user.dir"
den korrekten Wert hat.
String userDirectory = System.getProperty("user.dir");
String userDirectory2 = new File("").getAbsolutePath();
String userDirectory3 = Paths.get("").toAbsolutePath().toString();
Wir könnten den folgenden Code verwenden:
new File(MyApp.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.toURI().getPath())
.getParent();
um den aktuellen Standort des ausgeführten JARs zu erhalten, und persönlich habe ich folgenden Ansatz verwendet, um den erwarteten Standort zu erhalten und die "user.dir"
Systemeigenschaft zu Beginn der Anwendung zu überschreiben. So erhalte ich später, wenn die anderen Ansätze verwendet werden, immer die erwarteten Werte.
Mehr Details hier -> https://blog.adamgamboa.dev/getting-current-directory-path-in-java/
public class MyApp {
static {
//Dieser statische Block wird ganz am Anfang der APP ausgeführt, noch vor der Hauptmethode.
try{
File file = new File(MyApp.class.getProtectionDomain().getCodeSource()
.getLocation().toURI().getPath());
String basePath = file.getParent();
//Überschreibt den bestehenden Wert von "user.dir"
System.getProperties().put("user.dir", basePath);
}catch(URISyntaxException ex){
//Fehler protokollieren
}
}
public static void main(String args []){
//Logik Ihrer App
//All diese Ansätze sollten unabhängig von der Art und Weise, wie das JAR ausgeführt wird, den erwarteten Wert zurückgeben.
String userDirectory = System.getProperty("user.dir");
String userDirectory2 = new File("").getAbsolutePath();
String userDirectory3 = Paths.get("").toAbsolutePath().toString();
}
}
Ich hoffe, dass diese Erklärung und Details für andere hilfreich sind...