Linux 统一方式安装多版本 JDK 指南
一、统一使用压缩包安装方案的优势
- 一致性管理:避免不同安装方式导致的路径差异(如 RPM 包默认安装在
/usr/java
,OpenJDK 安装在/usr/lib/jvm
) - 灵活性更高:自定义安装路径,便于版本隔离和迁移
- 依赖简化:减少对系统包管理器的特殊依赖
二、卸载旧版本 JDK(可选)
# 查看已安装的 Java
yum list installed | grep java
# 卸载不需要的版本
yum remove java-1.7.0-openjdk java-1.8.0-openjdk -y
三、统一安装路径规划
# 创建统一安装目录
mkdir -p /opt/jdk/{8,17,21}
chmod 755 /opt/jdk -R
四、下载 JDK 安装包(统一使用压缩包)
Linux 最新的jdk8、jdk17、jdk21压缩包(截至20250626日)
五、统一解压安装流程
# 安装 JDK 8
tar -xzvf /data/jdk/jdk-8u441-linux-x64.tar.gz -C /opt/jdk/8 --strip-components=1# 安装 JDK 17
tar -zxvf /data/jdk/jdk-17.0.14_linux-x64_bin.tar.gz -C /opt/jdk/17 --strip-components=1# 安装 JDK 21
tar -zxvf /data/jdk/jdk-21_linux-x64_bin.tar.gz -C /opt/jdk/21 --strip-components=1# 赋予执行权限
chmod +x /opt/jdk/*/bin/* -R
六、统一环境变量与版本管理配置
1. 全局环境变量配置
vim /etc/profile.d/jdk.sh
添加以下内容:
# JDK 统一安装路径
export JDK_HOME=/opt/jdk
export JDK8_HOME=$JDK_HOME/8
export JDK17_HOME=$JDK_HOME/17
export JDK21_HOME=$JDK_HOME/21# 默认使用 JDK 17(LTS 版本)
export JAVA_HOME=$JDK17_HOME
export PATH=$JAVA_HOME/bin:$PATH# 版本切换函数(支持 tab 补全)
jdk() {case $1 in8) export JAVA_HOME=$JDK8_HOME ;;17) export JAVA_HOME=$JDK17_HOME ;;21) export JAVA_HOME=$JDK21_HOME ;;*) echo "Usage: jdk {8|17|21}" && return 1 ;;esacexport PATH=$JAVA_HOME/bin:$PATHecho "当前 JDK 版本:"; java -version
}# 补全功能配置
complete -W "8 17 21" jdk
2. 使配置生效
source /etc/profile.d/jdk.sh
七、注册 alternatives 实现系统级版本切换
1. 正确移除 JDK 配置
方法 1:使用 --remove-all
(推荐)
# 移除 java 配置(注意名称是 "java")
sudo alternatives --remove-all java# 移除 javac 配置(名称是 "javac")
sudo alternatives --remove-all javac
方法 2:手动删除配置文件(如果 --remove-all
无效)
# 删除 alternatives 的配置文件
sudo rm -f /var/lib/alternatives/java
sudo rm -f /var/lib/alternatives/javac# 删除软链接(如果有残留)
sudo rm -f /usr/bin/java
sudo rm -f /usr/bin/javac
2. 注册 JDK
# JDK 8(完整版)
sudo alternatives --install /usr/bin/java java $JDK8_HOME/bin/java 1 \--slave /usr/bin/javac javac $JDK8_HOME/bin/javac \--slave /usr/bin/jshell jshell $JDK8_HOME/bin/jshell# JDK 17(完整版)
sudo alternatives --install /usr/bin/java java $JDK17_HOME/bin/java 2 \--slave /usr/bin/javac javac $JDK17_HOME/bin/javac \--slave /usr/bin/jshell jshell $JDK17_HOME/bin/jshell# JDK 21(完整版)
sudo alternatives --install /usr/bin/java java $JDK21_HOME/bin/java 3 \--slave /usr/bin/javac javac $JDK21_HOME/bin/javac \--slave /usr/bin/jshell jshell $JDK21_HOME/bin/jshell
八、验证多版本切换功能
# 方式一:使用 alternatives 切换
alternatives --config java
# 输入对应编号(1=JDK8,2=JDK17,3=JDK21)# 方式二:使用脚本函数切换
jdk 8 # 切换到 JDK 8
jdk 17 # 切换到 JDK 17
jdk 21 # 切换到 JDK 21# 验证版本
java -version
javac -version
九、问题总结
环境变量配置文件中硬编码了 JAVA_HOME
和 PATH
:
# 默认使用 JDK 17(LTS 版本)
export JAVA_HOME=$JDK17_HOME # 始终指向 JDK 17
export PATH=$JAVA_HOME/bin:$PATH # 始终优先使用 JDK 17 的 bin 目录
导致问题:
- 无论
alternatives
如何配置,系统始终优先使用JAVA_HOME
指向的 JDK 版本(即 JDK 17)。 - 当你执行
alternatives --config java
切换版本后,虽然/usr/bin/java
符号链接指向了新 JDK 版本,但由于PATH
中$JAVA_HOME/bin
排在/usr/bin
之前,系统会优先调用$JAVA_HOME/bin/java
(即 JDK 17)。
十、解决方案
方案 1:移除硬编码,依赖 alternatives
注释掉或删除固定的 JAVA_HOME
和 PATH
设置,仅保留版本切换函数:
# JDK 统一安装路径
export JDK_HOME=/opt/jdk
export JDK8_HOME=$JDK_HOME/8
export JDK17_HOME=$JDK_HOME/17
export JDK21_HOME=$JDK_HOME/21# 默认使用 alternatives 配置的版本(删除或注释以下两行)
# export JAVA_HOME=$JDK17_HOME
# export PATH=$JAVA_HOME/bin:$PATH# 版本切换函数(支持 tab 补全)
jdk() {case $1 in8) export JAVA_HOME=$JDK8_HOME ;;17) export JAVA_HOME=$JDK17_HOME ;;21) export JAVA_HOME=$JDK21_HOME ;;*) echo "Usage: jdk {8|17|21}" && return 1 ;;esacexport PATH=$JAVA_HOME/bin:$PATHecho "当前 JDK 版本:"; java -version
}# 补全功能配置
complete -W "8 17 21" jdk
验证方法:
source /etc/profile.d/jdk.sh # 重新加载配置
java -version # 应显示 alternatives 配置的版本
alternatives --config java # 切换版本
java -version # 验证是否生效
方案 2:保留环境变量配置,但动态更新
修改 jdk
函数,使其在切换版本时同时更新 alternatives
配置:
# JDK 统一安装路径
export JDK_HOME=/opt/jdk
export JDK8_HOME=$JDK_HOME/8
export JDK17_HOME=$JDK_HOME/17
export JDK21_HOME=$JDK_HOME/21# 默认使用 JDK 17(LTS 版本)
export JAVA_HOME=$JDK17_HOME
export PATH=$JAVA_HOME/bin:$PATH# 增强版版本切换函数(同时更新 alternatives)
jdk() {case $1 in8) export JAVA_HOME=$JDK8_HOMEalternatives --set java $JDK8_HOME/bin/javaalternatives --set javac $JDK8_HOME/bin/javac;;17) export JAVA_HOME=$JDK17_HOMEalternatives --set java $JDK17_HOME/bin/javaalternatives --set javac $JDK17_HOME/bin/javac;;21) export JAVA_HOME=$JDK21_HOMEalternatives --set java $JDK21_HOME/bin/javaalternatives --set javac $JDK21_HOME/bin/javac;;*) echo "Usage: jdk {8|17|21}" && return 1 ;;esacexport PATH=$JAVA_HOME/bin:$PATHecho "当前 JDK 版本:"; java -version
}# 补全功能配置
complete -W "8 17 21" jdk
验证方法:
source /etc/profile.d/jdk.sh # 重新加载配置
jdk 21 # 使用函数切换到 JDK 21
java -version # 验证是否生效