Skip to content

Instantly share code, notes, and snippets.

@projected1
Created January 19, 2021 14:26
Show Gist options
  • Save projected1/6bd04ce8beb6689b68860f171383a039 to your computer and use it in GitHub Desktop.
Save projected1/6bd04ce8beb6689b68860f171383a039 to your computer and use it in GitHub Desktop.
Switches between installed Java versions.
@echo off
setlocal
rem Must run elevated
net session > nul 2>&1
if not %errorLevel% == 0 (
echo Error: Please re-run as admin
goto end
)
set JAVA_PATH=C:\Program Files\Java
set JAVAPATH=C:\ProgramData\Oracle\Java
set JAVAPATH_LINK="%JAVAPATH%\javapath"
set JAVAPATH_TARGET="%JAVAPATH%\javapath_target"
set COMMON_JAVAPATH=C:\Program Files (x86)\Common Files\Oracle\Java
set COMMON_JAVAPATH_LINK="%COMMON_JAVAPATH%\javapath"
set COMMON_JAVAPATH_TARGET="%COMMON_JAVAPATH%\javapath_target"
rem List Java versions
echo Available Java versions:
dir /b "%JAVA_PATH%\jdk*"
rem Ask user to select one
:retry
set /p JAVA_VERSION="Select Java version: "
if not exist "%JAVA_PATH%\%JAVA_VERSION%" (
echo Error: Invalid Java version
goto retry
)
rem Set the global JAVA_HOME variable
setx JAVA_HOME "%JAVA_PATH%\%JAVA_VERSION%" > nul
rem WARNING: "setx" is limited by the maximum environment buffer size, which is to 1024 characters.
rem If your path variable value is longer than that, "setx" will TRUNCATE YOUR PATH!
rem Either increase the maximum environment buffer size, or add the %JAVA_HOME%\bin
rem to path manually (recommended).
rem See https://superuser.com/a/387625
rem setx PATH "%PATH%;%%JAVA_HOME%%\bin"
rem Update Windows registry keys (until Java 8)
for /f "tokens=1,2,3 delims=.-" %%a in ("%JAVA_VERSION:~3%") do (
set JAVA_MAJOR_MINOR_VERSION=%%a.%%b
)
rem WARNING: "reg" hangs sporadically (seems like a bug). Kill it manually if necessary,
rem and try again running the version switch.
reg add "HKLM\SOFTWARE\JavaSoft\Java Runtime Environment" /v CurrentVersion -t REG_SZ /d %JAVA_MAJOR_MINOR_VERSION% /f
rem Setup the selected version as the default (until Java 10)
for /f "usebackq tokens=*" %%f in (`dir /b /a:d /s "%JAVAPATH_TARGET%*"`) do (
rmdir /q /s "%%f"
)
mkdir %JAVAPATH_TARGET%
copy "%JAVA_PATH%\%JAVA_VERSION%\bin\java.exe" %JAVAPATH_TARGET% > nul
copy "%JAVA_PATH%\%JAVA_VERSION%\bin\javaw.exe" %JAVAPATH_TARGET% > nul
copy "%JAVA_PATH%\%JAVA_VERSION%\bin\javaws.exe" %JAVAPATH_TARGET% > nul
if exist %JAVAPATH_LINK% (
rm %JAVAPATH_LINK%
)
mklink /j %JAVAPATH_LINK% %JAVAPATH_TARGET% > nul
rem Setup the selected version as the default (since Java 10)
for /f "usebackq tokens=*" %%f in (`dir /b /a:d /s %COMMON_JAVAPATH_TARGET%*`) do (
rmdir /q /s "%%f"
)
mkdir %COMMON_JAVAPATH_TARGET%
copy "%JAVA_PATH%\%JAVA_VERSION%\bin\java.exe" %COMMON_JAVAPATH_TARGET% > nul
copy "%JAVA_PATH%\%JAVA_VERSION%\bin\javaw.exe" %COMMON_JAVAPATH_TARGET% > nul
copy "%JAVA_PATH%\%JAVA_VERSION%\bin\javaws.exe" %COMMON_JAVAPATH_TARGET% > nul
if exist %COMMON_JAVAPATH_LINK% (
rm %COMMON_JAVAPATH_LINK%
)
mklink /j %COMMON_JAVAPATH_LINK% %COMMON_JAVAPATH_TARGET% > nul
rem Add java.dll (java\bin) and jvm.cfg (java\lib) (since Java 11)
if exist "%JAVAPATH%\bin" (
rm "%JAVAPATH%\bin"
)
if exist "%JAVAPATH%\lib" (
rm "%JAVAPATH%\lib"
)
mklink /j "%JAVAPATH%\bin" "%JAVA_PATH%\%JAVA_VERSION%\bin" > nul
mklink /j "%JAVAPATH%\lib" "%JAVA_PATH%\%JAVA_VERSION%\lib" > nul
if exist "%COMMON_JAVAPATH%\bin" (
rm "%COMMON_JAVAPATH%\bin"
)
if exist "%COMMON_JAVAPATH%\lib" (
rm "%COMMON_JAVAPATH%\lib"
)
mklink /j "%COMMON_JAVAPATH%\bin" "%JAVA_PATH%\%JAVA_VERSION%\bin" > nul
mklink /j "%COMMON_JAVAPATH%\lib" "%JAVA_PATH%\%JAVA_VERSION%\lib" > nul
rem Verify
java -version
:end
endlocal
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment