这**真的是从Java代码启动第二个JVM的最佳方式吗?

Rob*_*ier 39 java jvm multiprocessing

这是我自己上一个问题的后续问题,我很尴尬地问这个......但无论如何:你将如何以独立于系统的方式从独立的Java程序启动第二个JVM?并且不依赖于例如像JAVA_HOME这样的env变量,因为它可能指向与当前正在运行的JRE不同的JRE.我提出了以下代码,它实际上有效,但感觉有点尴尬:

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();
}
Run Code Online (Sandbox Code Playgroud)

此外,当前运行的JVM可能已经启动了第二个JVM不知道的其他一些参数(-D,-X ...,...).

Ste*_*n C 6

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

  1. 可能尚未设置JAVA_HOME变量,
  2. 用于启动JVM的命令名称可能不同(例如,如果它不是Sun JVM),或者
  3. 命令行选项可能不同(例如,如果它不是Sun JVM).

如果我的目标是在启动(第二个)JVM时实现最大的可移植性,我想我会使用包装器脚本来实现.


djn*_*jna 5

我不清楚你在启动辅助进程时总是想要使用完全相同的参数,类路径或其他任何东西(特别是-X类的东西 - 例如,为什么孩子需要与父元素相同的堆设置).

我宁愿使用某种外部配置来为子节点定义这些属性.这是一项更多的工作,但我认为最终你需要灵活性.

要查看可能的配置设置的范围,您可以查看Eclipse中的"运行配置"设置.这里有相当多的标签配置.


小智 5

要查找代码当前正在运行的java可执行文件(即问题示例代码中的'path'变量),apache ant中有一个可以帮助您的实用程序方法.您不必使用ant构建代码 - 只需将其用作库,即可使用此方法.

它是:

org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable( "Java" 的)

它处理了其他人提到的不同JVM供应商的特殊情况.(并查看它的源代码,有比我想象的更多的特殊情况.)

它在ant.jar中.ant是在Apache许可下发布的,所以希望你可以随心所欲地使用它而不用麻烦.