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 in
        8)  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 ;;
    esac
    export PATH=$JAVA_HOME/bin:$PATH
    echo "当前 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 目录

导致问题:

  1. 无论 alternatives 如何配置,系统始终优先使用 JAVA_HOME 指向的 JDK 版本(即 JDK 17)。
  2. 当你执行 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 in
        8)  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 ;;
    esac
    export PATH=$JAVA_HOME/bin:$PATH
    echo "当前 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 in
        8)  
            export JAVA_HOME=$JDK8_HOME
            alternatives --set java $JDK8_HOME/bin/java
            alternatives --set javac $JDK8_HOME/bin/javac
            ;;
        17)  
            export JAVA_HOME=$JDK17_HOME
            alternatives --set java $JDK17_HOME/bin/java
            alternatives --set javac $JDK17_HOME/bin/javac
            ;;
        21)  
            export JAVA_HOME=$JDK21_HOME
            alternatives --set java $JDK21_HOME/bin/java
            alternatives --set javac $JDK21_HOME/bin/javac
            ;;
        *)  echo "Usage: jdk {8|17|21}" && return 1 ;;
    esac
    export PATH=$JAVA_HOME/bin:$PATH
    echo "当前 JDK 版本:"; java -version
}

# 补全功能配置
complete -W "8 17 21" jdk

 验证方法

source /etc/profile.d/jdk.sh  # 重新加载配置
jdk 21                        # 使用函数切换到 JDK 21
java -version                 # 验证是否生效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值