1.下载jdk
到Oracle官网下载,为了方便管理,我下载到: /usr/local/src/jdk
jdk-8u202-linux-x64.tar.gz
jdk-11.0.27_linux-x64_bin.tar.gz
2.解压到安装目录
创建安装目录
sudo mkdir -p /u01/jdk # 创建目录
sudo chown -R root:root/u01/jdk # 设置权限
解压,tar.gz包解压就可以使用,无需编译,如下命令:
tar -xzf jdk-8u202-linux-x64.tar.gz -C /u01/jdk/
tar -xzf jdk-11.0.27_linux-x64_bin.tar.gz -C /u01/jdk/
3.多个版本管理
用alternatives工具进行版本管理,alternatives工具是Rocky系统默认的版本管理工具。
3.1.注册 JDK 到alternatives
# 注册 java
sudo alternatives --install /usr/bin/java java /u01/jdk/jdk1.8.0_202/bin/java 2000
sudo alternatives --install /usr/bin/java java /u01/jdk/jdk-11.0.27/bin/java 1000
# 注册 javac
sudo alternatives --install /usr/bin/javac javac /u01/jdk/jdk1.8.0_202/bin/javac 2000
sudo alternatives --install /usr/bin/javac javac /u01/jdk/jdk-11.0.27/bin/javac 2000
然后就可以了
不需要可以这样移除注册:
sudo alternatives --remove java /u01/jdk/jdk1.8.0_202/bin/java
切换版本以及查看当前使用的版本和版本列表,输入序号切换版本,命令如下:
sudo alternatives --config java
可以看到,当前版本是序号2,版本:jdk-11.0.27,输入1,选择jdk1.8.0_202,再查看
sudo alternatives --display java
当前切换到了jdk1.8.0_202版本,如下图示:
除了以上命令查看以外,还可以这样查看已经注册的JDK工具
alternatives --list | grep java
4.验证
解压就算安装完成了,只是通过alternatives进行版本管理。因为版本注册的时候,已经映射到/usr/bin/java上,所以无需环境变量配置,也可以直接使用命令
java -version
javac -version
alternatives注册实际是创建软连接到 /usr/bin/java,切换就是改变/usr/bin/java连接指向。
如果我们创建了环境变量,如何去处理环境变量和alternatives的切换问题,这才是本文章注意的目的。
5.环境变量
已经通过alternatives注册了,还需要配置环境变量吗?
alternatives仅影响 /usr/bin 下的命令链接,而有些应用可能无法获取/usr/bin目录,当然也就没法找到java了。所以环境变量还是需要配置的。
5.1.全局配置(所有用户生效)
sudo tee /etc/profile.d/jdk.sh << 'EOF'
export JAVA_HOME=/u01/jdk/jdk1.8.0_202
export PATH=$JAVA_HOME/bin:$PATH
EOF
# 立即生效
source /etc/profile.d/jdk.sh
验证,切换用户测试
su - iRain
java -version
5.2.存在问题
当我们配置环境变量后,通过alternatives切换,你会发现$JAVA_HOME没有跟着切换,这导致了我们只是切换了alternatives,而环境变量对应的$JAVA_HOME并没有切换
解决该问题,我们通过自动化脚本,修改 /etc/profile.d/jdk.sh,内容如下:
jdk_switch() {
# 动态提取所有有效JDK路径
echo "正在扫描可用JDK版本..."
mapfile -t jdk_paths < <(
sudo alternatives --display java |
grep -oP '/[^ ]+/bin/java(?= |$)' |
sort -u
)
# 检查结果
if [ ${#jdk_paths[@]} -eq 0 ]; then
echo "错误:未检测到已注册的JDK!"
echo "请先使用以下命令注册JDK:"
echo "sudo alternatives --install /usr/bin/java java /path/to/jdk/bin/java 优先级"
return 1
fi
# 显示带编号的菜单
echo "可用JDK版本:"
for i in "${!jdk_paths[@]}"; do
echo "$((i+1))) ${jdk_paths[i]}"
done
# 用户选择
while true; do
read -p "选择版本编号 (1-${#jdk_paths[@]}): " choice
[[ "$choice" =~ ^[0-9]+$ ]] && \
(( choice >= 1 && choice <= ${#jdk_paths[@]} )) && break
echo "无效输入,请重新选择!"
done
target_java="${jdk_paths[choice-1]}"
# 执行切换
if sudo alternatives --set java "$target_java"; then
export JAVA_HOME=$(dirname $(dirname "$target_java"))
export PATH="/usr/bin:$JAVA_HOME/bin:$PATH"
echo "切换成功!当前JDK:"
echo "JAVA_HOME=$JAVA_HOME"
java -version
else
echo "切换失败!请检查sudo权限。"
return 1
fi
}
立即生效,设置权限所有用户可用
sudo chmod +x /etc/profile.d/jdk.sh
source /etc/profile.d/jdk.sh
6.切换验证
jdk_switch
上图可知,切换正确。
(end)