ProcessBuilder - Запустить другой процесс / JVM - Как? - PullRequest
3 голосов
/ 16 июля 2010

Я пишу сетевое приложение, в котором у каждого Клиента есть Singleton ClientManager. Для тестирования я хотел бы создать несколько клиентов (каждый в своей виртуальной машине / процессе) без запуска программы вручную 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");
  }
}

Что я делаю не так ???

Btw:

  • Я использую Eclipse.
  • Проблема Синглтона - это упрощенный пример. Пожалуйста, не предложите создать фабрику.

Решение: HelloWorld2 не должен быть внутренним классом.

Ответы [ 2 ]

2 голосов
/ 16 июля 2010

Я предлагаю вам сделать HelloWorld2 классом высшего уровня.Похоже, Java ожидает класса верхнего уровня.

Это код, который я пытался.разные имена.Какой из них прав?Они оба не правы.

Main3 работает.
1 голос
/ 16 июля 2010

Я думаю, что вижу исправление для части проблемы: process.waitFor() предотвращает возврат элемента управления в main () до завершения подпроцесса.

Чтобы выяснить, почему ваш порожденный процесс не запускается, я бы порекомендовал распечатать все аргументы для конструктора ProcessBuilder и убедиться, что вызываемая вручную JVM с этими аргументами успешно выполнена. В частности, вам нужно, чтобы это имя класса было именем класса, имеющего static void main(String[]).

...