Запустить процесс JVM из приложения Java, используя Runtime.exec? - PullRequest
19 голосов
/ 26 января 2009

Я хочу иметь возможность запускать процесс Java-сервера из существующего Java-приложения, отслеживать stdoutput и stderror и перенаправлять этот вывод в файл. Наилучший подход - использовать Runtime.exec и обращаться с приложением, как с любым другим процессом ОС, или есть что-то более подходящее для новых JVM.

Это на Java 1.5

Ответы [ 2 ]

18 голосов
/ 26 января 2009

Вместо Runtime вам, вероятно, следует использовать ProcessBuilder, хотя я не знаю, подходит ли что-то еще в вашем случае (в частности, при запуске процесса Java).

12 голосов
/ 06 мая 2009

Я знаю, что опаздываю в этой теме, но, если кому-то это нужно, по моему опыту проще использовать 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);
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...