Esta es una continuación de mi la propia pregunta y estoy un poco avergonzado preguntar esto… Pero de todos modos: ¿cómo se inicia una segunda JVM independiente programa de Java en un sistema de forma independiente? Y sin depender de por ejemplo un env como variable JAVA_HOME como que podría apuntar a un diferente JRE que el que se está ejecutando actualmente. Se me ocurrió el siguiente código que realmente funciona, pero se siente un poco torpe:

public static void startSecondJVM() throws Exception {
    String separator = System.getProperty("file.separator");
    String classpath = System.getProperty("java.class.path");
    String path = System.getProperty("java.home")
                + separator + "bin" + separator + "java";
    ProcessBuilder processBuilder = 
                new ProcessBuilder(path, "-cp", 
                classpath, 
                AnotherClassWithMainMethod.class.getName());
    Process process = processBuilder.start();
    process.waitFor();
}

También, el que actualmente se ejecuta en la JVM hayan empezado con algunos otros parámetros (-D, -X…, …) que el segundo JVM no conozca.

3 Comentarios

  1. 5

    No es claro para mí que siempre desee utilizar exactamente los mismos parámetros, classpath, o lo que sea (especialmente-X tipo de cosas – por ejemplo, ¿por qué el niño necesita el mismo montón de configuración como sus padres) al momento de iniciar un proceso secundario.

    Yo prefiero usar una configuración externa de algún tipo para definir estas propiedades para los niños. Es un poco más de trabajo, pero creo que al final usted tendrá la flexibilidad.

    Para ver el alcance de las posibles opciones de configuración que usted puede buscar en las «Run Configurations» configuración de Eclipse. Muy pocas fichas por valor de configuración de allí.

    • Un archivo de configuración para la JVM es una buena idea. Creo que debe ser editable en un cuadro de diálogo para que los usuarios puedan, pero no necesita ajustar los parámetros (como el Eclipse ejemplo). Gracias por que. Lo que también estaba destinado a fue la ruta de acceso al ejecutable. Como Stephen C menciona el código no funcionará si el archivo ejecutable de la JVM no se llama «java». Es allí cualquier sistema independiente de la forma de encontrar el nombre del ejecutable?
    • Como sucede actualmente estoy trabajando con java cuyo ejecutable no es «java» por el nombre. Y estoy de desove de una tradicional de Java. Y tengo por lo menos 4 diferentes java ejecutables onmy de la máquina, y para no «java» javas. Usted no puede deducir la forma fiable, así que ¿por qué no incluir la ruta de acceso de java como uno de los elementos configurables. Usted verá que esto es en realidad lo que Eclipse no, aunque en un no muy fácil de configurar manera.
    • ¿Por qué es este el aceptado la respuesta? si no responde a la pregunta que está a la espera de una respuesta «sí» o «no», y en la posterior situación que suponga una alternativa para el «no».
  2. 6

    Creo que la respuesta es «Sí». Esto probablemente tan bueno como se puede hacer en Java utilizando el sistema de código independiente. Pero ser conscientes de que esto es sólo relativamente sistema independiente. Por ejemplo, en algunos sistemas:

    1. la variable JAVA_HOME no han sido establecidas,
    2. el nombre del comando se utiliza para iniciar una JVM puede ser diferente (por ejemplo, si no es una JVM de Sun), o
    3. las opciones de línea de comandos puede ser diferente (por ejemplo, si no es una JVM de Sun).

    Si me estaba apuntando para la máxima portabilidad en el lanzamiento de una (segunda) de la JVM, creo que me gustaría hacer uso de contenedor de secuencias de comandos.

    • Gracias por que. La variable de entorno JAVA_HOME no es relevante aquí como Sistema.getProperty(«java.casa») != JAVA_HOME. ¿Tiene usted un ejemplo de una JVM donde mi código no funciona debido a que el ejecutable tiene un nombre diferente?
    • un par de ejemplos: IBM (y a los demás?) han «javaw» como una alternativa, y Jikes RVM se inició con «rvm». (Y para JNode, podría ejecutar «java» o «org.jnode.command.common.java» … los comandos no son identificados por los nombres de ruta.)
  3. 5

    Para encontrar el ejecutable de java que el código se está ejecutando actualmente bajo (es decir, la ‘ruta’ de la variable en su pregunta el código de ejemplo) no es un método de utilidad dentro de apache ant que pueden ayudar a usted. Usted no tiene que construir su código con ant – sólo lo utilizan como una biblioteca, para este método.

    Es:

    org.apache.herramientas.ant.util.JavaEnvUtils.getJreExecutable(«java»)

    Que se ocupa de la ordenación de casos especiales con diferentes JVM vendedores que otros han mencionado. (Y mirando el código fuente de la misma, no son más que casos especiales de lo que me hubiera imaginado.)

    Es en ant.jar. ant es distribuido bajo la licencia Apache, así que espero que usted puede usar lo que quieras sin problemas.

Dejar respuesta

Please enter your comment!
Please enter your name here