从不同目录启动应用程序(.jar 文件)时,如何获取位于 class 路径中的绝对文件路径?

How to get absolute file path located in class path when starting application (.jar file) from different directory?

假设 Java 应用程序文件夹有这些文件:

app.jar
lib/file.exe

在 app.jar 中,我这样调用 .exe:

String[] exeCmd = new String[]{"lib/file.exe"};
ProcessBuilder pb = new ProcessBuilder(exeCmd);
...

如果我从同一目录启动 .jar 文件 - 一切正常。但是,如果应用程序是从不同的目录启动的 - lib/file.exe 无法找到并且 ProcessBuilder 退出并出现错误 "no such file or directory"。

我的问题是 - 如何获得正确的 lib/file.exe 路径,并将其提供给 ProcessBuilder 尽管应用程序是从其他目录启动的?

编辑:

现在我在想(不同的方法)那些 .exe 之类的文件我应该放在用户目录中,比如 Windows OS 中的 "Application Data" 并稍后使用它们?在 Unix 中调用 System.getenv("APPDATA");System.getProperty("user.home"); 很容易找到路径。但另一方面 - 如果有很多 PC 用户 - 那么这些 .exe 文件将为每个用户复制(磁盘浪费 space)。

你可以这样做:

YourClass.class.getProtectionDomain().getCodeSource().getLocation().getPath();