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

Nic*_*lai 5 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.

vip*_*vip 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;
}
Run Code Online (Sandbox Code Playgroud)

更多细节你可以看看我们在 JOSM 的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 应用程序的内容。我假设您对此不感兴趣,但如果您愿意,我可以解释一下。