java - ProcessBuilder - 启动另一个进程/JVM - 如何?

标签 java testing process jvm fork

我正在编写一个网络应用程序,其中每个客户端都有一个 Singleton ClientManager。 对于测试,我想创建多个客户端(每个客户端都在它们自己的 VM/进程中),而无需手动启动程序 n 次。

关于 stackoverflow 的以下两个问题已经描述了如何做到这一点:

我的代码基于这些,但它不起作用:

  • 主程序在调用 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");
  }
}

我做错了什么???

顺便说一句:

  • 我正在使用 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!!!!!!!!!!!" ) ;
    }
}
  1. getCanonicalNamegetName 返回不同的名称。哪一个是对的?他们都错了。
  2. Main3 作品。

关于java - ProcessBuilder - 启动另一个进程/JVM - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3263130/

相关文章:

java - 从 shell 脚本运行 jar

c++ - 玩具 shell 管道不正确

java - 尝试为 DynamoDB 初始化客户端时 Amazon Lambda 超时

java - 格式化输出以供 hibernate 实体内查看是否可以接受?

JavaFX TableView 属性显示 null

unit-testing - 如何单元测试机器控制功能或中间件控制功能

ruby - 如何使用 Ruby 测试/单元执行单个测试?

testing - Testcafe:如何在 Spectrum 颜色选择器的隐藏输入中键入文本

c - 非常奇怪的数组声明问题 - C

linux - 无法在 linux 上杀死 redis-server