Est *ce* vraiment la meilleure façon de démarrer une deuxième JVM à partir du code Java?
C'est un suivi à mon propre question précédente et je suis un peu gêné de demander à cet... Mais de toute façon: comment voulez-vous commencer une deuxième JVM autonome à partir d'un programme Java dans un système de manière indépendante? Et sans s'appuyer sur, par exemple, une variable env comme JAVA_HOME qui pourraient pointer vers un autre JRE que celui qui est actuellement en cours d'exécution. Je suis venu avec le code suivant qui fonctionne réellement, mais se sent juste un peu maladroit:
public static void startSecondJVM() throws Exception {
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,
AnotherClassWithMainMethod.class.getName());
Process process = processBuilder.start();
process.waitFor();
}
Également, en cours d'exécution de la JVM peut avoir été commencé avec quelques autres paramètres (-D, -X..., ...) que le deuxième JVM ne sait pas sur.
- Ressembler le code a été prise à partir de cette réponse, stackoverflow.com/a/723914/3520484.
Vous devez vous connecter pour publier un commentaire.
Il n'est pas clair pour moi que vous en voulez toujours utiliser les mêmes paramètres de classpath, ou que ce soit (notamment les X, ce genre de choses - par exemple, pourquoi les enfants ont besoin même tas de paramètres comme ses parents) lors du démarrage d'un processus secondaire.
Je préfère utiliser une configuration externe de quelque sorte pour définir ces propriétés pour les enfants. C'est un peu plus de travail, mais je pense que dans la fin, vous aurez besoin de la flexibilité.
À voir dans la mesure du possible, les paramètres de configuration vous pouvez regarder thye "Run Configurations" paramètres dans Eclipse. Tout à fait quelques onglets valeur de configuration.
Je pense que la réponse est "Oui". C'est probablement aussi bon que vous pouvez le faire en Java en utilisant le système de code indépendant. Mais sachez que ce n'est relativement indépendant du système. Par exemple, dans certains systèmes:
Si je visais pour un maximum de portabilité dans le lancement d'une (seconde) de la JVM, je pense que je voudrais faire à l'aide de scripts wrapper.
Pour trouver l'exécutable java que votre code est actuellement en cours d'exécution en vertu de l' (c'est à dire le 'chemin' variable dans votre question, un exemple de code) il y a un utilitaire de méthode au sein de apache ant qui peuvent vous aider. Vous n'avez pas à construire votre code avec ant - il suffit de l'utiliser comme une bibliothèque, pour cette méthode.
C'est:
org.apache.outils.ant.util.JavaEnvUtils.getJreExecutable("java")
Il prend en charge le tri des cas spéciaux avec différentes JVM vendeurs que d'autres l'ont mentionné. (Et en regardant le code source, il y a plus de cas particuliers que je ne l'aurais imaginé.)
C'est dans ant.jar. ant est distribué sous la licence Apache, donc nous espérons que vous pouvez utiliser comme vous le voulez, sans tracas.