I need to know where JDK is located on my machine.
On running Java -version in cmd, it shows the version as '1.6.xx'. To find the location of this SDK on my machine I tried using echo %JAVA_HOME% but it is only showing 'JAVA_HOME' (as there is no 'JAVA_PATH' var set in my environment variables).
25 Answers
If you are using Linux/Unix/Mac OS X:
Try this:
$ which java Should output the exact location.
After that, you can set JAVA_HOME environment variable yourself.
In my computer (Mac OS X - Snow Leopard):
$ which java /usr/bin/java $ ls -l /usr/bin/java lrwxr-xr-x 1 root wheel 74 Nov 7 07:59 /usr/bin/java -> /System/Library/Frameworks/ If you are using Windows:
c:\> for %i in (java.exe) do @echo. %~$PATH:i 7Windows > Start > cmd >
C:> for %i in (javac.exe) do @echo. %~$PATH:i If you have a JDK installed, the Path is displayed,
for example: C:\Program Files\Java\jdk1.6.0_30\bin\javac.exe
In Windows at the command prompt
where javac
In windows the default is: C:\Program Files\Java\jdk1.6.0_14 (where the numbers may differ, as they're the version).
Command line:
Run where java on Command Prompt.
GUI:
On Windows 10 you can find out the path by going to Control Panel > Programs > Java. In the panel that shows up, you can find the path as demonstrated in the screenshot below. In the Java Control Panel, go to the 'Java' tab and then click the 'View' button under the description 'View and manage Java Runtime versions and settings for Java applications and applets.'
This should work on Windows 7 and possibly other recent versions of Windows.
4Java installer puts several files into %WinDir%\System32 folder (java.exe, javaws.exe and some others). When you type java.exe in command line or create process without full path, Windows runs these as last resort if they are missing in %PATH% folders.
You can lookup all versions of Java installed in registry. Take a look at HKLM\SOFTWARE\JavaSoft\Java Runtime Environment and HKLM\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment for 32-bit java on 64 bit Windows.
This is how java itself finds out different versions installed. And this is why both 32-bit and 64-bit version can co-exist and works fine without interfering.
Plain and simple on Windows platforms:
where java
1Under Windows, you can use
C:>dir /b /s java.exe to print the full path of each and every "java.exe" on your C: drive, regardless of whether they are on your PATH environment variable.
0The batch script below will print out the existing default JRE. It can be easily modified to find the JDK version installed by replacing the Java Runtime Environment with Java Development Kit.
@echo off setlocal ::- Get the Java Version set KEY="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" set VALUE=CurrentVersion reg query %KEY% /v %VALUE% 2>nul || ( echo JRE not installed exit /b 1 ) set JRE_VERSION= for /f "tokens=2,*" %%a in ('reg query %KEY% /v %VALUE% ^| findstr %VALUE%') do ( set JRE_VERSION=%%b ) echo JRE VERSION: %JRE_VERSION% ::- Get the JavaHome set KEY="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment\%JRE_VERSION%" set VALUE=JavaHome reg query %KEY% /v %VALUE% 2>nul || ( echo JavaHome not installed exit /b 1 ) set JAVAHOME= for /f "tokens=2,*" %%a in ('reg query %KEY% /v %VALUE% ^| findstr %VALUE%') do ( set JAVAHOME=%%b ) echo JavaHome: %JAVAHOME% endlocal In a Windows command prompt, just type:
set java_home Or, if you don't like the command environment, you can check it from:
Start menu > Computer > System Properties > Advanced System Properties. Then open Advanced tab > Environment Variables and in system variable try to find JAVA_HOME.

Powershell one liner:
$p='HKLM:\SOFTWARE\JavaSoft\Java Development Kit'; $v=(gp $p).CurrentVersion; (gp $p/$v).JavaHome 1More on Windows... variable java.home is not always the same location as the binary that is run.
As Denis The Menace says, the installer puts Java files into Program Files, but also java.exe into System32. With nothing Java related on the path java -version can still work. However when PeterMmm's program is run it reports the value of Program Files as java.home, this is not wrong (Java is installed there) but the actual binary being run is located in System32.
One way to hunt down the location of the java.exe binary, add the following line to PeterMmm's code to keep the program running a while longer:
try{Thread.sleep(60000);}catch(Exception e) {} Compile and run it, then hunt down the location of the java.exe image. E.g. in Windows 7 open the task manager, find the java.exe entry, right click and select 'open file location', this opens the exact location of the Java binary. In this case it would be System32.
Run this program from commandline:
// File: Main.java public class Main { public static void main(String[] args) { System.out.println(System.getProperty("java.home")); } } $ javac Main.java $ java Main 2In Windows PowerShell you can use the Get-Command function to see where Java is installed:
Get-Command -All java Or
gcm -All java The -All part makes sure to show all places it appears in the Path lookup. Below is example output.
PS C:> gcm -All java CommandType Name Version Source ----------- ---- ------- ------ Application java.exe 8.0.202.8 C:\Program Files (x86)\Common Files\Oracle\Java\jav... Application java.exe 8.0.131... C:\ProgramData\Oracle\Java\javapath\java.exe Have you tried looking at your %PATH% variable. That's what Windows uses to find any executable.
1Just execute the set command in your command line. Then you see all the environments variables you have set.
Or if on Unix you can simplify it:
$ set | grep "JAVA_HOME" 1This is OS specific. On Unix:
which java will display the path to the executable. I don't know of a Windows equivalent, but there you typically have the bin folder of the JDK installation in the system PATH:
echo %PATH% 2On macOS, run:
cd /tmp && echo 'public class Main {public static void main(String[] args) {System.out.println(System.getProperty("java.home"));}}' > Main.java && javac Main.java && java Main On my machine, this prints:
/Library/Java/JavaVirtualMachines/ Note that running which java does not show the JDK location, because the java command is instead part of JavaVM.framework, which wraps the real JDK:
$ which java /usr/bin/java /private/tmp $ ls -l /usr/bin/java lrwxr-xr-x 1 root wheel 74 14 Nov 17:37 /usr/bin/java -> /System/Library/Frameworks/ None of these answers are correct for Linux if you are looking for the home that includes the subdirs such as: bin, docs, include, jre, lib, etc.
On Ubuntu for openjdk1.8.0, this is in: /usr/lib/jvm/java-1.8.0-openjdk-amd64
and you may prefer to use that for JAVA_HOME since you will be able to find headers if you build JNI source files. While it's true which java will provide the binary path, it is not the true JDK home.
Maybe the above methods work... I tried some and didn't for me. What did was this :
Run this in terminal :
/usr/libexec/java_home in Windows cmd:
set "JAVA_HOME" 0#!/bin/bash if [[ $(which ${JAVA_HOME}/bin/java) ]]; then exe="${JAVA_HOME}/bin/java" elif [[ $(which java) ]]; then exe="java" else echo "Java environment is not detected." exit 1 fi ${exe} -version For windows:
@echo off if "%JAVA_HOME%" == "" goto nojavahome echo Using JAVA_HOME : %JAVA_HOME% "%JAVA_HOME%/bin/java.exe" -version goto exit :nojavahome echo The JAVA_HOME environment variable is not defined correctly echo This environment variable is needed to run this program. goto exit :exit This link might help to explain how to find java executable from bash:
2I have improved munsingh's answer above by testing for the registry key in 64-bit and 32-bit registries, if needed:
::- Test for the registry location SET VALUE=CurrentVersion SET KEY_1="HKLM\SOFTWARE\JavaSoft\Java Development Kit" SET KEY_2=HKLM\SOFTWARE\JavaSoft\JDK SET REG_1=reg.exe SET REG_2="C:\Windows\sysnative\reg.exe" SET REG_3="C:\Windows\syswow64\reg.exe" SET KEY=%KEY_1% SET REG=%REG_1% %REG% QUERY %KEY% /v %VALUE% 2>nul IF %ERRORLEVEL% EQU 0 GOTO _set_value SET KEY=%KEY_2% SET REG=%REG_1% %REG% QUERY %KEY% /v %VALUE% 2>nul IF %ERRORLEVEL% EQU 0 GOTO _set_value ::- %REG_2% is for 64-bit installations, using "C:\Windows\sysnative" SET KEY=%KEY_1% SET REG=%REG_2% %REG% QUERY %KEY% /v %VALUE% 2>nul IF %ERRORLEVEL% EQU 0 GOTO _set_value SET KEY=%KEY_2% SET REG=%REG_2% %REG% QUERY %KEY% /v %VALUE% 2>nul IF %ERRORLEVEL% EQU 0 GOTO _set_value ::- %REG_3% is for 32-bit installations on a 64-bit system, using "C:\Windows\syswow64" SET KEY=%KEY_1% SET REG=%REG_3% %REG% QUERY %KEY% /v %VALUE% 2>nul IF %ERRORLEVEL% EQU 0 GOTO _set_value SET KEY=%KEY_2% SET REG=%REG_3% %REG% QUERY %KEY% /v %VALUE% 2>nul IF %ERRORLEVEL% EQU 0 GOTO _set_value :_set_value FOR /F "tokens=2,*" %%a IN ('%REG% QUERY %KEY% /v %VALUE%') DO ( SET JDK_VERSION=%%b ) SET KEY=%KEY%\%JDK_VERSION% SET VALUE=JavaHome FOR /F "tokens=2,*" %%a IN ('%REG% QUERY %KEY% /v %VALUE%') DO ( SET JAVAHOME=%%b ) ECHO "%JAVAHOME%" ::- SETX JAVA_HOME "%JAVAHOME%" reference for access to the 64-bit registry
Script for 32/64 bit Windows.
@echo off setlocal enabledelayedexpansion ::- Get the Java Version set KEY="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" set KEY64="HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment" set VALUE=CurrentVersion reg query %KEY% /v %VALUE% 2>nul || ( set KEY=!KEY64! reg query !KEY! /v %VALUE% 2>nul || ( echo JRE not installed exit /b 1 ) ) set JRE_VERSION= for /f "tokens=2,*" %%a in ('reg query %KEY% /v %VALUE% ^| findstr %VALUE%') do ( set JRE_VERSION=%%b ) echo JRE VERSION: %JRE_VERSION% ::- Get the JavaHome set KEY="HKLM\SOFTWARE\JavaSoft\Java Runtime Environment\%JRE_VERSION%" set KEY64="HKLM\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\%JRE_VERSION%" set VALUE=JavaHome reg query %KEY% /v %VALUE% 2>nul || ( set KEY=!KEY64! reg query !KEY! /v %VALUE% 2>nul || ( echo JavaHome not installed exit /b 1 ) ) set JAVAHOME= for /f "tokens=2,*" %%a in ('reg query %KEY% /v %VALUE% ^| findstr %VALUE%') do ( set JAVAHOME=%%b ) echo JavaHome: %JAVAHOME% endlocal Simple method (Windows): Open an application using java. press ctrl + shift + esc
Right click on OpenJDK platform binary. Click open file location. Then it will show java/javaw.exe then go to the top where it shows the folder and click on the jdk then right copy the path, boom. (Wont work for apps using bundled jre paths/runtimes, because it will show path to the bundled runtime)