I want to set the JAVA_HOME variable from a batch script
-
1Your title and your question are opposites. Which is it, get or set? – Michael Myers Mar 12 '09 at 21:43
8 Answers
This snippet will search the current PATH for java.exe, and print out where it was found:
for /f %%j in ("java.exe") do @echo.%%~dp$PATH:j
On my system this gives me
C:\WINDOWS\system32\
Using this you can set JAVA_HOME as follows:
@echo off
for /f %%j in ("java.exe") do (
set JAVA_HOME=%%~dp$PATH:j
)
if %JAVA_HOME%.==. (
@echo java.exe not found
) else (
@echo JAVA_HOME = %JAVA_HOME%
)

- 28,540
- 12
- 67
- 94
-
1system32 is not where the JRE will be installed. See http://mindprod.com/jgloss/registry.html#JAVAFIND JAVA_HOME is typically used in scripts in this form to launch apps: %JAVA_HOME%\bin\java – McDowell Mar 12 '09 at 17:32
-
I'm not saying it is, but that's where it happens to reside in my path. From another answer (or comments to another answer, I don't know, it's been deleted) you *may* have an installer that copies java.exe to the %systemroot%\system32 directory. On my system, it apparently has. – Patrick Cuff Mar 12 '09 at 18:20
-
My solution will find where java.exe resides on *your* path, if at all. – Patrick Cuff Mar 12 '09 at 18:22
-
I need to find out where java.exe is without relying on its folder being in PATH (it usually isn't....). I have to use the registry setting from the batch file in the answer below this one. – codewarrior Sep 10 '11 at 20:37
-
-
@Jayy; it's from the `for` command help, `for /?`: %~dp$PATH:I - searches the directories listed in the PATH environment variable for %I and expands to the drive letter and path of the first one found. – Patrick Cuff Feb 25 '15 at 12:23
-
"set JAVA_HOME=%%~dp$PATH:j" "The syntax of the command is incorrect" – Berit Larsen Sep 04 '15 at 12:01
-
what is %JAVA_HOME%.==. doing exactly ? is this the way to check for empty strings ? – mishal153 Jan 15 '16 at 09:28
-
2@mishal153, yes, this is checking for empty strings. BAT files treat whitespace oddly, so there's no easy way to check for empty strings. By putting a period at the end of a string and comparing to a literal that's just a period, you can tell if the string is empty. – Patrick Cuff Jan 15 '16 at 13:07
-
1@PatrickCuff - Nice solution! `JAVA_HOME` is the parent directory of the directory that contains `java.exe` though, so you should traverse one directory up from the result found. `java.exe` is expected to be found at `%JAVA_HOME%\bin\java.exe` – isapir Feb 23 '16 at 01:20
This solution depends on the JDK being installed under %ProgramFiles%\Java, for example C:\Program Files\Java\jdk1.6.0_18. You can change the line "set JDK_Version=1.6" to the version you want to use such as "set JDK_Version=1.5".
Assuming that the latest version of JDK would be at the bottom of the list (jdk%jdk_Version%*) the latest version available should be set as JAVA_HOME. If the JDK could not be found JAVA_HOME will not be changed. If the JDK could not be found and JAVA_HOME doesn't have a value the script will display an error message.
@echo off
rem set the version of jdk you would like to use (1.4, 1.5, 1.6, etc)
set JDK_Version=1.6
echo.
echo Locating JDK %JDK_Version%
for /d %%i in ("%ProgramFiles%\Java\jdk%jdk_Version%*") do (set Located=%%i)
rem check if JDK was located
if "%Located%"=="" goto else
rem if JDK located display message to user
rem update %JAVA_HOME%
set JAVA_HOME=%Located%
echo Located JDK %jdk_Version%
echo JAVA_HOME has been set to:
echo %JAVA_HOME%
goto endif
:else
rem if JDK was not located
rem if %JAVA_HOME% has been defined then use the existing value
echo Could not locate JDK %JDK_Version%
if "%JAVA_HOME%"=="" goto NoExistingJavaHome
echo Existing value of JAVA_HOME will be used:
echo %JAVA_HOME%
goto endif
:NoExistingJavaHome
rem display message to the user that %JAVA_HOME% is not available
echo No Existing value of JAVA_HOME is available
goto endif
:endif
rem clear the variables used by this script
set JDK_Version=
set Located=

- 4,931
- 3
- 38
- 36
You can use values stored in the registry to automatically discover where Java is installed and setup the JAVA_HOME variable.
HKLM > Software > JavaSoft > Java Runtime Environment
At this location is a Key called CurrentVersion. This version references one of the directories at this level by name. Opening the directory exposes another key called JavaHome. The value of JavaHome is a file system path that can be used to define your environment variable JAVA_HOME.
Within a batch file you can do something like:
FOR /F "skip=2 tokens=2*" %%A IN ('REG QUERY "HKLM\Software\JavaSoft\Java Runtime Environment" /v CurrentVersion') DO set CurVer=%%B
FOR /F "skip=2 tokens=2*" %%A IN ('REG QUERY "HKLM\Software\JavaSoft\Java Runtime Environment\%CurVer%" /v JavaHome') DO set JAVA_HOME=%%B
If you want to read more, I've written a tutorial describing what is needed to construct a batch file to auto-discover JAVA_HOME.
While not perfect, you can use the following to discover the current JRE folder:
for /d %%i in ("\Program Files\Java\jre*") do set JAVA_HOME=%%i
If it's the JDK you want, use:
for /d %%i in ("\Program Files\Java\jdk*") do set JAVA_HOME=%%i`
For a more robust solution based on checking the Windows Registry, use:
set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
set Cmd=reg query "%KeyName%" /s
for /f "tokens=2*" %%i in ('%Cmd% ^| find "JavaHome"') do set JAVA_HOME=%%j
For the JDK, you'll need this line instead:
set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit
If JAVA_HOME isn't already set, and you want to set it, then you probably need to do something like
dir java.exe /B /S
which will give you a list of all directories containing the file java.exe. From there you can pipe that output to another command that parses the results and selects one of those directories, then uses it to set the JAVA_HOME variable.

- 28,293
- 19
- 112
- 138
-
3This will only work run from the directory where java is installed, or from any superdirectory thereof. It will not work, for instance, if run from C:\ while java is installed somewhere on D:\ – eleven81 Mar 12 '09 at 12:36
Java's supposed to set up the JAVA_HOME variable when it's installed. Use this to find the location of Java:
if not "%JAVA_HOME%" == "" goto HasJavaHome
:HasJavaHome
set JAVA_HOME=... // Your new value goes here.

- 303,634
- 46
- 339
- 357
-
-
1Java has never set the JAVA_HOME variable when installed. It is a convention used to allow the script-writer to allow the system user to specify a specific version of Java to use when launching an app, since there can be more than one version installed. – McDowell Mar 12 '09 at 17:35
This doesn't search the entire hard drive. It only searches the parent directory tree and so its much faster than using "dir java.exe /B /S".
@ECHO off
ECHO ------------------------------------------------------------------
ECHO Define the location of an existing JDK install by
ECHO searching for Javasoft JDK distrobution in parent
ECHO directories.
ECHO.
ECHO Script does not add trailing slash.
ECHO ------------------------------------------------------------------
IF DEFINED JAVA_HOME (
ECHO JAVA_HOME is already set.
GOTO :JHSET
)
SET matchobject=Javasoft\bin\java.exe
SET "dir=%~f0"
:LOOP
CALL :FGETDIR "%dir%"
IF EXIST "%dir%\%matchobject%" (
ECHO Found JAVA_HOME at %dir%\
GOTO :HOMESET
)
IF "%dir:~-1%" == ":" (
ECHO Reached root and directory containing "%matchobject%" not found.
GOTO :EOF
)
GOTO :LOOP
:HOMESET
SET JAVA_HOME=%dir%
GOTO :JHSET
:: function section
:FGETDIR
SET "dir=%~dp1"
SET "dir=%dir:~0,-1%"
EXIT /B 0
:: end function section
:JHSET
:: Does JAVA_HOME have a trailing slash? If so remove it.
IF !JAVA_HOME:~-1!==\ SET JAVA_HOME=!JAVA_HOME:~0,-1!
ECHO JAVA_HOME is %JAVA_HOME%
ECHO Will close in a few seconds...
ping -n 60 127.0.0.1>nul

- 28,471
- 61
- 196
- 289
Here is a handy little batch file that will search everything in your path for the first occurance of a file. The magical little bit is the %%~dp$PATH:i%%i in the for loop. %%~dp will expand the next variable to the drive letter and path only. The $PATH:i searches the path for the first occurance of %%i which is the filename that is passed into the for loop.
example: Where.bat
@echo off
setlocal
if "%1"=="" goto USAGE
set filename=%1
for %%i in (%filename%) do @echo %%~dp$PATH:i%%i
goto EOF
:USAGE
echo %0 filename
:EOF
endlocal

- 3,704
- 2
- 28
- 46