CentOS/RHEL系统使用yum安装与管理多版本OpenJDK全攻略 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_64Java 11:/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64Java 17:/usr/lib/jvm/java-17-openjdk-17.0.11.0.9-2.el7_9.x86_644.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 jdk8export JAVA_HOME$JAVA_8_HOME export PATH$JAVA_HOME/bin:$PATH echo Switched to JDK 8 java -version alias jdk11export JAVA_HOME$JAVA_11_HOME export PATH$JAVA_HOME/bin:$PATH echo Switched to JDK 11 java -version alias jdk17export 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/binalternatives的链接所在目录。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命令就能让你更专注于真正重要的业务代码。