Encuentre la ruta absoluta de java.exe programáticamente desde el código java

Si tengo un java jar o un archivo de clase que inicia el usuario (suponiendo que la ruta java esté configurada en variables de entorno), entonces, ¿cómo puedo hacerlo desde dentro del código, averiguar la ruta absoluta de java.exe / javaw.exe desde la cual archivo está siendo lanzado.

Al igual que en Ubuntu, podemos ejecutar: % which java y muestra la ruta.

Sin embargo, en Windows, si System.getenv() puede ocurrir que se encuentren múltiples rutas, por ejemplo, para versiones antiguas o nuevas. Si a través de la línea cmd, ejecuto java -version , no muestra la ruta.

¿Me puede decir a través de java pura o línea de comando en Windows cómo es posible averiguar la ubicación de javaw.exe?

 String javaHome = System.getProperty("java.home"); 

¿Me puede decir a través de Java puro … en Windows cómo es posible averiguar la ubicación de javaw.exe?

P.EJ

 import java.io.File; class JavawLocation { public static void main(String[] args) { String javaHome = System.getProperty("java.home"); File f = new File(javaHome); f = new File(f, "bin"); f = new File(f, "javaw.exe"); System.out.println(f + " exists: " + f.exists()); } } 

Salida

 C:\Program Files (x86)\Java\jdk1.6.0_29\jre\bin\javaw.exe exists: true Press any key to continue . . . 

Y sí, estoy seguro de que funcionará en un JRE.

En Windows, la propiedad del sistema java.library.path comienza con la ruta al directorio bin que contiene el java.exe que se utilizó para ejecutar el archivo jar.

Esto tiene sentido, porque en Windows, en primer lugar, cualquier archivo ejecutable que busque archivos DLL es el directorio que contiene el ejecutable. Entonces, naturalmente, cuando se ejecuta JVM, el primer lugar que busca DLL es el directorio que contiene java.exe.

Puede adquirir la ruta a java.exe de la siguiente manera:

 final String javaLibraryPath = System.getProperty("java.library.path"); final File javaExeFile = new File( javaLibraryPath.substring(0, javaLibraryPath.indexOf(';')) + "\\java.exe" ); final String javaExePath = javaExeFile.exists() ? javaExeFile.getAbsolutePath() : "java"; 

Este código es específico de Windows: he codificado el separador de ruta (;) y el separador de archivo (). También puse una alternativa a “java” en caso de que el truco de la ruta de la biblioteca no funcione.

He probado esto con Java 6 y 7 en Windows 7. Probé una versión de Java de 32 y 64 bits.

Aquí hay una solución un poco más generalizada que se me ocurrió. Puede ser útil:

 private static String javaExe() { final String JAVA_HOME = System.getProperty("java.home"); final File BIN = new File(JAVA_HOME, "bin"); File exe = new File(BIN, "java"); if (!exe.exists()) { // We might be on Windows, which needs an exe extension exe = new File(BIN, "java.exe"); } if (exe.exists()) { return exe.getAbsolutePath(); } try { // Just try invoking java from the system path; this of course // assumes "java[.exe]" is /actually/ Java final String NAKED_JAVA = "java"; new ProcessBuilder(NAKED_JAVA).start(); return NAKED_JAVA; } catch (IOException e) { return null; } }