在开发和运维工作中,一台服务器上可能同时存在多个版本的Java开发工具包(JDK),某些遗留项目依赖于Java 8,而新项目则可能需要Java 11或更高版本,在这种多版本共存的环境下,如何为系统指定一个默认的JDK版本,确保全局命令(如java, javac)能够调用到正确的版本,就成为一个至关重要的问题,本文将详细介绍在CentOS系统中如何优雅地设置和管理默认的JDK,核心工具是alternatives,这是一个在红帽系Linux发行版中用于管理同名软件多版本的强大工具。

准备工作
在开始之前,请确保您已经具备以下条件:
- 一台运行CentOS 7或更高版本的计算机。
- 拥有
sudo或root权限,因为修改系统级别的默认软件需要管理员权限。 - 系统中已经安装了至少一个JDK版本,如果尚未安装,可以通过
yum或dnf轻松安装OpenJDK,或手动下载安装Oracle JDK。
第一步:检查当前已安装的JDK
我们需要了解系统当前的状态,查看已经安装了哪些JDK版本,打开终端,执行以下命令:
java -version
这个命令会显示当前由PATH环境变量决定的java命令所指向的JDK版本。
要获取系统中所有已安装的Java相关软件包,可以使用:
rpm -qa | grep -E 'jdk|java'
执行后,您可能会看到类似以下的输出,列出了所有已安装的OpenJDK或Oracle JDK软件包及其版本号,这将帮助您确定接下来需要在alternatives中管理的Java路径。
java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64
java-1.8.0-openjdk-headless-1.8.0.322.b06-1.el7_9.x86_64
java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64
java-11-openjdk-headless-11.0.14.1.1-1.el7_9.x86_64
第二步:使用 alternatives 命令管理JDK
alternatives是CentOS设置默认JDK的核心方法,它通过创建和管理一组符号链接,将一个通用名称(如/usr/bin/java)指向特定版本的实际可执行文件,从而实现版本的动态切换。
1 将JDK安装到 alternatives 系统
假设您已经安装了OpenJDK 8和OpenJDK 11,您需要将它们分别注册到alternatives系统中,这里的“安装”并非指软件安装,而是指告诉alternatives工具有这些版本的存在。
以OpenJDK 8为例,首先找到其java可执行文件的路径,它位于/usr/lib/jvm/目录下,您可以使用find或ls命令定位。
ls /usr/lib/jvm/java-1.8.0-openjdk-*/jre/bin/java # 输出示例: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre/bin/java
使用alternatives --install命令进行注册:
sudo alternatives --install /usr/bin/java java /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre/bin/java 1
我们来分解这个命令:

--install: 告诉alternatives我们要添加一个新的软件链接。/usr/bin/java: 通用链接的路径,我们平时执行java命令时系统寻找的就是它。java: 这个链接组的名称,用于内部管理。/usr/lib/jvm/.../bin/java: 这是我们刚刚找到的Java 8的实际可执行文件路径。1: 优先级,这是一个整数,数字越大,优先级越高,当我们自动选择默认版本时,优先级最高的版本会被选中。
为OpenJDK 11执行同样的操作,并给予它更高的优先级(例如2):
sudo alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64/bin/java 2
2 配置默认JDK
注册完成后,您就可以选择默认版本了,使用alternatives --config命令:
sudo alternatives --config java
系统会列出一个交互式菜单,显示所有已注册的Java版本及其优先级,当前默认版本前会有一个号:
共有 2 个程序提供“java”。
选择 命令
-----------------------------------------------
*+ 1 /usr/lib/jvm/java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64/bin/java
2 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre/bin/java
按 Enter 来保存当前选择[+],或键入选择的编号:
输入您希望设为默认的版本对应的编号(输入2选择Java 8),然后按回车键即可。
3 管理其他Java工具
仅仅设置java命令是不够的,开发人员还需要javac(编译器)、jar(打包工具)等,您需要为这些工具分别配置alternatives。
以javac为例:
# 注册 Java 8 的 javac sudo alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/bin/javac 1 # 注册 Java 11 的 javac sudo alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-11-openjdk-11.0.14.1.1-1.el7_9.x86_64/bin/javac 2 # 配置默认的 javac sudo alternatives --config javac
重复此过程,为jar, javadoc等其他关键工具进行配置,确保整个JDK工具链的版本保持一致。
第三步:验证设置
完成配置后,务必进行验证,再次执行java -version和javac -version,检查输出是否为您刚刚选择的版本。
java -version # 输出示例 (如果选择了Java 8): # openjdk version "1.8.0_322" # OpenJDK Runtime Environment (...) # OpenJDK 64-Bit Server VM (...) javac -version # 输出示例: # javac 1.8.0_322
您还可以使用alternatives --display java查看当前java链接组的详细信息,包括当前链接、所有候选版本及其路径和优先级。
替代方案:手动配置环境变量
虽然alternatives是推荐的系统级方法,但在某些特定场景下(如为特定用户配置或在容器环境中),手动设置JAVA_HOME和PATH环境变量也是一种选择。

这通常通过编辑用户目录下的.bashrc或.bash_profile文件,或系统级别的/etc/profile文件来实现。
在/etc/profile.d/目录下创建一个新的脚本文件java_env.sh:
sudo vi /etc/profile.d/java_env.sh
在文件中添加以下内容(以Java 8为例):
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64 export PATH=$JAVA_HOME/bin:$PATH
保存文件后,运行source /etc/profile.d/java_env.sh或重新登录,使配置生效。
注意:这种方法是静态的,切换版本需要手动修改文件并重新加载,它不如alternatives灵活,特别是当需要频繁切换版本时,对于centos设置默认jdk这一需求,alternatives无疑是更优雅、更高效的解决方案。
相关问答FAQs
在CentOS上管理多个JDK版本,有什么最佳实践吗?
解答: 是的,有几个重要的最佳实践,强烈推荐使用alternatives作为系统级版本管理的首选工具,它提供了官方支持且操作安全,不要轻易卸载旧版本的JDK,除非您确定所有依赖它的应用都已迁移,因为这可能导致依赖关系破裂,对于开发者,可以考虑使用像SDKMAN!(Software Development Kit Manager)这样的版本管理工具,它允许在用户级别轻松安装和切换多种JDK、Maven、Gradle等工具,与系统级的alternatives互不干扰,为每个项目明确记录其所需的JDK版本,并在项目文档或构建脚本(如pom.xml, build.gradle)中指定,确保环境的一致性。
alternatives和直接修改JAVA_HOME有什么根本区别?
解答: 它们的根本区别在于作用范围、实现机制和动态性。alternatives是系统级的工具,它通过管理/usr/bin/下的符号链接来影响所有用户和会话,切换是即时生效的,无需重新加载环境变量,而JAVA_HOME是一个环境变量,其作用范围取决于它被定义的位置:定义在/etc/profile中影响所有用户,定义在~/.bashrc中则只影响当前用户,修改JAVA_HOME后,必须通过source命令或重新登录才能使其在当前会话中生效。alternatives管理的是“命令”的默认指向,而JAVA_HOME是提供一个“路径”供脚本和程序引用,对于设置系统默认的java命令,alternatives更直接、更规范。