Linux切换JDK版本实现方式

 更新时间:2026年03月05日 10:20:42   作者:0xDevNull  
本文详细介绍了在CentOS/RHEL系统上手动安装和切换多个JDK版本的步骤,包括注册JDK到alternatives系统、配置动态JAVA_HOME、交互式切换版本以及验证切换结果,通过这些步骤,用户可以轻松管理多个JDK版本,并根据需要进行切换,无需重启服务器

假设你的服务器上已经手动安装了以下三个版本的 JDK(路径仅为示例,请替换为你实际的路径):

  • JDK 8: /usr/local/java/jdk-1.8.0_391
  • JDK 11: /usr/local/java/jdk-11.0.21
  • JDK 17: /usr/local/java/jdk-17.0.9

第一步:将新安装的 JDK 注册到 alternatives 系统

如果你是通过 yum/dnf 安装的,系统通常会自动注册。但如果你是手动解压安装的(如上一轮对话所述),你需要手动告诉系统:“嘿,这里有个新的 Java 版本,请把它加入候选列表”。

我们需要分别注册 java (运行环境) 和 javac (编译器)。

1. 注册 JDK 8

#/usr/local/java/jdk-1.8.0_391/ 这是你的服务器的jdk安装路径
# 注册 java 命令 (优先级设为 108,数字越大优先级越高,但交互模式下不重要)
sudo alternatives --install /usr/bin/java java /usr/local/java/jdk-1.8.0_391/bin/java 108

# 注册 javac 命令
sudo alternatives --install /usr/bin/javac javac /usr/local/java/jdk-1.8.0_391/bin/javac 108

2. 注册 JDK 11

sudo alternatives --install /usr/bin/java java /usr/local/java/jdk-11.0.21/bin/java 111
sudo alternatives --install /usr/bin/javac javac /usr/local/java/jdk-11.0.21/bin/javac 111

3. 注册 JDK 17

sudo alternatives --install /usr/bin/java java /usr/local/java/jdk-17.0.9/bin/java 117
sudo alternatives --install /usr/bin/javac javac /usr/local/java/jdk-17.0.9/bin/javac 117

参数解释

  • /usr/bin/java: 系统通用的命令路径(用户敲 java 时实际调用的位置)。
  • java: 这个替代组的名称。
  • /usr/local/.../bin/java: 你实际安装的 JDK 文件路径。
  • 108/111/117: 优先级。如果不进行自动切换,这个数字仅用于排序;在手动交互模式下,选哪个完全由你决定。

工作流程图解释

当你执行完 --install 后,系统内部发生了以下变化:

  1. 创建主链接/usr/bin/java -> /etc/alternatives/java
  2. 创建实际指向/etc/alternatives/java -> /usr/local/java/jdk-17/bin/java (你注册的路径)
  3. 记录配置:在 /var/lib/alternatives/java 文件中记录下所有已注册的版本列表和优先级。

以后当你运行 sudo alternatives --config java 时,系统就是读取这个列表让你选。一旦你选了新的版本,它只需要修改 /etc/alternatives/java 这个中间层的指向,瞬间完成切换,无需重启。

常见错误排查

错误 1:link path already exists

  • 现象:提示 /usr/bin/java 已经存在。
  • 原因:该命令只能用于新增版本。如果 /usr/bin/java 已经被其他版本占用(或者已经被注册过),你不能重复执行 --install 来覆盖它。

解决

  • 如果是想更新已有版本的路径:先用 --remove 删除旧路径,再 --install 新路径。
  • 如果是想添加第二个版本:直接运行命令即可,alternatives 允许同一个组名下有多个不同路径的注册,它会自动管理链接。注:如果提示存在,通常是因为你之前已经成功注册过该路径,无需再次注册。

错误 2:permission denied

  • 原因:没有加 sudo。修改 /usr/bin/etc/alternatives 需要 root 权限。
  • 解决:在命令前加 sudo

错误 3:优先级设置混乱

  • 现象:自动模式下切换到了不想要的版本。
  • 解决:手动模式 (--config) 不受优先级影响。如果在自动模式下,确保最高优先级的数字给的是你希望默认使用的那个版本。或者直接使用 sudo alternatives --auto java 让系统自动选优先级最高的,或用 --config 强制手动指定。

