Wenn man mit Java eine JAR-Datei ausführt, dann wird nicht die JAR-Datei ausgeführt, sondern der Java-Bytecode dieser JAR-Datei. Der Java-Bytecode liegt aber nicht im Speicherort der JAR-Datei und somit können Referenzen wie bsp. new File("serverlog.txt");
nicht richtig gefunden werden, wenn man davon ausgegangen ist, dass in diesem Fall die Datei serverlog.txt
im selben Ordner wie die ausgeführte JAR-Datei zu finden ist.
Man muss sich deshalb den zur Laufzeit gültigen Pfad der JAR-Datei holen. Für dieses Vorhaben habe ich mir eine eigene Methode geschrieben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** * Returns the path where the currently running JAR-file is located. * Example value: C:\MyProject\build\jar\ * @return Path of the JAR-file */ public static String getJarExecutionDirectory() { String jarFile = null; String jarDirectory = null; int cutFileSeperator = 0; int cutSemicolon = -1; jarFile = System.getProperty("java.class.path"); // Cut seperators cutFileSeperator = jarFile.lastIndexOf(System.getProperty("file.separator")); jarDirectory = jarFile.substring(0, cutFileSeperator); // Cut semicolons cutSemicolon = jarDirectory.lastIndexOf(';'); jarDirectory = jarDirectory.substring(cutSemicolon+1, jarDirectory.length()); return jarDirectory+System.getProperty("file.separator"); } |
Diese Methode liefert aber nur den richtigen Ort, wenn man die JAR Datei über die Konsole (java -jar meinprojekt.jar
) ausführt. Deswegen möchte ich anhand eines Beispiels noch einen zweiten, zuverlässigeren Weg aufzeigen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | String propertiesFilePath = "client.properties"; File propertiesFile = new File(propertiesFilePath); if (!propertiesFile.exists()) { try { CodeSource codeSource = MainView.class.getProtectionDomain().getCodeSource(); File jarFile = new File(codeSource.getLocation().toURI().getPath()); String jarDir = jarFile.getParentFile().getPath(); propertiesFile = new File(jarDir + System.getProperty("file.separator") + propertiesFilePath); } catch (Exception ex) { } } System.out.println(propertiesFile.getAbsolutePath()); |