ProcessBuilder - 启动另一个进程/ JVM - HowTo?
问题描述:
我在写一个网络应用程序,每个客户端都有一个Singleton ClientManager。 对于测试,我想创建几个客户端(每个在他们自己的虚拟机/进程),而无需手工启动程序n次。ProcessBuilder - 启动另一个进程/ JVM - HowTo?
上计算器下面两个问题已经描述了如何-做到这一点:
- Is this really the best way to start a second JVM from Java code?
- Java: Executing a Java application in a separate process
我的代码是基于这些,但它不工作:
- 调用spawn后主程序不会继续。
- 产生的代码没有得到执行。
下面是一个使用ProcessBuilder的完整代码:
public class NewVM {
static class HelloWorld2 {
public static void main(String[] args) {
System.out.println("Hello World");
System.err.println("Hello World 2");
}
}
public static void main(String[] args) throws Exception {
startSecondJVM(HelloWorld2.class, true);
startSecondJVM(HelloWorld2.class, false);
System.out.println("Main");
}
public static void startSecondJVM(Class<? extends Object> clazz, boolean redirectStream) throws Exception {
System.out.println(clazz.getCanonicalName());
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,
clazz.getCanonicalName());
processBuilder.redirectErrorStream(redirectStream);
Process process = processBuilder.start();
process.waitFor();
System.out.println("Fin");
}
}
我在做什么错???
BTW:
- 我使用Eclipse。
- 单例问题是一个简化的的例子。请做不是建议创建一个工厂。
解决方案: HelloWorld2不能是内部类。
答
我建议你让HelloWorld2成为*课程。看起来java期望一个*的类。
这是我试过的代码。
class Main
{
static class Main2
{
public static void main (String [ ] args)
{
System . out . println ("YES!!!!!!!!!!!") ;
}
}
public static void main (String [ ] args)
{
System . out . println (Main2 . class . getCanonicalName ()) ;
System . out . println (Main2 . class . getName ()) ;
}
}
class Main3
{
public static void main (String [ ] args)
{
System . out . println ("YES!!!!!!!!!!!") ;
}
}
- 另一方面,getCanonicalName和的getName返回不同的名称。哪一个是对的?他们都错了。
- Main3作品。
答
我想我看到了部分问题的修复:process.waitFor()
防止控制在子进程结束前返回到main()。
要找出生成的进程没有启动的原因,建议将所有参数打印到ProcessBuilder
构造函数中,并检查使用这些参数调用的手动JVM是否成功。特别是,您需要该类名称作为具有static void main(String[])
的类的名称。