22

如何在运行时获取当前运行的 JVM 的可执行文件的位置?我想使用 ProcessBuilder 类将另一个 JVM 实例化为子进程。

我知道有java.homeSystem 属性,但这并没有指定 JVM 可执行文件的位置。我知道我可以做这样的事情来获得路径:

System.getProperties().getProperty("java.home") + File.pathSeparator + "bin" + File.pathSeparator + "java"

此代码与平台无关,因为 Windows 可执行文件的名称是java.exe,而不是java. 有没有办法获取考虑平台特性的 JVM 可执行文件的路径?

4

5 回答 5

12

您总是可以只使用 os.name 来检查用户是否正在运行 Windows。这将适用于 OS X、Linux 和 Windows

String jvm_location;
if (System.getProperty("os.name").startsWith("Win")) {
    jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java.exe";
} else {
    jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java";
}
于 2014-06-18T21:07:26.117 回答
6

以下代码使用current获取当前java可执行文件的路径。ProcessHandle.InfoProcessHandle

结果被包装,Optional因为对命令信息的访问可能受到操作系统权限的限制。

String javaExecutablePath = ProcessHandle.current()
    .info()
    .command()
    .orElseThrow();
于 2020-05-18T01:13:47.003 回答
2

该线程对涵盖多个平台的问题进行了有趣的讨论: Finding current executable's path without /proc/self/exe

鉴于该讨论,如果您真的需要它,应该可以编写一些 JNI 包装器,使#ifdef 是当前平台并进行适当的本机调用。

如果你只在 Linux 上,'/proc/self/exe' 是一个指向正在运行的实际可执行文件的符号链接。这样做的好处是不依赖于任何环境变量(即 PATH 或 JAVA_HOME)。但正如我所说,它绝对不是平台独立的。

于 2013-05-13T18:53:34.147 回答
0

是的,有一种方法可以获取 JVM 可执行文件的路径(如果存在)。将其包含在应用程序的配置中。有很多方法可以做到这一点: 命令行参数 -- java myApp.Main /path/to/Java; 属性——java -Dpath.to.java=/path/to/java; 等等

如果您想要真正的平台独立性,那么您的整个方案就有缺陷,因为无法保证 JVM 可执行文件的存在。我可以想象一个不需要 java 可执行文件的 JVM。

如果您想要 99.99% 的平台独立性,那么我认为您拥有所需的工具。

于 2010-08-03T02:36:38.733 回答
-4

您正在尝试分叉整个 JVM。

  1. 这是非常低效的,主要是因为另一个 java 进程很重。如果您大量执行此操作,那么您的程序将非常缓慢
  2. 正是因为这个原因才存在线程

但是如果你真的需要,你可以尝试直接执行java -arguments,因为大多数标准的 java 安装都将 java 放在 cli 路径上。

于 2010-08-03T02:26:49.353 回答