最稳妥的命令是sudo dnf install -y java-17-openjdk-devel,因devel包含javac等全套开发工具且自动注册alternatives;不带devel则仅有jre,无法编译。

dnf install java-17-openjdk-devel 是最稳妥的命令
Rocky Linux 8+ 默认用 dnf,装 OpenJDK 必须带 devel 后缀,否则只有 java 运行时,没有 javac 编译器——很多构建工具(如 Maven、Gradle)会直接报错找不到编译器。
执行这行命令就能完成安装:sudo dnf install -y java-17-openjdk-devel
- 如果提示“no match for argument”,先检查是否启用了 CRB 仓库:
sudo dnf config-manager --set-enabled crb - 不推荐装
java-17-openjdk(无 devel),它不含javac、javadoc、jar等开发工具 - OpenJDK 21 也可用:
sudo dnf install -y java-21-openjdk-devel,但注意 Jenkins 等部分工具对 21 的支持仍处于适配期
装完后 java -version 不显示预期版本?检查 alternatives
包管理器安装会自动注册到 alternatives 系统,但如果你之前装过其他 JDK(比如手动解压的 Oracle JDK 或旧版 OpenJDK),java -version 可能仍指向旧版本。
运行这个命令查看当前所有注册项:sudo alternatives --config java
- 终端会列出所有已注册的 Java 路径,带星号的是当前默认项
- 输入对应编号回车即可切换,无需改环境变量或符号链接
- 切换后务必再执行一次
java -version和javac -version双重验证
JAVA_HOME 没自动设?别硬写 /usr/lib/jvm/…
虽然 java 命令能用,但像 Tomcat、Maven 或 IDE 仍可能依赖 JAVA_HOME。包管理器安装不会自动写这个变量,但你也不该手动硬编码路径——因为 /usr/lib/jvm/java-17-openjdk-* 后缀随小版本更新会变(比如从 17.0.8 升到 17.0.9)。
更可靠的做法是让 JAVA_HOME 指向 alternatives 管理的逻辑路径:export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
- 这条命令会解析
/usr/bin/java→ 实际二进制 → 上两级目录,得到类似/usr/lib/jvm/java-17-openjdk的稳定路径 - 把它加到
/etc/profile.d/java.sh(全局生效)或~/.bashrc(仅当前用户) - 然后
source /etc/profile.d/java.sh生效,再echo $JAVA_HOME确认
为什么不能只装 java-17-openjdk?看 rpm 依赖差异
用 rpm -q --requires java-17-openjdk 和 rpm -q --requires java-17-openjdk-devel 对比,你会发现前者只依赖 JRE 相关库,后者额外包含:java-17-openjdk-headless、java-17-openjdk-jmods、java-17-openjdk-src 等。
-
jmods是模块化编译必需的,Java 9+ 的jlink工具依赖它 -
src包含源码,IDE 调试、跳转定义时有用 - CI/CD 流水线里如果用到
jdeps、jpackage等工具,也只在devel包里
所以只要你在 Rocky Linux 上做开发或部署服务,devel 是唯一合理选择。











