Pregunta

Quiero poder iniciar un proceso de servidor Java desde una aplicación java existente y monitorear el stdoutput y stderror y redirigir esa salida a un archivo. Es el mejor enfoque para usar 'Runtime.exec' y tratar la aplicación como cualquier otro proceso del sistema operativo o hay algo más adecuado para las nuevas JVM.

Esto está en Java 1.5

¿Fue útil?

Solución

En lugar de Runtime, probablemente debería usar ProcessBuilder , aunque no sé si algo más es aún más apropiado en su caso (ejecutar un proceso Java en particular).

Otros consejos

Sé que llego tarde en este hilo, pero en caso de que alguien lo necesite, en mi experiencia, es más fácil usar ANT para iniciar una aplicación Java. Esto tiene el beneficio de ser independiente de la plataforma. Aquí hay una clase de muestra que hace eso:

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);
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top