使用与当前可执行文件相同的可执行文件启动Java进程

时间:2017-12-21 12:33:31

标签: java

我有一些Java代码启动了一个新的Java进程,有效地使用了默认的系统JRE(在我的例子中是JDK 8)。相反,我需要它与运行原始进程的版本(例如JDK 9)一起运行。

我该怎么做? (该解决方案需要适用于Java 8和9。)

详细

代码当前仅通过发出java ...命令来依赖于默认系统JRE。另一种方法是使用类似于System.getProperty("java.home") + "/bin/java"的东西(但与平台无关),但两者都有相同的问题(对我来说):它们使用系统已知的JVM版本启动Java进程。

更新这是完全错误的,System.getProperty("java.home")确实做了我想要的并返回当前JVM的主目录。 (愚蠢的我,我以为我试过了。)

使用相同Java版本启动的一种方法是询问当前进程的可执行文件并重用该文件,但我没有找到API。

2 个答案:

答案 0 :(得分:3)

仅限Java 9的解决方案。随着

ProcessHandle.current().info().command().map(Paths::get).orElseThrow();

你得到了当前java可执行文件的句柄:<JAVA_HOME>/bin/java[.exe]

现在,根据自己的喜好使用新的Process API(绝对)路径。

答案 1 :(得分:3)

如果您还不能使用新的Java 9 API,请转到:

static String getJavaRuntime() throws IOException {
    String os = System.getProperty("os.name");
    String java = System.getProperty("java.home") + File.separator + "bin" + File.separator +
            (os != null && os.toLowerCase(Locale.ENGLISH).startsWith("windows") ? "java.exe" : "java");
    if (!new File(java).isFile()) {
        throw new IOException("Unable to find suitable java runtime at "+java);
    }
    return java;
}

有关详细信息,您可以查看我们如何在JOSM&#39; restart action中执行此操作,其中包含以下要求:

  • 致力于Java 8 +,Linux,Windows和macOS
  • 使用java直接运行jar文件或类文件(例如从IDE)
  • 使用Java Web Start和macOS打包应用程序
  • 使用包含空格字符的路径

代码如下:

  • 使用java.home系统属性
  • 查找java运行时
  • 检查sun.java.command系统属性是否可用(不是IBM JVM的情况),然后从中提取程序主类和程序参数。
  • 通过添加-cp-jar参数重建命令行,具体取决于我们在上一步中找到的内容
  • 使用Runtime.getRuntime().exec
  • 运行命令

还有很多关于JNLP(WebStart)和macOS应用程序的东西。我认为你对此并不感兴趣,但如果你愿意,我可以解释一下。