Lancer le processus JVM depuis une application Java utilise Runtime.exec?

Je veux pouvoir lancer un processus de serveur Java à partir d’une application Java existante, surveiller les sorties stdoutput et stderror et redirect cette sortie vers un fichier. La meilleure approche consiste à utiliser ‘Runtime.exec’ et à traiter l’application comme tout autre processus de système d’exploitation ou existe-t-il un système plus adapté aux nouvelles machines virtuelles?

Ceci est sur Java 1.5

Au lieu de Runtime , vous devriez probablement utiliser ProcessBuilder , bien que je ne sache pas si quelque chose est encore plus approprié dans votre cas (exécuter un processus Java en particulier).

Je sais que je suis en retard dans ce fil de discussion, mais au cas où quelqu’un en aurait besoin, il est plus facile d’utiliser ANT pour lancer une application Java. Cela a l’avantage d’être indépendant de la plate-forme. Voici un exemple de classe qui fait cela:

 package com.sortinglliantnetworks.scheduler.quartz.test; import java.io.File; import java.io.PrintStream; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DefaultLogger; import org.apache.tools.ant.DemuxOutputStream; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Echo; import org.apache.tools.ant.taskdefs.Java; import org.apache.tools.ant.types.Path; public class MyLaunchTest { public static void main(Ssortingng[] args) { Project project = new Project(); project.setBaseDir(new File(System.getProperty("user.dir"))); project.init(); DefaultLogger logger = new DefaultLogger(); project.addBuildListener(logger); logger.setOutputPrintStream(System.out); logger.setErrorPrintStream(System.err); logger.setMessageOutputLevel(Project.MSG_INFO); System.setOut(new PrintStream(new DemuxOutputStream(project, false))); System.setErr(new PrintStream(new DemuxOutputStream(project, true))); project.fireBuildStarted(); System.out.println("running"); Throwable caught = null; try { Echo echo = new Echo(); echo.setTaskName("Echo"); echo.setProject(project); echo.init(); echo.setMessage("Launching Some Class"); echo.execute(); Java javaTask = new Java(); javaTask.setTaskName("runjava"); javaTask.setProject(project); javaTask.setFork(true); javaTask.setFailonerror(true); javaTask.setClassname(MyClassToLaunch.class.getName()); Path path = new Path(project, new File(System.getProperty("user.dir") + "/classes").getAbsolutePath()); javaTask.setClasspath(path); javaTask.init(); int ret = javaTask.executeJava(); System.out.println("java task return code: " + ret); } catch (BuildException e) { caught = e; } project.log("finished"); project.fireBuildFinished(caught); } } 

Si vous décidez d’utiliser Runtime, lisez “When Runtime.exec WonT …”