返回 导航

其他

hangge.com

实现Linux下多版本JDK管理与切换教程(使用alternatives工具)

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

一、基本介绍

1,alternatives 是什么?

(1)alternatives(或 update-alternatives)是 Debian/UbuntuLinux 发行版提供的版本管理工具,用于在多个相同功能的程序之间进行切换。
(2)它的工作原理是:在 /usr/bin 目录下创建符号链接,指向 /etc/alternatives 下的文件,再由后者指向实际的程序路径。通过修改这个中间层的链接,就能实现不同版本之间的切换。
(3)核心优势:
  • 统一管理:可以管理 javajavacjar 等多个命令
  • 一键切换:通过交互式菜单或命令快速切换版本
  • 自动关联:切换 java 时,相关命令(如 javac)可以同步切换
  • 适用广泛:不仅限于 JDK,也可用于 PythonPHP 等多版本管理

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 8JDK 11JDK 17JDK 21 为例进行演示。首先下载对应版本的压缩包。
提示Oracle JDK 17 及以上版本提供了 Script Friendly URLs,可以直接使用 wget 下载。而 JDK 8JDK 11 需要在 Oracle 官网手动下载或使用带 cookiewget 命令。
# 下载 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 命令后,javacjar命令不会自动切换,我们还需要执行 --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)

回到顶部