使用Runtime.exec从Java应用程序启动JVM进程?
我希望能够从现有的Java应用程序启动Java服务器进程,并监视stdoutput和stderror,并将输出redirect到文件。 是使用“Runtime.exec”并像其他操作系统进程一样处理应用程序的最佳方法,或者是否有更适合新JVM的应用程序。
这是在Java 1.5上
您可能应该使用ProcessBuilder
,而不是Runtime
,尽pipe我不知道在您的情况下是否更合适(特别是运行Java进程)。
我知道我在这个线程中已经晚了,但是如果有人需要它,按照我的经验,使用ANT来启动一个Java应用程序更容易。 这有平台独立的好处。 这是一个示例类,它可以:
package com.trilliantnetworks.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(String[] 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); } }
如果你决定使用运行时,请阅读“当Runtime.exec不会…”