当前位置: 首页 > 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                 # 验证是否生效

http://www.lryc.cn/news/575688.html

相关文章:

  • python基于协同过滤的动漫推荐系统
  • CSP-J 2021 入门级 第一轮(初赛) 阅读程序(1)
  • CSMA/CD相关习题---谢希仁课后题
  • 数据分享:医学数据集-糖尿病数据集
  • Git 使用规范与命令使用场景详解
  • 与 AI 聊天更顺畅:cat_code.py
  • MIT 6.824学习心得(1) 浅谈分布式系统概论与MapReduce
  • 【全志V821_FoxPi】3-2 Linux 5.4 SPI + XPT2046触摸(ADS7846) + tslib
  • 基于SpringBoot和Leaflet的区域冲突可视化-以伊以冲突为例
  • 重定向攻击与防御
  • 构建可无限扩展的系统:基于 FreeMarker + 存储过程 + Spring Boot 的元数据驱动架构设计
  • aws(学习笔记第四十七课) codepipeline-docker-build
  • [3D-portfolio] 版块包装高阶组件(封装到HOC) | Email表单逻辑 | 链式调用
  • 微服务分布式事务解决方案
  • 数据结构进阶 第七章 图(Graph)
  • 当ERP不再“一刀切“:ERP定制开发如何重塑企业数字神经
  • Charles抓包工具深度解析:从原理到实践的网络数据透视艺术
  • 利用云效实现自动化部署gitee仓库中的项目
  • Tailwind CSS 重用样式
  • 如果你在为理解RDA、PCA 和 PCoA而烦恼,不妨来看看丨TomatoSCI分析日记
  • 临床试验项目管理:高效推进新疗法上市
  • EXILIUM×亚矩云手机:重构Web3虚拟生存法则,开启多端跨链元宇宙自由征途
  • 用 Spark 优化亿级用户画像计算:Delta Lake 增量更新策略详解
  • Mac电脑如何搭建基于java后端的开发的各种工具服务
  • Ubuntu 下降 Linux Kernel 的版本备忘
  • 使用CSS泄露标签属性值 url路径遍历攻击 -- GPN CTF 2025 PAINting Dice
  • 【STL】深入理解 vector 的底层实现思想和使用
  • 东芝e-STUDIO 2323AMW双面复印报计数器溢出故障
  • 【CMake基础入门教程】第七课:查找并使用第三方库(以 find_package() 为核心)
  • [论文阅读] 人工智能+ | 用大语言模型给建筑合规检查“开挂“:BIM领域的自动化革命