如何启动第二个Java进程?

时间:2010-12-12 12:36:29

标签: java process runtime.exec

如何独立启动第二个Java流程平台?理想情况下,它应该是当前运行的相同Java版本。有没有有用的系统属性?

3 个答案:

答案 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上也有两个可执行文件; javajavaw

  • 启动JVM的命令的命令选项对于不同的Java实现是不同的。因此ProcessBuilder步骤可能涉及非可移植参数。


虽然大多数JVM采用了主要的Sun java命令选项,但存在许多差异。例如:

  • IBM J9使用j9j9w作为可执行文件名称。
  • BEA / Oracle JRockit有不同的-X-XX选项。
  • Jikes RVM使用rvm作为可执行文件名,仅支持Sun的java选项的子集
  • IKVM使用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脚本中非常棘手。
  •