¿Es * esta * realmente la mejor manera de iniciar una segunda JVM desde el código Java?

StackOverflow https://stackoverflow.com/questions/1229605

  •  22-07-2019
  •  | 
  •  

Pregunta

Esta es una continuación de mi propia pregunta anterior y me da vergüenza preguntar esto ... Pero de todos modos : ¿cómo iniciarías una segunda JVM desde un programa Java independiente de forma independiente del sistema? Y sin depender, por ejemplo, de una variable de entorno como JAVA_HOME, ya que podría apuntar a un JRE diferente al que se está ejecutando actualmente. Se me ocurrió el siguiente código que realmente funciona pero se siente un poco incómodo:

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();
}

Además, la JVM que se está ejecutando actualmente podría haberse iniciado con algunos otros parámetros (-D, -X ..., ...) que la segunda JVM no conocería.

¿Fue útil?

Solución

No está 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 necesitaría la misma configuración de almacenamiento dinámico que sus padres) al iniciar un proceso secundario.

Preferiría usar una configuración externa de algún tipo para definir estas propiedades para los hijos. Es un poco más de trabajo, pero creo que al final necesitarás la flexibilidad.

Para ver el alcance de los posibles ajustes de configuración, puede mirar thye " Ejecutar configuraciones " configuraciones en Eclipse. Bastantes pestañas de configuración allí.

Otros consejos

Creo que la respuesta es "Sí". Esto probablemente sea tan bueno como lo puede hacer en Java utilizando un código independiente del sistema. Pero tenga en cuenta que incluso esto es solo relativamente independiente del sistema. Por ejemplo, en algunos sistemas:

  1. la variable JAVA_HOME puede no haberse configurado,
  2. el nombre del comando utilizado para iniciar una JVM puede ser diferente (por ejemplo, si no es una JVM de Sun) o
  3. las opciones de la línea de comando pueden ser diferentes (por ejemplo, si no es una JVM de Sun).

Si buscara la máxima portabilidad en el lanzamiento de una (segunda) JVM, creo que lo haría usando scripts de envoltura.

Para encontrar el ejecutable de Java con el que se está ejecutando actualmente su código (es decir, la variable 'ruta' en el código de muestra de su pregunta) hay un método de utilidad dentro de Apache Ant que puede ayudarlo. No tiene que construir su código con hormiga, simplemente utilícelo como biblioteca, para este método.

Es:

org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable (" java ")

Se ocupa del tipo de casos especiales con diferentes proveedores de JVM que otros han mencionado. (Y mirando el código fuente, hay más casos especiales de lo que hubiera imaginado).

Está en ant.jar. Ant se distribuye bajo la licencia de Apache, así que espero que pueda usarlo como desee sin problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top