第二步:配置动态 JAVA_HOME(推荐)

为了让 JAVA_HOME 随 alternatives 切换自动更新,在/etc/profile.d/java.sh文件中添加:

# 编辑Java.sh
vim /etc/profile.d/java.sh
# 检测 java 命令是否存在
if [ -x "/usr/bin/java" ]; then
    # 1. 动态获取 JAVA_HOME
    # 核心逻辑:解析 /usr/bin/java 的真实路径并去掉 /bin/java 后缀
    export JAVA_HOME=$(readlink -f /usr/bin/java | sed 's:/bin/java::')
     # 将当前 JAVA_HOME 的 bin 目录加入 PATH (通常 /usr/bin 已经在 PATH 里,但这步是为了确保优先级或完整性)
    export PATH=$JAVA_HOME/bin:$PATH

    # 2. 动态配置 JRE_HOME (兼容 JDK 8 和 JDK 11+)
    if [ -d "$JAVA_HOME/jre" ]; then
        # JDK 8: 存在独立的 jre 目录
        export JRE_HOME=$JAVA_HOME/jre
    else
        # JDK 9+: 没有独立 jre 目录,JRE_HOME 通常指向 JAVA_HOME 本身,或者留空让应用自动识别
        # 许多现代应用如果检测到 JRE_HOME 不存在,会自动 fallback 到 JAVA_HOME
        export JRE_HOME=$JAVA_HOME
    fi

    # 3. 动态配置 CLASSPATH
    # 注意:现代 JDK (9+) 其实不需要手动设置 CLASSPATH 来包含 rt.jar,
    # 但为了兼容旧脚本,我们保留逻辑,只在存在 lib 目录时添加。
    
    CP_PATH=".:"
    
    # 添加 $JAVA_HOME/lib (主要针对 JDK 8 的 tools.jar 等,JDK 9+ 下此目录也存在但内容不同)
    if [ -d "$JAVA_HOME/lib" ]; then
        CP_PATH="${CP_PATH}$JAVA_HOME/lib:"
    fi

    # 添加 $JRE_HOME/lib (主要针对 JDK 8 的 rt.jar)
    if [ -d "$JRE_HOME/lib" ]; then
        # 防止重复添加 (当 JRE_HOME == JAVA_HOME 时)
        if [ "$JRE_HOME" != "$JAVA_HOME" ]; then
            CP_PATH="${CP_PATH}$JRE_HOME/lib:"
        fi
    fi

    # 去掉末尾多余的冒号并导出
    export CLASSPATH=${CP_PATH%:}
fi

然后保存后退出,执行下面生效配置:

source /etc/profile.d/java.sh

验证是否生效

# 检查当前 Java 版本
java -version
javac -version

# 检查 JAVA_HOME
echo $JAVA_HOME

# 查看 alternatives 当前配置
alternatives --display java

第三步:交互式切换版本(核心步骤)

现在所有版本都注册好了,你可以使用 --config 参数来选择一个默认版本。

1. 切换java(运行环境)在终端输入

sudo alternatives --config java

你会看到类似这样的输出:

There are 3 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
+ 1           /usr/local/java/jdk-1.8.0_391/bin/java
* 2           /usr/local/java/jdk-11.0.21/bin/java
  3           /usr/local/java/jdk-17.0.9/bin/java

Enter to keep the current selection[+], or type selection number:

符号说明

    • + : 表示当前正在使用的版本。
    • * : 表示上次手动选择的版本(如果没改过,通常和 + 一样)。

操作方法

    • 如果想切换到 JDK 17,直接输入数字 3 然后按 回车
    • 如果想保持现状,直接按 回车

2. 切换javac(编译器)注意

java和javac是分开管理的!切换完运行环境后,务必也切换编译器,否则可能出现“用 JDK 17 运行,却用 JDK 8 编译”的奇怪错误。

在终端输入:

sudo alternatives --config javac

操作同上:看到列表后,输入对应 JDK 版本的数字编号并回车。

第四步:验证切换结果

切换完成后,不需要重启服务器,立即生效。请运行以下命令确认:

# 1. 检查运行版本
java -version

# 2. 检查编译版本
javac -version

# 检查 JAVA_HOME
echo $JAVA_HOME

