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

2022-09-01 02:13:21

这是我自己上一个问题的后续,我有点尴尬地问这个问题......但无论如何:您将如何以独立于系统的方式从独立的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();
}

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


答案 1

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

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

如果我的目标是在启动(第二个)JVM时获得最大的可移植性,我想我会使用包装器脚本来完成它。


答案 2

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

我更喜欢使用某种外部配置来为子级定义这些属性。这需要做更多的工作,但我认为最终你需要灵活性。

要查看可能的配置设置的范围,您可以查看 Eclipse 中的“运行配置”设置。那里有相当多的标签值得配置。


推荐