在CentOS系统中,由于不同项目或应用程序可能依赖不同版本的Java开发工具包(JDK),能够熟练、高效地在多个已安装的JDK版本之间进行切换,是开发人员和系统管理员必备的一项核心技能,本文将详细介绍在CentOS环境下切换JDK版本的几种主流方法,重点阐述最优雅且受推荐的alternatives机制,并对其他方式进行补充说明,旨在为您提供一个清晰、全面且可操作性强的指南。

前提条件:安装多个JDK版本
在开始切换之前,您的系统中必须已经安装了至少两个不同的JDK版本,您可以通过多种方式安装它们,例如使用yum(或dnf)包管理器安装OpenJDK,或者直接从Oracle或其他厂商(如Adoptium)官网下载二进制包进行手动安装。
以使用yum安装OpenJDK 8和OpenJDK 11为例:
# 安装OpenJDK 8 sudo yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel # 安装OpenJDK 11 sudo yum install -y java-11-openjdk java-11-openjdk-devel
安装完成后,您可以通过ls -l /usr/lib/jvm/命令查看已安装的JDK目录,确认它们均已存在。
使用alternatives命令(官方推荐)
alternatives是CentOS及衍生系统(如RHEL、Fedora)中专门用于管理同一软件的多个版本的强大工具,它通过创建和维护一组符号链接,使得切换软件版本变得异常简单和安全,这是在CentOS上管理JDK版本的首选方案。
配置Java运行时环境(java)
我们需要配置java命令,执行以下命令:
sudo alternatives --config java
系统会列出所有注册到alternatives系统中的java可执行文件,并提示您进行选择:
有 2 个程序提供“java”。
选择 命令
-----------------------------------------------
*+ 1 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64/jre/bin/java)
2 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.20.0.8-2.el7_9.x86_64/bin/java)
按 Enter 来保留当前选择[+],或键入选择号码:
在这个界面中:
- 号旁边的数字(这里是
1)表示当前正在使用的版本。 - 输入您想要切换到的版本对应的数字(输入
2切换到JDK 11),然后按回车键即可。
配置Java编译器(javac)
仅仅切换java运行时是不够的,您还需要确保javac编译器也指向了正确的版本。java和javac在alternatives中是独立管理的。
执行以下命令来配置javac:

sudo alternatives --config javac
您会看到类似的提示,只需选择与之前java版本相匹配的javac版本即可。
验证版本
切换完成后,打开一个新的终端会话(或执行source /etc/profile以确保环境变量生效),然后运行以下命令进行验证:
# 查看Java运行时版本 java -version # 查看Java编译器版本 javac -version
确保两个命令输出的版本号与您期望的一致,切换到JDK 11后,输出应包含0.x字样。
手动修改环境变量(临时或应急方案)
如果您不使用alternatives系统,或者某些情况下alternatives无法满足需求(通过解压安装的非标准JDK),可以通过手动修改PATH和JAVA_HOME环境变量来实现切换,这种方法不够优雅,且通常是临时的。
确定JDK路径
找到您要使用的JDK的安装路径。/usr/lib/jvm/java-11-openjdk。
修改环境变量
在当前终端会话中,临时设置环境变量:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$JAVA_HOME/bin:$PATH
设置后,您可以立即通过java -version和javac -version进行验证,但请注意,这种设置仅对当前终端窗口有效,关闭窗口后即失效。
若要永久生效,需要将上述export命令添加到您的shell配置文件中,如~/.bashrc或~/.bash_profile,然后执行source ~/.bashrc,这种方式在需要频繁切换时显得非常繁琐。
两种方法对比
| 特性 | alternatives命令 |
手动修改环境变量 |
|---|---|---|
| 易用性 | 高,交互式菜单,一键切换 | 低,需手动查找路径并修改配置文件 |
| 持久性 | 永久,系统级生效 | 临时(会话级)或需手动配置才能永久 |
| 作用范围 | 系统级,影响所有用户 | 通常为当前用户,除非修改全局配置文件 |
| 安全性 | 高,由系统管理,不易出错 | 低,容易因路径错误导致问题 |
| 推荐度 | ★★★★★ | ★☆☆☆☆ (仅作临时或备用方案) |
处理JAVA_HOME环境变量
alternatives工具本身不管理JAVA_HOME变量,但许多Java应用(如Maven、Tomcat)依赖此变量,一个优雅的解决方案是创建一个脚本,根据alternatives当前的选择动态设置JAVA_HOME。

创建一个新文件,例如/etc/profile.d/java_home.sh:
sudo vim /etc/profile.d/java_home.sh
在文件中添加以下内容:
#!/bin/bash # 动态设置JAVA_HOME export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
这个脚本会读取/usr/bin/java符号链接(由alternatives管理)所指向的真实路径,并去除末尾的bin/java,从而得到JDK的根目录,保存文件后,新登录的用户会话都将自动拥有正确的JAVA_HOME变量。
相关问答FAQs
问题1:我已经使用 sudo alternatives --config java 切换到了JDK 11,但是当我运行 javac -version 时,它显示的仍然是旧版本(JDK 8),这是什么原因?
解答: 这是因为 alternatives 将 java(运行时)和 javac(编译器)视为两个独立的程序进行管理,当您切换 java 时,它不会自动为您切换 javac,您必须为 javac 也执行一次相同的切换命令,请运行 sudo alternatives --config javac,在弹出的列表中选择与您已切换的 java 版本相匹配的 javac 版本(如果选择了OpenJDK 11的 java,这里也要选择OpenJDK 11的 javac),然后再次验证即可。
问题2:alternatives 工具会自动设置 JAVA_HOME 环境变量吗?如果没有,我怎样才能让它在我切换JDK版本后自动更新?
解答: 不,alternatives 本身不管理 JAVA_HOME 环境变量,它只管理可执行文件(如 java, javac)的符号链接,为了解决这个问题,最佳实践是创建一个动态设置脚本,如上文所述,您可以在 /etc/profile.d/ 目录下创建一个 .sh 文件(java_home.sh为 export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::"),这样,每次用户登录时,该脚本都会自动运行,它会读取 java 命令的实际路径,并据此动态地、正确地设置 JAVA_HOME,使其始终与 alternatives 当前选择的JDK版本保持一致。