2010-08-02 21 views
15

¿Cómo se obtiene la ubicación del archivo ejecutable de la JVM actualmente en ejecución durante el tiempo de ejecución? Me gustaría crear una instancia de otra JVM como un subproceso utilizando la clase ProcessBuilder.Determinación de la ubicación del ejecutable de JVM durante el tiempo de ejecución

Soy consciente de que existe la propiedad del sistema java.home, pero esto no especifica la ubicación del ejecutable JVM. Entiendo que podía hacer algo como esto para obtener la ruta:

System.getProperties().getProperty("java.home") + File.pathSeparator + "bin" + File.pathSeparator + "java"

Este código no es independiente de la plataforma, porque el nombre del ejecutable de Windows es java.exe, no java. ¿Hay alguna manera de obtener la ruta del ejecutable de JVM que tenga en cuenta la idiosincrasia de la plataforma?

+0

JAVA_HOME apunta al JDK y no al JRE. Entonces no tiene suerte cuando el usuario no tiene instalado el JDK. También I * do * tengo el JDK y no tengo la variable de entorno. Todavía todo funciona bien. También en Windows puede colocar el '.exe' en el nombre del archivo para los programas que desea ejecutar. – Joey

+0

Por la propiedad del sistema 'java.home', no me refiero a una variable de entorno; más bien, me refiero a la propiedad que existe en 'System.getProperties()'. He verificado que los JRE tienen la propiedad del sistema de 'java.home'. Es útil saber que la extensión '.exe' es opcional en Windows. Gracias. –

+0

Puede hacer wath el primer comentario dice y asumir "bin/java.exe" en Windows y asumir "bin/java" en otras plataformas. También hay "javaw.exe" a considerar dependiendo de lo que está tratando de hacer. –

Respuesta

-4

Está intentando bifurcar toda la JVM.

  1. Eso es extremadamente ineficiente, principalmente debido a la pesadez de otro proceso de Java. Si su gran medida haciendo esto, entonces el programa va a ser muy lento existen
  2. Hilos por esta misma razón

Pero si realmente debe, se puede tratar simplemente ejecutar java -arguments directamente, ya que la mayoría de Java estándar las instalaciones ponen java en la ruta de cli.

+0

La pregunta no dice nada sobre el lanzamiento por lo que debe probablemente diga "si está utilizando java.exe para iniciarse tenga cuidado ...". La pregunta es solo acerca de obtener el ejecutable Java exe. –

+1

Además de lo que escribió jowierun, * hay * beneficios para bifurcar una JVM: 1. no hay conflictos de carga de clases entre las JVM: esto es importante para las aplicaciones grandes 2. cuando se ejecuta un algoritmo costoso, ejecutándolo como un proceso separado es una buena idea; elude las limitaciones de memoria –

1

Sí, hay una forma de obtener la ruta del archivo ejecutable de JVM (si existe). Incluirlo en la configuración de la aplicación. Hay muchas formas de hacerlo: Argumento de la línea de comando - java myApp.Main/path/to/Java; Propiedades - java -Dpath.to.java =/ruta/a/java; etc.

Si desea una verdadera independencia de plataforma, todo su esquema es defectuoso porque no se garantiza la existencia de un ejecutable JVM. Podría imaginarme una JVM sin necesidad de un ejecutable de Java.

Si quiere un 99.99% de independencia de plataforma, entonces creo que tiene las herramientas necesarias.

+6

Esto no responde mi pregunta. Me pregunto cómo determinar la ubicación del ejecutable JVM * en tiempo de ejecución *, no a priori antes de que se inicie la JVM. Usted asume que tengo el control de cómo se invoca la JVM, y este no es el caso. –

1

Esta discusión tiene una interesante discusión sobre el tema que cubren varias plataformas: Finding current executable's path without /proc/self/exe

Dado que la discusión, debería ser posible, si realmente necesitaba, escribir algún envoltorio JNI que #ifdef de la plataforma actual y hace la llamada nativa adecuada.

Si solo está en Linux, '/ proc/self/exe' es un enlace simbólico al ejecutable real que se está ejecutando. Esto tiene la ventaja de no depender de ninguna variable de entorno (es decir, PATH o JAVA_HOME). Pero como dije, definitivamente no es independiente de la plataforma.

8

Siempre puede usar os.name para verificar si el usuario ejecuta Windows o no. Eso funcionará en OS X, Linux y Windows en

String jvm_location; 
if (System.getProperty("os.name").startsWith("Win")) { 
    jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java.exe"; 
} else { 
    jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java"; 
} 
Cuestiones relacionadas