Ejecutar una aplicación Java en un proceso separado

Resuelto Ande Turner asked hace 15 años • 9 respuestas

¿Se puede cargar una aplicación Java en un proceso separado usando su nombre, en lugar de su ubicación, de manera independiente de la plataforma?

Sé que puedes ejecutar un programa a través de...

Process process = Runtime.getRuntime().exec( COMMAND );

... el problema principal de este método es que dichas llamadas son específicas de la plataforma.


Lo ideal sería incluir un método en algo tan simple como...

EXECUTE.application( CLASS_TO_BE_EXECUTED );

... y pase el nombre completo de una clase de aplicación como CLASS_TO_BE_EXECUTED.

Ande Turner avatar Mar 12 '09 04:03 Ande Turner
Aceptado

Esta es una síntesis de algunas de las otras respuestas que se han proporcionado. Las propiedades del sistema Java proporcionan suficiente información para generar la ruta al comando java y la ruta de clase en lo que, creo, es una forma independiente de la plataforma.

public final class JavaProcess {

    private JavaProcess() {}        

    public static int exec(Class klass, List<String> args) throws IOException,
                                               InterruptedException {
        String javaHome = System.getProperty("java.home");
        String javaBin = javaHome +
                File.separator + "bin" +
                File.separator + "java";
        String classpath = System.getProperty("java.class.path");
        String className = klass.getName();

        List<String> command = new LinkedList<String>();
        command.add(javaBin);
        command.add("-cp");
        command.add(classpath);
        command.add(className);
        if (args != null) {
            command.addAll(args);
        }

        ProcessBuilder builder = new ProcessBuilder(command);

        Process process = builder.inheritIO().start();
        process.waitFor();
        return process.exitValue();
    }

}

Ejecutarías este método así:

int status = JavaProcess.exec(MyClass.class, args);

Pensé que tenía sentido pasar la clase real en lugar de la representación de cadena del nombre, ya que la clase tiene que estar en el classpath de todos modos para que esto funcione.

hallidave avatar Apr 07 '2009 01:04 hallidave

Dos pistas:

System.getProperty("java.home") + "/bin/java"le proporciona una ruta al ejecutable de Java.

((URLClassLoader) Thread.currentThread().getContextClassLoader()).getURL()le ayuda a reconstruir el classpath de la aplicación actual.

Entonces tu EXECUTE.applicationes solo (pseudocódigo):

Process.exec(javaExecutable, "-classpath", urls.join(":"), CLASS_TO_BE_EXECUTED)

stepancheg avatar Mar 12 '2009 02:03 stepancheg