2012年12月7日金曜日

ProcessBuilder - Start another process / JVM - HowTo?

I'm writing a network app, where each Client has a Singleton ClientManager. For testing, I would like to create several clients (each in their own VM / process) without starting the program by hand n-times.

The following two questions on stackoverflow already describe how-to do that:

My Code is based on these, but it's not working:

  • The main program doesn't continue after spawn is called.
  • The spawned code doesn't get executed.

Here's the complete code using 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");    }  }

What am I doing wrong???

 

Answers

I suggest you make HelloWorld2 a top level class. It appears java expects a top level class.

This is the code I tried.

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. getCanonicalName and getName return different names. Which one is right? They are both wrong.
  2. Main3 works.

0 件のコメント:

コメントを投稿