如何独立启动第二个Java流程平台?理想情况下,它应该是当前运行的相同Java版本。有没有有用的系统属性?
答案 0 :(得分:10)
您可以使用java.home
系统属性查找当前的JVM:
String jvm = new java.io.File(new java.io.File(System.getProperty("java.home"),
"bin"),
"java").getAbsolutePath();
然后使用ProcessBuilder
(或Runtime.exec
)运行它。
请注意,JDK java.home
指向JDK中包含的JRE目录。
答案 1 :(得分:6)
一般来说,这是不可能的。
@ khachik的回答中提供的配方不一定适用于非Sun的Java实现。
java可执行文件不一定称为java
,不一定存在于bin
子目录中。即使使用Sun Java,在Windows上也有两个可执行文件; java
和javaw
。
启动JVM的命令的命令选项对于不同的Java实现是不同的。因此ProcessBuilder
步骤可能涉及非可移植参数。
虽然大多数JVM采用了主要的Sun java
命令选项,但存在许多差异。例如:
j9
和j9w
作为可执行文件名称。-X
和-XX
选项。 rvm
作为可执行文件名,仅支持Sun的java
选项的子集。ikvm
作为可执行文件名。(注意:这些只是粗略阅读相应在线文档的例子。)
答案 2 :(得分:1)
您是否尝试过使用Apache Commons库?如果您还没试过launcher project。这对我来说非常有用。
以下是其网站上的项目说明:
Launcher Component旨在成为跨平台的Java应用程序启动器。
原始Java类来自Tomcat 4.0项目。
Commons-launcher消除了批处理或shell脚本启动Java类的需要。可能需要消除批处理或shell脚本的一些情况是:
- 您希望避免必须确定某些应用程序路径的位置,例如您的应用程序的主目录等。在Windows批处理脚本中动态确定这一点在某些版本的Windows上或在Unix平台上使用软链接时非常棘手。
- 您希望避免必须处理本机文件和路径分隔符或本机路径引用问题。
- 您需要强制执行某些系统属性,例如使用JDK 1.4运行时的java.endorsed.dirs。
- 您希望允许用户传递自定义JVM参数或系统属性,而无需在脚本中解析和重新排序参数。这在批处理和shell脚本中可能很棘手和/或混乱。 您希望从配置文件引导系统属性,而不是在批处理和shell脚本中对其进行硬编码。
- 您希望提供本地化的错误消息,这在批处理和shell脚本中非常棘手。