Текущий каталог, как уже отмечал Виктор, зависит от команды, используемой для запуска JVM, и поэтому является динамическим во время выполнения.Вместо этого вам нужен локатор, который зависит от расположения самого файла JAR, то есть он динамический во время компиляции, но статический во время выполнения.
Здесь есть разные подходы, поэтому позвольте мне кратко представить два:
Использование сценария запуска
Таким образом, вы просто управляете командной строкой самостоятельно, но вы должны делать это для каждой операционной системы, в которой вы планируете использовать вашу программу.В Windows это может выглядеть так:
app.bat:
cd %~dp0
java -jar app.jar
Дополнительная информация о первой строке здесь .
Использовать System ClassLoader
Это работает, потому что источники System ClassLoader являются динамическими во время компиляции, но статическими во время выполнения, так что именно то, что вам нужно.Однако недостатком является то, что вы не можете записывать в файл конфигурации, так как вы получаете только InputStream
.
app.jar
try (InputStream fXml = ClassLoader.getSystemClassLoader().getResourceAsStream("configFile.xml")) {
...
}
и полный MCVE.
ConfigFile.java:
public class ConfigFile {
public static void main(String[] args) {
try (final BufferedReader configFile = new BufferedReader(
new InputStreamReader(ClassLoader.getSystemClassLoader()
.getResourceAsStream("configFile.txt")))) {
System.out.println(configFile.readLine());
} catch (final IOException exc) {
exc.printStackTrace();
}
}
}
ConfigFile.txt
Hello World
MANIFEST.MF
Manifest-Version: 1.0
Class-Path: .
Main-Class: prv.izruo.test.ConfigFile
командная строка
P:\workspace\ConfigFile>dir deploy
...
02.05.2019 20:43 1.434 configFile.jar
02.05.2019 20:43 11 configFile.txt
P:\workspace\ConfigFile>java -jar deploy\configFile.jar
Hello World