如何在cygwin中快速切换JDK?
How can I quickly switch between JDKs in cygwin?
在命令行(使用 CYGWIN)上工作时,我经常需要在 java 的不同版本之间切换。每次我需要切换时,是否有任何实用程序可以为我设置 JAVA_HOME、PATH 等?
https://sdkman.io/install 允许在 JDK 版本之间快速切换并且与 cygwin
兼容
我为此使用了一个 shell (bash, ksh, ...) 函数;函数在当前 shell 进程的上下文中执行,因此 可以 影响其环境:
# Switch current JDK (JAVA_HOME) on Cygwin
function jdkswitch {
local version=
local -a JDKS
JDKS[8]='/cygdrive/c/apps/JDK/x64/jdk1.8.0_231'
JDKS[11]='/cygdrive/c/apps/JDK/x64/jdk-11.0.5'
if [[ -z ${version} ]] ; then
echo "Current JDK: ${JAVA_HOME}"
echo "Available JDKs: ${JDKS[*]}"
else
local jdkhome=${JDKS[${version}]}
if [[ -d ${jdkhome} ]] ; then
# Cygwin paths do not work for JAVA_HOME, must use Windows-style
export JAVA_HOME=$(cygpath -w ${jdkhome})
PATH=${jdkhome}/bin:${PATH}
echo "Switched JDK to:"
java -version
else
echo "Usage: jdkswitch version"
echo "Available versions: ${!JDKS[*]}"
fi
fi
}
我通常将函数 one-per-file 保存在 ~/bin/functions 中并将它们加载到我的 .profile 中(bash 缺少 ksh“自动加载”功能):
FPATH=~/bin/functions
for FUNC in ${FPATH}/* ; do
. ${FUNC}
done
然后切换 JDK 很简单:
$ jdkswitch 11
那里有一个小错误,每次都会在 PATH 前面加上连续的开关,它可能可以通过一些技巧来修复,但我没有遇到过问题to-date。
顺便说一句(因为问题指定的是 Cygwin),这里是 MacOS 版本:
# Switch current JDK (JAVA_HOME) based on available Mac installs
function jdkswitch {
local version=
local jdkhome
if [[ -z ${version} ]] ; then
/usr/libexec/java_home --verbose
else
jdkhome=$(/usr/libexec/java_home -v${version})
if [[ -d ${jdkhome} ]] ; then
export JAVA_HOME=${jdkhome}
echo "Switched to ${JAVA_HOME}"
java -version
fi
fi
}
在命令行(使用 CYGWIN)上工作时,我经常需要在 java 的不同版本之间切换。每次我需要切换时,是否有任何实用程序可以为我设置 JAVA_HOME、PATH 等?
https://sdkman.io/install 允许在 JDK 版本之间快速切换并且与 cygwin
兼容我为此使用了一个 shell (bash, ksh, ...) 函数;函数在当前 shell 进程的上下文中执行,因此 可以 影响其环境:
# Switch current JDK (JAVA_HOME) on Cygwin
function jdkswitch {
local version=
local -a JDKS
JDKS[8]='/cygdrive/c/apps/JDK/x64/jdk1.8.0_231'
JDKS[11]='/cygdrive/c/apps/JDK/x64/jdk-11.0.5'
if [[ -z ${version} ]] ; then
echo "Current JDK: ${JAVA_HOME}"
echo "Available JDKs: ${JDKS[*]}"
else
local jdkhome=${JDKS[${version}]}
if [[ -d ${jdkhome} ]] ; then
# Cygwin paths do not work for JAVA_HOME, must use Windows-style
export JAVA_HOME=$(cygpath -w ${jdkhome})
PATH=${jdkhome}/bin:${PATH}
echo "Switched JDK to:"
java -version
else
echo "Usage: jdkswitch version"
echo "Available versions: ${!JDKS[*]}"
fi
fi
}
我通常将函数 one-per-file 保存在 ~/bin/functions 中并将它们加载到我的 .profile 中(bash 缺少 ksh“自动加载”功能):
FPATH=~/bin/functions
for FUNC in ${FPATH}/* ; do
. ${FUNC}
done
然后切换 JDK 很简单:
$ jdkswitch 11
那里有一个小错误,每次都会在 PATH 前面加上连续的开关,它可能可以通过一些技巧来修复,但我没有遇到过问题to-date。
顺便说一句(因为问题指定的是 Cygwin),这里是 MacOS 版本:
# Switch current JDK (JAVA_HOME) based on available Mac installs
function jdkswitch {
local version=
local jdkhome
if [[ -z ${version} ]] ; then
/usr/libexec/java_home --verbose
else
jdkhome=$(/usr/libexec/java_home -v${version})
if [[ -d ${jdkhome} ]] ; then
export JAVA_HOME=${jdkhome}
echo "Switched to ${JAVA_HOME}"
java -version
fi
fi
}