# 查看 alternatives 当前配置
alternatives --display java

常见问题与技巧

Q1: 我想删除某个注册的版本怎么办?如果你卸载了 JDK 11,需要把它从 alternatives 列表中移除,否则会报错找不到文件。

# 语法:sudo alternatives --remove <组名> <完整路径>
sudo alternatives --remove java /usr/local/java/jdk-11.0.21/bin/java
sudo alternatives --remove javac /usr/local/java/jdk-11.0.21/bin/javac

Q2: 如何查看当前有哪些版本被注册了(不切换)?

alternatives --display java
alternatives --display javac

这会列出所有已注册的 path 和当前的状态,适合脚本检查。

Q3: 为什么我输入命令提示command not found?确保你使用的是sudo,因为修改/usr/bin下的链接需要 root 权限。普通用户只能查看 (alternatives --display) 不能配置。

总结

在 CentOS/RHEL 上切换 JDK 的核心逻辑就是:

1. 手动安装 -> 2. alternatives --install 注册 -> 3. alternatives --config 选择

一旦注册过,以后随时可以通过第 3 步瞬间切换,无需修改任何配置文件或重启服务。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Linux基础之xargs命令的入门实例

    Linux基础之xargs命令的入门实例

    你是否遇到过这样的情况,需要一遍又一遍地对多个文件执行同样的操作?如果有那你肯定会深有感触这是多么的无聊和效率低下。还好有种简单的方式,可以使用xargs命令解决这个烦恼。本文介绍了Linux基础学习之xargs命令入门的相关资料,需要的朋友可以参考下。
    2017-12-12
  • Linux使用traceroute来进行网络诊断分析

    Linux使用traceroute来进行网络诊断分析

    在Linux系统下,traceroute是一个网络诊断工具,用于追踪一个数据包从源点到目的地所经过的路由路径,它通过向目的地发送一系列的 UDP 或 ICMP 数据包,并记录每个数据包所经过的路由器,来显示数据包到达目的地的路径,本文介绍了Linux如何使用traceroute来进行网络诊断分析
    2025-03-03
  • linux定时任务的一些相关操作汇总

    linux定时任务的一些相关操作汇总

    这篇文章主要给大家介绍了关于linux定时任务的一些相关操作,文中通过示例代码介绍的非常详细,对大家学习或者使用linux系统组件具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • Apache HTTP Server 从安装到配置过程详解

    Apache HTTP Server 从安装到配置过程详解

    Apache(全称)是当前最流行的开源Web服务器软件之一,由Apache软件基金会维护,它以和著称,支持Linux、Windows等多平台,是搭建个人博客、企业官网乃至复杂Web应用的首选工具,本文给大家介绍Apache HTTP Server 从安装到配置方法,感兴趣的朋友一起看看吧
    2025-07-07
  • Linux实现添加新用户及创建主目录方式

    Linux实现添加新用户及创建主目录方式

    这篇文章主要介绍了Linux实现添加新用户及创建主目录方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 使用PSSH批量管理Linux服务器

    使用PSSH批量管理Linux服务器

    pssh是python开发的一个用来批量管理linux主机的工具,现在我们来介绍pssh的使用方法。
    2018-09-09
  • Centos7开机启动自己的脚本的方法

    Centos7开机启动自己的脚本的方法

    本篇文章主要介绍了Centos7开机启动自己的脚本的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • varnish 配置文件分享(sens杨 注释)

    varnish 配置文件分享(sens杨 注释)

    varnish 为目前新兴起来的软件,由于中文文档比较少,配置文件比较复杂,所以在运用起来也是特别的费劲。一个偶然的机会在一个群里,有位varnish高手( sens杨 )发表了一篇他对varnish配置文件理解的文档。对于学者来说很有价值。所以转载了过来
    2016-02-02
  • linux ssh 使用深度解析(key登录详解)

    linux ssh 使用深度解析(key登录详解)

    这篇文章主要介绍了linux ssh 使用深度解析(key登录详解),需要的朋友可以参考下
    2015-07-07
  • Centos7安装配置NFS服务和挂载教程(推荐)

    Centos7安装配置NFS服务和挂载教程(推荐)

    下面小编就为大家带来一篇Centos7安装配置NFS服务和挂载教程(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论