Find absolute java.exe path programmatically from java code

24,529

Solution 1

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

Can you tell me either through pure Java ... on windows how is it possible to find out the location of javaw.exe?

E.G.

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

Output

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

And yes, I am confident that will work in a JRE.

Solution 2

On Windows, the java.library.path System Property begins with the path to the bin directory containing whichever java.exe was used to run your jar file.

This makes sense, because on Windows the first place any executable looks for DLL files is the directory containing the executable itself. So naturally, when the JVM runs, the first place it looks for DLLs is the directory containing java.exe.

You can acquire the path to java.exe as follows:

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";

This code is Windows-specific - I hard-coded the path separator (;) and the file separator (). I also put in a fallback to just "java" in case the library path trick somehow doesn't work.

I have tested this with Java 6 and 7 on Windows 7. I tried a 32-bit and 64-bit version of Java.

Solution 3

Here's a slightly more generalised solution that I came up with. Maybe useful:

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;
    }
}
Share:
24,529

Related videos on Youtube

Johnydep
Author by

Johnydep

Updated on May 09, 2022

Comments

  • Johnydep
    Johnydep about 2 years

    If I have a java jar or class file which is launched by the user (assuming java path is set in environment variables), so how can i from within the code, figure out absolute path of java.exe/javaw.exe from which this file is being launched.

    Like on ubuntu we can run: % which java and it shows the path.

    However on windows, if i check System.getenv() it may happen that there are multiple path's found e.g for old or new version. If through cmd line, I run java -version it does not show the path.

    Can you tell me either through pure java or command line on windows how is it possible to find out the location of javaw.exe?

    • Thomas
      Thomas over 12 years
      Why do you need the location of the exe? Might you want to get the location of the jar instead?
    • Johnydep
      Johnydep over 12 years
      @Thomas, i need both. Location of jar can be found easily. I need to install my application as a windows service, and for that i need the abs path of default javaw.exe Actually it is there in Path but i am confused as it can show multiple entries of old and new versions, wondering how would i now which one is the default one?
  • Johnydep
    Johnydep over 12 years
    Thank you, actually on my machine if i check Path=C:/Program Files/Java/jre7/bin; while JAVA_HOME=C:\Program Files\Java\jdk1.6.0_26 So i am just wondering for system without jdk, would JAVA_HOME still be set with JRE Path?
  • Johnydep
    Johnydep over 12 years
    Actually to test it i would have to uninstall jdk, but if you could confirm then i will have my answer, thank you
  • a_horse_with_no_name
    a_horse_with_no_name over 12 years
    But the JAVA_HOME is not necessarily the java.exe that is used to launch the currently running application. I have three different JDKs installed and only a single JAVA_HOME.
  • Johnydep
    Johnydep over 12 years
    @a_horse_with_no_name, yes you are right but Andrew's answer is what i was looking for. I was trying System.getenv("JAVA_HOME") while what i needed was: System.getProperty("java.home");
  • rogerdpack
    rogerdpack over 11 years
    appears you can also programmatically tell whether you're running java vs. javaw or not, see stackoverflow.com/questions/14632272/…
  • kevinarpe
    kevinarpe over 2 years
    For future readers, the direction layout of JDK8 and JDK11 are different. However, this answer works reliable on both directory layouts. It is also useful to find keytool(.exe)