我有一些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.
如果您还无法使用新的 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.home使用系统属性查找 java 运行时sun.java.command系统属性是否可用(IBM JVM 则不然),然后从中提取程序主类和程序参数。-cp或参数来重建命令行-jarRuntime.getRuntime().exec还有很多关于 JNLP (WebStart) 和 macOS 应用程序的内容。我假设您对此不感兴趣,但如果您愿意,我可以解释一下。
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |