ProcessBuilder - Début d'un autre processus / JVM - HowTo?
Je suis en train d'écrire une application de réseau, où chaque Client a un Singleton ClientManager.
Pour tests, je voudrais créer plusieurs clients (chacun dans leur propre VM /processus) sans démarrer le programme à la main n-fois.
Les deux questions suivantes sur stackoverflow déjà décrire comment-faire:
- Est ceci vraiment la meilleure façon de démarrer une deuxième JVM à partir du code Java?
- Java: de l'Exécution d'une application Java dans un processus séparé
Mon Code est sur la base de ces, mais cela ne fonctionne pas:
- Le programme principal ne continue pas après la ponte est appelé.
- Le pondu le code n'est pas exécuté.
Voici le code complet à l'aide de 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");
}
}
Ce que je fais mal???
Btw:
- Je suis à l'aide d'Eclipse.
- Le Singleton problème est un simplifié exemple. S'il vous plaît ne pas suggèrent la création d'une usine.
Solution: HelloWorld2 ne doit pas être un intérieur de classe.
OriginalL'auteur Stefan K. | 2010-07-16
Vous devez vous connecter pour publier un commentaire.
Je vous suggère de faire HelloWorld2 une classe de haut niveau. Il semble java s'attend à une classe de haut niveau.
C'est le code que j'ai essayé.
OriginalL'auteur emory
Je pense que j'en vois un correctif pour résoudre une partie du problème:
process.waitFor()
empêche le contrôle de retour dans main (), avant le sous-processus se termine.À comprendre pourquoi votre engendré processus n'est pas de commencer, je vous recommande d'imprimer tous les arguments de la
ProcessBuilder
constructeur et vérifier qu'une main-disant JVM appelé avec ces arguments réussit. En particulier, vous avez besoin d'un nom de classe pour être le nom d'une classe ayant unstatic void main(String[])
.OriginalL'auteur Carl Smotricz