我正在编写一个网络应用程序,其中每个客户端都有一个Singleton ClientManager。 对于测试,我想创建几个客户端(每个客户端都在自己的VM /进程中),而不是手动启动程序n次。
关于stackoverflow的以下两个问题已经描述了如何做到这一点:
我的代码基于这些,但它不起作用:
以下是使用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");
}
}
我做错了什么???
顺便说一下:
解决方案: HelloWorld2不能是内部类。
答案 0 :(得分:2)
我建议你让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!!!!!!!!!!!" ) ;
}
}
答案 1 :(得分:1)
我认为我看到了部分问题的修复:process.waitFor()
阻止控制在子进程结束之前返回main()。
要弄清楚为什么你的生成进程没有启动,我建议打印出ProcessBuilder
构造函数的所有参数,并检查用这些参数调用的手动调用的JVM是否成功。特别是,您需要将该类名称作为具有static void main(String[])
的类的名称。