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 ...,...).
我认为答案是肯定的.这可能与使用系统无关代码在Java中可以做的一样好.但请注意,即使这只是相对系统独立.例如,在某些系统中:
如果我的目标是在启动(第二个)JVM时实现最大的可移植性,我想我会使用包装器脚本来实现.
我不清楚你在启动辅助进程时总是想要使用完全相同的参数,类路径或其他任何东西(特别是-X类的东西 - 例如,为什么孩子需要与父元素相同的堆设置).
我宁愿使用某种外部配置来为子节点定义这些属性.这是一项更多的工作,但我认为最终你需要灵活性.
要查看可能的配置设置的范围,您可以查看Eclipse中的"运行配置"设置.这里有相当多的标签配置.
小智 5
要查找代码当前正在运行的java可执行文件(即问题示例代码中的'path'变量),apache ant中有一个可以帮助您的实用程序方法.您不必使用ant构建代码 - 只需将其用作库,即可使用此方法.
它是:
org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable( "Java" 的)
它处理了其他人提到的不同JVM供应商的特殊情况.(并查看它的源代码,有比我想象的更多的特殊情况.)
它在ant.jar中.ant是在Apache许可下发布的,所以希望你可以随心所欲地使用它而不用麻烦.
| 归档时间: |
|
| 查看次数: |
21419 次 |
| 最近记录: |