实现Linux下多版本JDK管理与切换教程(使用alternatives工具)
作者:hangge | 2026-07-21 09:23
在实际开发中,我们经常会遇到既要维护老项目又要跟进新特性的情况,这就需要在一台机器上同时安装并切换多个 JDK 版本。本文将详细介绍如何使用 alternatives 工具在 Linux 系统上实现多版本 JDK 的安装、注册和切换。


一、基本介绍
1,alternatives 是什么?
(1)alternatives(或 update-alternatives)是 Debian/Ubuntu 等 Linux 发行版提供的版本管理工具,用于在多个相同功能的程序之间进行切换。
(2)它的工作原理是:在 /usr/bin 目录下创建符号链接,指向 /etc/alternatives 下的文件,再由后者指向实际的程序路径。通过修改这个中间层的链接,就能实现不同版本之间的切换。
(3)核心优势:
- 统一管理:可以管理 java、javac、jar 等多个命令
- 一键切换:通过交互式菜单或命令快速切换版本
- 自动关联:切换 java 时,相关命令(如 javac)可以同步切换
- 适用广泛:不仅限于 JDK,也可用于 Python、PHP 等多版本管理
2,应用场景
- 同时维护多个不同 Java 版本的项目(如 JDK 8 老项目 + JDK 17 新项目)
- 测试应用在不同 JDK 版本下的兼容性
- CI/CD 环境中需要动态切换构建环境
- 服务器上运行多个不同版本的 Java 应用
提示:如果是需要在不同项目间频繁切换,也可以考虑使用 SDKMAN! 或 jEnv 等专门工具。但对于系统级别的版本管理,alternatives 仍然是最直接的方案。
二、安装配置
1,准备工作
(1)首先确认系统已安装 alternatives 工具:
which update-alternatives

(2)如果命令不存在,可以通过包管理器安装:
提示:大多数 Linux 发行版默认已安装 alternatives,通常无需额外安装。
# Debian/Ubuntu sudo apt-get update sudo apt-get install alternatives # CentOS/RHEL sudo yum install chkconfig
2,安装多个 JDK 版本
(1)本文以安装 JDK 8、JDK 11、JDK 17 和 JDK 21 为例进行演示。首先下载对应版本的压缩包。
提示:Oracle JDK 17 及以上版本提供了 Script Friendly URLs,可以直接使用 wget 下载。而 JDK 8 和 JDK 11 需要在 Oracle 官网手动下载或使用带 cookie 的 wget 命令。
# 下载 JDK 21(使用官方 Script Friendly URL) wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz # 下载 JDK 17(使用官方 Script Friendly URL) wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz # 下载 JDK 11(需要 Oracle 账号,或使用 OpenJDK) # 方式1:手动从 Oracle 官网下载 # 方式2:使用 OpenJDK(推荐) wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz # 下载 JDK 8(需要 Oracle 账号,或使用 OpenJDK) # 方式1:手动从 Oracle 官网下载 # 方式2:使用 OpenJDK(推荐) # OpenJDK 8 下载地址:https://adoptium.net/temurin/releases/?version=8
(2)创建安装目录并解压:
提示:也可以使用包管理器直接安装 OpenJDK,安装后系统会自动注册到 alternatives。但本文推荐手动安装,更方便自定义版本和路径。
# 创建JVM目录 sudo mkdir -p /usr/lib/jvm # 解压JDK安装包(以JDK 8为例) sudo tar -zxvf jdk-8u411-linux-x64.tar.gz -C /usr/lib/jvm/ # 重命名目录(方便管理) sudo mv /usr/lib/jvm/jdk1.8.0_411 /usr/lib/jvm/java-8 # 同理安装 JDK 11 sudo tar -zxvf jdk-11.0.23_linux-x64_bin.tar.gz -C /usr/lib/jvm/ sudo mv /usr/lib/jvm/jdk-11.0.23 /usr/lib/jvm/java-11 # 同理安装 JDK 17 sudo tar -zxvf jdk-17.0.11_linux-x64_bin.tar.gz -C /usr/lib/jvm/ sudo mv /usr/lib/jvm/jdk-17.0.11 /usr/lib/jvm/java-17 # 同理安装 JDK 21 sudo tar -zxvf jdk-21.0.3_linux-x64_bin.tar.gz -C /usr/lib/jvm/ sudo mv /usr/lib/jvm/jdk-21.0.3 /usr/lib/jvm/java-21
3,注册 JDK 到 alternatives
(1)接下来需要将各个 JDK 版本注册到 alternatives 系统。注册时需要指定:
- 链接名称:如 /usr/bin/java
- 名称标识:如 java
- 实际路径:JDK 的可执行文件路径
- 优先级:数字越大优先级越高
提示:下面命令中的优先级(100/200/300/400)会影响自动模式下的默认选择。优先级最高的版本会在自动模式下被选中。这里 JDK 21 的优先级最高(400),因此在自动模式下会默认使用 JDK 21。
(2)注册 JDK 8 的相关命令:
注意:如果系统中已有其他 JDK 注册,需要使用 sudo 权限执行以下命令。
# 注册 java 命令 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8/bin/java 100 # 注册 javac 命令 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-8/bin/javac 100 # 注册 jar 命令 sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/java-8/bin/jar 100
(3)注册 JDK 11 的相关命令:
# 注册 java 命令 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11/bin/java 200 # 注册 javac 命令 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-11/bin/javac 200 # 注册 jar 命令 sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/java-11/bin/jar 200
(4)注册 JDK 17 的相关命令:
# 注册 java 命令 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17/bin/java 300 # 注册 javac 命令 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17/bin/javac 300 # 注册 jar 命令 sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/java-17/bin/jar 300
(5)注册 JDK 21 的相关命令:
# 注册 java 命令 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21/bin/java 400 # 注册 javac 命令 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-21/bin/javac 400 # 注册 jar 命令 sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/java-21/bin/jar 400
三、版本切换实操
1,查看已注册的 JDK 版本
(1)使用以下命令查看所有已注册的 java 版本:
sudo update-alternatives --display java
(2)也可以使用 --list 参数查看简洁列表:
sudo update-alternatives --list java
2,交互式切换版本
(1)执行以下命令进入交互式选择界面:
sudo update-alternatives --config java
(2)在显示的列表中,输入对应的编号即可切换到对应版本。当前被选中的版本前会有 * 标记。

