2009-08-04 23 views
35

这是我的own previous question的后续,我有点不好意思问这个问题......但无论如何:你将如何以独立于系统的方式从独立Java程序启动第二个JVM?而且不需要依赖像JAVA_HOME这样的env变量,因为它可能指向与当前运行的JRE不同的JRE。我想出了下面的代码,实际工作,但感觉只是一点点尴尬:*这真的是从Java代码启动第二个JVM的最佳方式吗?

public static void startSecondJVM() throws Exception { 
    String separator = System.getProperty("file.separator"); 
    String classpath = System.getProperty("java.class.path"); 
    String path = System.getProperty("java.home") 
       + separator + "bin" + separator + "java"; 
    ProcessBuilder processBuilder = 
       new ProcessBuilder(path, "-cp", 
       classpath, 
       AnotherClassWithMainMethod.class.getName()); 
    Process process = processBuilder.start(); 
    process.waitFor(); 
} 

此外,当前正在运行的JVM可能已经开始与一些其他的参数(-D,-X ... .. )第二个JVM不知道。

+0

看起来像代码是从这个答案采取http://stackoverflow.com/a/723914/3520484。 – Mark 2016-09-24 16:24:46

回答

5

对于我而言,在启动时,您总是希望使用完全相同的参数,classpath或任何内容(特别是-X种东西 - 例如,为什么孩子需要与其父母相同的堆设置)一个辅助过程。

我宁愿使用某种外部配置来为孩子定义这些属性。这有点多,但我认为最终你需要灵活性。

要查看可能的配置设置的范围,您可以查看Eclipse中的“运行配置”设置。这里有很多值得配置的选项卡。

+0

JVM的配置文件是一个好主意。我认为它应该可以在对话框中编辑,以便用户可以但不需要调整参数(很像Eclipse例子)。感谢那。 我也瞄准的是可执行文件的路径。正如Stephen C所说的,如果JVM的可执行文件不被称为“java”,代码将不起作用。是否有任何系统无关的方式来找到可执行文件的名称? – 2009-08-05 18:06:48

+0

正因为如此,我目前正在使用名称不是“java”的可执行文件。我正在用传统的Java产生。我的机器上至少有4个不同的java可执行文件,并且“不是java”的javas。你无法可靠地推论,所以为什么不把java的路径作为可配置项目之一。您将会看到,这实际上是Eclipse所做的,尽管配置方式不是很容易。 – djna 2009-08-05 21:29:46

6

我认为答案是“是”。这可能与使用独立于系统的代码在Java中所做的一样好。但请注意,即使这只是相对于系统无关的。例如,在一些系统:

  1. JAVA_HOME变量可能没有被设置,
  2. 命令名称用来启动一个JVM(如果它不是一个太阳JVM如)可能会有所不同,或
  3. 命令行选项可能不同(例如,如果它不是Sun JVM)。

如果我打算在启动(第二个)JVM时实现最大的可移植性,我想我会使用包装脚本来完成它。

5

要找到您的代码当前正在运行的java可执行文件(即您的问题示例代码中的'path'变量),apache ant中有一个实用程序方法可以帮助您。你不必用蚂蚁建立你的代码 - 只需使用它作为一个库,为这一个方法。

是:

org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable(的“java”)

它需要的那种特殊情况下有不同的JVM厂商,其他人已经提到的护理。 (并且看它的源代码,有比我想象中更多的特殊情况。)

它在ant.jar中。 ant是在Apache许可证下发布的,因此希望你可以毫无麻烦地使用它。

相关问题