1. 项目概述:为什么选择 yum 安装 JDK?
在红帽系列的 Linux 系统(比如 CentOS、RHEL、Fedora)上装 Java JDK,这事儿听起来简单,但新手和老手踩的坑可能完全不一样。网上教程一大堆,有的让你去官网下载 tar.gz 包手动解压配置环境变量,有的则推荐用包管理器。今天咱们就专门聊聊用yum(或者它的下一代工具dnf)来安装 JDK 这件事。我之所以花时间写这个,是因为我发现很多朋友,尤其是刚接触运维或者后端开发的朋友,在面对“装个 Java 环境”这种基础任务时,容易陷入两个极端:要么觉得太简单不屑一顾,结果被各种路径、版本、依赖问题搞得焦头烂额;要么跟着一些过时或不够详细的教程,一步错步步错。
用yum安装的核心优势就四个字:省心省力。它帮你自动处理了依赖关系、文件路径、服务注册等一系列琐事。你不需要关心 JDK 被安装到了/usr/lib/jvm还是别的什么目录,也不需要手动去写JAVA_HOME和PATH(大部分情况下)。对于在服务器上快速部署标准化环境,或者在自己学习用的虚拟机上快速搭起一个开发基础,这几乎是最高效的方式。当然,它也有“缺点”:你可能无法第一时间用上 Oracle 官方的最新版,仓库里的版本更新会稍有延迟。但对于绝大多数企业应用和开源项目来说,OpenJDK 的稳定版本已经完全足够,甚至因为其开源特性,在容器化、云原生场景下更受欢迎。
所以,这篇图文教程的目标很明确:带你走一遍在 CentOS 7/8 或 RHEL 系统上,通过配置 yum 源,用命令行快速、正确安装 Java JDK 的全过程。我会把每个步骤背后的“为什么”讲清楚,并分享一些只有实际部署过很多次才会知道的细节和避坑点。无论你是需要在十台新服务器上批量配置 Java 环境,还是只是想在自己的虚拟机上跑通第一个 Spring Boot 应用,这篇内容都能给你一个清晰、可靠的参考。
2. 核心思路与准备工作:理解 yum 仓库与 JDK 发行版
在动手敲命令之前,花几分钟理解一下我们即将操作的对象,能避免后面 90% 的困惑。用yum安装软件,本质是从一个或多个配置好的软件仓库(Repository)里下载预编译好的 RPM 包及其依赖,然后进行安装。因此,整个过程的核心就两点:1. 确保你有可用的、速度快的 yum 源;2. 清楚你要安装的 JDK 具体是哪个发行版和版本。
2.1 选择合适的 JDK 发行版
当你执行yum search java或yum list available *jdk*时,可能会看到很多包,主要分为两大类:
OpenJDK: 这是 Java 平台标准版(Java SE)的开源参考实现。自从 Oracle 调整了 JDK 的发布和许可策略后,OpenJDK 成为了社区和大多数 Linux 发行版的首选。在红帽系的 yum 仓库中,它通常以
java-1.8.0-openjdk、java-11-openjdk、java-17-openjdk这样的包名提供。它完全免费,功能齐全,是生产环境的绝对主流选择。Oracle JDK: 这是 Oracle 公司提供的商业实现。历史上,红帽的仓库曾包含
java-1.8.0-oracle这样的包,但由于 Oracle 的许可协议变更,在新版的系统仓库中通常已不再直接提供。如果你有特殊的商业许可需求,必须使用 Oracle JDK,通常需要手动从 Oracle 官网下载 RPM 包安装,或者配置 Oracle 自己的 yum 仓库(过程更复杂)。本教程将聚焦于 OpenJDK。
注意: 对于学习和绝大多数开发、生产环境,强烈建议使用 OpenJDK。它的性能、功能与 Oracle JDK 在相同版本下几乎无差异,且没有潜在的许可风险。很多所谓的“找不到类”或“不兼容”问题,根源是版本号不对应,而非发行版不同。
2.2 检查与配置 yum 源
系统的 yum 源配置文件位于/etc/yum.repos.d/目录下,后缀为.repo。一个干净的 Minimal 安装的系统,通常已经配置了官方的 Base、Updates 等仓库,但可能位于国外的镜像站,下载速度很慢。
第一步,总是先检查现有仓库和系统版本:
# 查看系统版本,确认是 CentOS 7 还是 8,或者是 RHEL cat /etc/redhat-release # 查看当前已启用的 yum 仓库列表 yum repolist enabled如果列表中的仓库 URL 是mirror.centos.org或download.fedoraproject.org等,且你在国内,那么替换为国内镜像源(如阿里云、腾讯云、华为云)会极大提升安装速度。
第二步,备份并更换镜像源(以 CentOS 7 更换为阿里云源为例):
# 1. 备份原有的 repo 文件 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 2. 下载阿里云的 repo 文件 # 对于 CentOS 7 sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 3. 清理旧缓存并生成新缓存 sudo yum clean all sudo yum makecache实操心得:
yum makecache这一步非常重要。它会把仓库的元数据(有哪些包、版本、依赖关系)下载到本地。如果跳过这一步,你可能会发现搜索不到最新的软件包,或者安装时提示“没有可用包”。这也是很多人在换源后觉得“没生效”的主要原因。
第三步,可选安装 EPEL 仓库:EPEL (Extra Packages for Enterprise Linux) 仓库提供了许多额外的、高质量的软件包。虽然安装 OpenJDK 不一定需要,但作为一个好习惯,建议安装它,以备不时之需。
# CentOS 7 sudo yum install -y epel-release # CentOS 8 或 RHEL 8 以上,EPEL 配置方式略有不同,可能需要先安装 `dnf-plugins-core`,再用 `dnf config-manager` 启用 codeready 仓库等,这里不展开。完成以上准备,你的软件安装环境就基本就绪了。接下来就是寻找并安装具体的 JDK 包。
3. 搜索、选择与安装 JDK
有了健康的 yum 源,安装过程就变得非常直观。我们以安装目前仍广泛使用的 Java 8 (OpenJDK 1.8) 和较新的 Java 11 为例。
3.1 搜索可用的 JDK 包
首先,让我们看看仓库里到底有什么:
# 搜索包含 ‘jdk’ 关键字的包,会列出很多,包括开发包和运行环境 yum search jdk # 更精确地搜索 OpenJDK 相关的开发包 yum search openjdk # 或者直接列出所有可用的 java 开头的包,这个列表更清晰 yum list available java*jdk*执行yum list available java*jdk*后,你可能会看到类似下面的输出:
Available Packages java-1.8.0-openjdk.x86_64 1:1.8.0.412.b08-2.el7_9 updates java-1.8.0-openjdk-devel.x86_64 1:1.8.0.412.b08-2.el7_9 updates java-11-openjdk.x86_64 1:11.0.23.0.9-2.el7_9 updates java-11-openjdk-devel.x86_64 1:11.0.23.0.9-2.el7_9 updates java-17-openjdk.x86_64 1:17.0.11.0.9-2.el7_9 updates java-17-openjdk-devel.x86_64 1:17.0.11.0.9-2.el7_9 updates这里解释一下关键列:
- 第一列 (包名):
java-1.8.0-openjdk是 Java 运行时环境(JRE),只能用来运行 Java 程序。java-1.8.0-openjdk-devel才是 JDK(开发工具包),包含了编译器 (javac)、调试器等开发工具。如果你要做开发,必须安装-devel包。 - 第二列 (版本号): 格式为
epoch:version-release。例如1:1.8.0.412.b08-2.el7_9。 - 第三列 (仓库名): 标明这个包来自哪个仓库,如
updates。
3.2 安装选定的 JDK 包
假设我们决定安装 Java 11 的 JDK 进行开发。安装命令非常简单:
# 安装 Java 11 的 JDK(包含 JRE 和开发工具) sudo yum install -y java-11-openjdk-devel-y参数表示自动确认安装,避免中途需要手动输入y。
安装过程会打印出将要安装的包及其依赖,并显示下载和安装进度。安装完成后,你可以通过以下命令验证:
# 检查 java 编译器版本 javac -version # 检查 java 运行时版本 java -version如果安装的是java-11-openjdk-devel,那么javac -version应该输出类似javac 11.0.23的信息。
3.3 一个关键操作:理解“替代版本”系统
红帽系列系统使用alternatives工具来管理同一个命令的多个版本。当你安装了多个 JDK(比如同时装了 Java 8 和 Java 11)时,系统需要知道默认的java和javac命令指向哪一个。
安装-devel包时,alternatives链接通常会自动配置好。但了解如何手动管理和切换是非常有用的技能。
# 查看 java 命令的所有可选版本 sudo alternatives --config java # 查看 javac 命令的所有可选版本 sudo alternatives --config javac执行命令后,会列出所有已安装的 Java 版本,并提示你输入编号来选择默认版本。这在需要为不同项目切换 Java 版本时非常方便。
注意事项: 有些教程会教你手动修改
/etc/profile或~/.bashrc来设置JAVA_HOME。在使用yum安装 OpenJDK 的情况下,绝大多数时候你不需要也不应该手动设置JAVA_HOME。因为alternatives系统已经为你管理好了符号链接。许多自动化工具(如$JAVA_HOME环境变量)能够自动识别由alternatives管理的 Java 安装。手动设置如果路径不正确,反而会导致混乱。你可以通过readlink -f $(which java)来查看当前java命令实际指向的路径,这个路径的上一层目录(去掉/bin/java)通常就可以作为JAVA_HOME的值。
4. 多版本 JDK 共存与管理实战
在实际工作中,一台服务器或开发机上需要多个 JDK 版本的情况非常普遍。例如,老项目基于 Java 8,新项目使用 Java 17。用yum可以非常优雅地实现这一点。
4.1 安装多个版本
这很简单,直接安装你需要的所有-devel包即可:
sudo yum install -y java-1.8.0-openjdk-devel java-11-openjdk-devel java-17-openjdk-develyum 会处理好所有依赖,它们会和平共处,安装在不同的系统路径下,例如:
- Java 8:
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-2.el7_9.x86_64 - Java 11:
/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 - Java 17:
/usr/lib/jvm/java-17-openjdk-17.0.11.0.9-2.el7_9.x86_64
4.2 使用 alternatives 进行系统级切换
如前所述,使用sudo alternatives --config java可以交互式地切换整个系统默认的 Java 版本。这对于服务器环境确定一个统一的运行时版本很有用。
4.3 更灵活的 Shell 会话级切换
对于开发者,更常见的需求是在不同的终端会话或项目中临时使用不同版本的 JDK。手动修改alternatives会影响全局,不太方便。这里推荐一个简单的小技巧:在用户的 Shell 配置文件中创建别名或函数。
编辑你的~/.bashrc或~/.zshrc文件,添加如下内容:
# 在 ~/.bashrc 中添加 export JAVA_8_HOME=$(dirname $(dirname $(readlink -f $(which java)))) # 先获取当前默认路径,仅作示例,实际需要写死路径 # 更可靠的方式是直接写死路径(根据你的实际安装路径调整) export JAVA_8_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-2.el7_9.x86_64 export JAVA_11_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 export JAVA_17_HOME=/usr/lib/jvm/java-17-openjdk-17.0.11.0.9-2.el7_9.x86_64 # 设置默认版本(可选) export JAVA_HOME=$JAVA_11_HOME export PATH=$JAVA_HOME/bin:$PATH # 创建快速切换的命令别名 alias jdk8='export JAVA_HOME=$JAVA_8_HOME && export PATH=$JAVA_HOME/bin:$PATH && echo "Switched to JDK 8" && java -version' alias jdk11='export JAVA_HOME=$JAVA_11_HOME && export PATH=$JAVA_HOME/bin:$PATH && echo "Switched to JDK 11" && java -version' alias jdk17='export JAVA_HOME=$JAVA_17_HOME && export PATH=$JAVA_HOME/bin:$PATH && echo "Switched to JDK 17" && java -version'保存后,执行source ~/.bashrc。之后,在终端里直接输入jdk11,就会将当前 shell 会话的 Java 版本切换到 11,而不会影响其他终端或系统服务。
4.4 验证多版本安装
你可以打开两个终端窗口,分别执行jdk8和jdk11,然后用java -version验证,它们会显示不同的版本信息。这种方法完美解决了项目间版本隔离的需求。
5. 深入排查:安装后常见问题与解决方案
即使按照教程一步步来,也可能遇到一些“意外”。这里我汇总了几个最常见的问题及其排查思路。
5.1 问题:执行java -version提示 “command not found”
可能原因与解决:
- 安装的只是 JRE,不是 JDK:你只安装了
java-xx-openjdk而没有安装-devel包。-devel包会依赖 JRE 包,所以安装-devel是最稳妥的。解决方案:sudo yum install -y java-11-openjdk-devel。 - alternatives 未正确配置:极少数情况下,
alternatives的链接可能损坏或未创建。可以尝试手动重建:# 假设 Java 11 安装在了 /usr/lib/jvm/java-11-openjdk-11.x.x.x sudo alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-11.x.x.x/bin/java 2000 sudo alternatives --config java # 然后选择正确的编号 - PATH 环境变量问题:虽然 yum 安装会处理好,但如果你之前手动修改过 PATH 并覆盖了系统路径,可能导致找不到。检查
echo $PATH,确保包含/usr/bin(alternatives的链接所在目录)。
5.2 问题:javac命令找不到,但java命令正常
可能原因与解决:这几乎可以确定是只安装了 JRE 运行时包,没有安装包含开发工具的-devel包。直接安装对应的-devel包即可。
5.3 问题:安装时下载速度极慢,或提示 “Cannot retrieve metalink for repository”
可能原因与解决:这是典型的网络或 yum 源配置问题。
- 确认已更换国内镜像源:检查
/etc/yum.repos.d/下的.repo文件,确认baseurl或mirrorlist指向的是阿里云、腾讯云等国内地址。 - 清理缓存并重试:
sudo yum clean all sudo rm -rf /var/cache/yum/* sudo yum makecache sudo yum install -y java-11-openjdk-devel - 检查网络连通性:尝试
ping mirrors.aliyun.com,或使用curl测试仓库 URL 是否可访问。 - 对于 CentOS 8 或 RHEL 8+:这些版本默认使用
dnf,且仓库配置可能不同。如果系统已停止维护(如 CentOS 8),官方源会失效,必须更换为 vault 源或第三方源,这是一个独立的话题。
5.4 问题:如何彻底卸载某个 JDK 版本?
使用 yum 卸载同样简单,但要注意区分包名。
# 查看已安装的 java 相关包 yum list installed java*jdk* # 卸载特定的 JDK 包(例如 Java 11 的开发包) sudo yum remove -y java-11-openjdk-devel # 卸载后,相关的依赖如果不再被其他包需要,也会被提议移除。你可以使用 `sudo yum autoremove` 来清理。卸载后,记得用sudo alternatives --config java检查一下alternatives的配置,如果被卸载的版本还被列为选项,可以使用sudo alternatives --remove java <path-to-java>来移除无效项。
6. 超越基础:生产环境下的考量与最佳实践
在个人学习环境中,按照上述步骤安装已经足够。但在生产服务器或需要严格一致性的开发环境中,我们还需要考虑更多。
6.1 版本锁定与仓库优先级
在生产环境中,我们通常不希望 Java 版本被意外升级。yum 提供了版本锁定的功能:
# 锁定某个包,防止被更新 sudo yum versionlock add java-11-openjdk-devel # 查看被锁定的包列表 sudo yum versionlock list # 如果需要解除锁定以便更新 sudo yum versionlock delete java-11-openjdk-devel另外,如果你配置了多个仓库(如公司内部仓库和公共仓库),可能需要使用yum-plugin-priorities插件来设置仓库优先级,确保始终从稳定可靠的源安装和更新。
6.2 使用模块化流(CentOS/RHEL 8+)
在 RHEL 8/CentOS Stream 8 及更高版本中,引入了 Application Streams 的概念,软件包以模块化流的形式提供。Java 的安装方式略有变化:
# 查看可用的 Java 模块流 dnf module list java # 通常会看到多个流,如 java:11, java:17 等 # 启用并安装特定的流(例如 Java 11) sudo dnf module enable java:11 sudo dnf install -y java-11-openjdk-devel这种方式能更好地管理不同版本的生命周期和兼容性。
6.3 容器化环境中的安装
在 Dockerfile 中为基于 RHEL 的镜像(如ubi8/ubi8)安装 JDK,原理完全相同,但写法更精简,并需要清理缓存以减小镜像层大小:
FROM registry.access.redhat.com/ubi8/ubi8:latest # 安装 JDK 11 RUN dnf install -y java-11-openjdk-devel && \ dnf clean all && \ rm -rf /var/cache/dnf # 验证安装 CMD ["java", "-version"]6.4 性能与监控小贴士
安装好 JDK 后,除了运行程序,我们还可以利用它自带的一些工具进行初步诊断:
jps: 列出当前用户的所有 Java 进程 ID。jinfo: 查看和调整运行中 JVM 的参数。jstat: 监控 JVM 的类加载、垃圾回收、JIT 编译等统计信息。jstack: 打印出运行中 Java 进程的线程堆栈快照,用于分析死锁或高 CPU 问题。
虽然这些是高级话题,但知道它们的存在,并在需要时能快速通过yum安装的 JDK 来使用它们(它们通常就在$JAVA_HOME/bin下),是运维和开发人员的一项基本功。
回顾整个流程,从配置源、搜索包、安装、验证到多版本管理和问题排查,用yum安装 JDK 是一条清晰、自动化程度高的路径。它可能没有手动下载 tar 包那样“灵活”,但正是这种约束和规范,使得它在服务器管理、环境标准化和团队协作中展现出巨大的优势。下次当你需要配置 Java 环境时,不妨先问问自己:真的需要去官网手动下载吗?也许,一条yum install命令就能让你更专注于真正重要的业务代码。