(3)切换 java 命令后,javac、jar命令不会自动切换,我们还需要执行 --config javac 切换。
sudo update-alternatives --config javac sudo update-alternatives --config jar

3,命令行直接切换
(1)如果不想进入交互界面,可以使用 --set 参数直接指定版本:
# 直接切换到 JDK 8 sudo update-alternatives --set java /usr/lib/jvm/java-8/bin/java # 同时切换 javac、jar sudo update-alternatives --set javac /usr/lib/jvm/java-8/bin/javac sudo update-alternatives --set javac /usr/lib/jvm/java-8/bin/jar
(2)验证当前版本:
java -version javac -version
4,批量切换脚本
(1)为了方便一次性切换所有相关命令,可以编写一个切换脚本:
# 创建切换脚本 cat > ~/switch-java.sh << 'EOF' #!/bin/bash JAVA_PATH=$1 if [ -z "$JAVA_PATH" ]; then echo "Usage: ./switch-java.sh <java-path>" echo "Example: ./switch-java.sh /usr/lib/jvm/java-8" exit 1 fi sudo update-alternatives --set java $JAVA_PATH/bin/java sudo update-alternatives --set javac $JAVA_PATH/bin/javac sudo update-alternatives --set jar $JAVA_PATH/bin/jar echo "Switched to: $JAVA_PATH" java -version EOF # 添加执行权限 chmod +x ~/switch-java.sh
(2)使用脚本快速切换:
# 切换到 JDK 8 ~/switch-java.sh /usr/lib/jvm/java-8 # 切换到 JDK 17 ~/switch-java.sh /usr/lib/jvm/java-17
5,删除已注册的 JDK
如果需要移除某个已注册的版本,使用 --remove 参数:
# 删除 JDK 8 的注册 sudo update-alternatives --remove java /usr/lib/jvm/java-8/bin/java sudo update-alternatives --remove javac /usr/lib/jvm/java-8/bin/javac sudo update-alternatives --remove jar /usr/lib/jvm/java-8/bin/jar
全部评论(0)