在 CentOS Stream 上安装指定版本 OpenJDK,需通过 dnf install java--openjdk[(-devel)|(-headless)] 显式指定包名锁定版本,依赖 alternatives 系统管理多版本共存,安装后须执行 sudo alternatives --config java 和 --config javac 同步切换,默认路径为 /usr/lib/jvm/java--openjdk-*。

在 CentOS Stream 上安装指定版本的 OpenJDK,关键不是“能不能装”,而是“装哪个包名、怎么避免覆盖、如何精准绑定版本”。系统自带的 yum 或 dnf 仓库里每个 OpenJDK 版本对应唯一 RPM 包名,直接按名安装即可锁定版本,不需要手动下载解压(除非你要用上游非 LTS 或非仓库版本)。
查清楚可用的 OpenJDK 版本包名
CentOS Stream 的仓库中 OpenJDK 版本有限,且命名严格遵循 java- 模式。运行以下命令查看当前可选版本:
dnf list available 'java-*-openjdk'
常见结果包括:java-11-openjdk、java-17-openjdk、java-21-openjdk(Stream 9+ 支持),但 不会出现 java-8-openjdk 或 java-13-openjdk —— 它们不在官方仓库中。
注意:java-11-openjdk 是最小运行时;如需编译(javac)、调试或源码,得额外装 java-11-openjdk-devel。
- 只运行 Java 应用:装
java-11-openjdk - 开发/构建:必须加装
java-11-openjdk-devel - 不推荐只装
-devel而不装主包——它依赖运行时,但安装顺序错乱可能触发依赖警告
安装指定版本时不要用 “java” 通配名
执行 dnf install java 会拉取默认(通常是最新 LTS)版本,且未来 dnf update 可能悄悄升级它。要锁定版本,必须显式写全包名:
dnf install java-17-openjdk-devel
这样装出来的 JDK 会被自动注册进 alternatives 系统,路径固定在 /usr/lib/jvm/java-17-openjdk-*,不会和已装的 11 或 21 冲突。
常见错误:
- 误执行
dnf install java-17-openjdk-headless后发现没有javac—— 因为-headless不含开发工具 - 装了
java-21-openjdk却仍显示java -version是 11 —— 这是alternatives默认未切换,不是没装上
验证安装路径和 alternatives 注册状态
装完后别急着 java -version,先确认它是否被 alternatives 管理:
alternatives --list | grep java
你会看到类似输出:
/usr/lib/jvm/java-11-openjdk-11.0.22.0.7-1.el9.x86_64/jre/bin/java /usr/lib/jvm/java-17-openjdk-17.0.10.0.7-1.el9.x86_64/bin/java
说明两个版本都已注册。此时用:
sudo alternatives --config java
选择对应编号即可切换全局默认版本。注意:alternatives --config javac 也要同步执行,否则 javac 和 java 可能跨版本混用,引发 IncompatibleClassChangeError 等静默问题。
环境变量 JAVA_HOME 不会自动更新 —— 它仍指向旧值。建议不要依赖全局 JAVA_HOME,而是在脚本或 CI 中显式指定路径,例如:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.10.0.7-1.el9.x86_64
多版本共存但不干扰的关键点
CentOS Stream 的 OpenJDK 多版本共存本身没问题,真正容易出问题的是三个地方:
-
/usr/bin/java是个软链接,实际指向/etc/alternatives/java,而后者又由alternatives动态管理 —— 切换版本必须走alternatives --config,不能直接改软链 - 某些老脚本硬编码
/usr/java/latest或/opt/java,这些路径在 Stream 上根本不存在,会导致找不到 JVM -
dnf update可能升级某个 JDK 小版本(如 17.0.10 → 17.0.11),但不会跨大版本(17 不会变 21),这点比手动解压更可控
如果你需要某项目始终用特定 JDK(比如 Maven 构建强制用 17),最稳的方式不是改系统默认,而是在项目目录下设 .mvn/jvm.config 写入 -Djava.home=/usr/lib/jvm/java-17-openjdk-* —— 这比动全局配置安全得多。











