我有一些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。
答案 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.home
系统属性sun.java.command
系统属性是否可用(不是IBM JVM的情况),然后从中提取程序主类和程序参数。-cp
或-jar
参数重建命令行,具体取决于我们在上一步中找到的内容Runtime.getRuntime().exec
还有很多关于JNLP(WebStart)和macOS应用程序的东西。我认为你对此并不感兴趣,但如果你愿意,我可以解释一下。