当前位置:  开发笔记 > 编程语言 > 正文

使用Runtime.exec从Java应用程序启动JVM进程?

如何解决《使用Runtime.exec从Java应用程序启动JVM进程?》经验,为你挑选了2个好方法。

我希望能够从现有的Java应用程序启动Java服务器进程并监视stdoutput和stderror并将该输出重定向到文件.是使用'Runtime.exec'的最佳方法,并像对待任何其他操作系统进程一样处理应用程序,或者是否有更适合新JVM的方法.

这是在Java 1.5上



1> Fabian Steeg..:

相反的Runtime,你应该使用ProcessBuilder,虽然我不知道别的东西,甚至是你的情况(特别是运行的Java进程)更合适.


ProcessBuilder正是用于此目的的工具.您可以轻松挂钩进程的out/err,甚至将err重定向到out,这样您就不必监视两个流(除非您想要).您必须自己编写流I/O代码...请参阅BufferedInputReader.

2> 小智..:

我知道我在这个帖子中已经迟到了,但是如果有人需要它,根据我的经验,使用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);
}
}

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有