Launch JVM process from a Java application use Runtime.exec?

后端 未结 2 1217
南旧
南旧 2020-11-28 12:47

I want to be able to launch a Java server process from an existing java application and monitor the stdoutput and stderror and redirect that output to a file. Is the best a

相关标签:
2条回答
  • 2020-11-28 13:11

    Instead of Runtime, you should probably use ProcessBuilder, though I don't know if something else is even more appropriate in your case (running a Java process in particular).

    0 讨论(0)
  • 2020-11-28 13:33

    I know I am late in this thread, but in case someone needs it, in my experience, it is easier to use ANT to launch a Java application. This has the benefit of being platform independent. Here is a sample class that does that:

    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);
    }
    }
    
    0 讨论(0)
提交回复
热议问题