当前位置: 首页 > news >正文

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 目录

导致问题:

  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 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                 # 验证是否生效

相关文章:

  • 桂林象鼻山景区简介惠州seo全网营销
  • 校园网站设计与实现毕业论文天津seo招聘
  • 外贸网站建设哪家实惠手游推广赚佣金的平台
  • 建设网站门户免费网站制作app
  • 北京集团网站建设青岛seo计费
  • 网站模型怎么做搜索引擎关键词怎么优化
  • LINUX 626 DNS报错
  • 【工具推荐】WaybackLister——发现潜在目录列表
  • JavaEE:分布式session
  • 2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(五)
  • centos 7 安装NVIDIA Container Toolkit
  • 【unity游戏开发——网络】计算机网络中的三种数据管理模型(分散式、集中式、分布式)和三大通信模型(C/S、B/S、P2P)
  • 环境太多?不好管理怎么办?TakMll 工具帮你快速切换和管理多语言、多版本情况下的版本切换。
  • Tailwind CSS 重用样式
  • 内测分发平台是否支持应用的微服务化部署
  • Spring Boot使用Redis常用场景
  • 代码随想录|图论|04广度优先搜索理论基础
  • Vue 3 最基础核心知识详解
  • Go语言与云原生:Kubernetes Operator开发全流程
  • docker 安装Elasticsearch + kibana + ik分词器
  • Golang单例实现
  • Spring学习笔记【8】
  • 八股文——JAVA基础:基本数据类型与包装类的区别
  • 【Ansible】Ansible入门
  • 数的范围(连续数字边界)
  • OceanBase向量检索在货拉拉的探索和实践