可直接用 update-alternatives --config java 和 --config javac 切换,但必须确保二者注册路径一致、优先级不重复,且手动注册时需指向同一JDK的bin/java和bin/javac,再同步选择相同编号,最后手动更新JAVA_HOME以保证环境变量与命令一致。

直接用 update-alternatives --config java 和 update-alternatives --config javac 就能切换,但必须确保两者注册路径匹配、优先级不重复,否则运行和编译会用不同 JDK。
确认已安装的 JDK 路径是否被 alternatives 管理
在 CentOS/RHEL/Fedora 上,用 yum 或 dnf 安装的 OpenJDK(如 java-17-openjdk-devel)通常会自动注册 java 和 javac;但手动解压或 RPM 包(如 Liberica、Temurin)往往不会。
检查是否已注册:
- 运行
update-alternatives --list java—— 若报错 “no alternatives”,说明未注册 - 运行
ls /usr/lib/jvm/查看实际目录,常见名如java-17-openjdk-17.0.1.0-10.el9_4.x86_64(RHEL/CentOS 9+)或jdk-17.0.1+12(手动解压) - 注意:RPM 系统中 JDK 主目录常带版本号和构建后缀,
bin/java路径需完整写对,不能只写到/usr/lib/jvm/java-17-openjdk
手动注册 java 和 javac 到 alternatives(关键步骤)
注册时必须同时处理 java 和 javac,且指向同一 JDK 根目录下的对应二进制文件,否则 java -version 和 javac -version 会不一致。
以 RHEL 9 安装的 OpenJDK 17 为例(路径需按 ls /usr/lib/jvm/ 输出实际调整):
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-17.0.1.0-10.el9_4.x86_64/bin/java 1700 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk-17.0.1.0-10.el9_4.x86_64/bin/javac 1700
要点:
- 优先级数字(如
1700)必须唯一,建议按版本逻辑设:JDK 8 用1080,JDK 17 用1700,JDK 21 用2100 - 若注册的是手动解压的 JDK(如 Temurin),路径类似
/usr/lib/jvm/jdk-17.0.1+12/bin/java,注意别漏掉bin/子目录 - 不要注册
jre/bin/java(旧式路径),RHEL 8+ 的 OpenJDK 包已取消独立 JRE 目录,一律用bin/java
执行切换并验证一致性
注册完成后,分别执行两个命令进入交互选择:
sudo update-alternatives --config java sudo update-alternatives --config javac
必须为两者选**同一个编号**(即同一 JDK 实例),否则会出现“运行是 17,编译是 11”这类问题。
验证是否同步生效:
- 运行
java -version和javac -version—— 输出主版本号应完全一致 - 运行
readlink -f $(which java)和readlink -f $(which javac)—— 应指向同一 JDK 的bin/下 - 如果用 Maven 构建项目,还需确认
mvn -v显示的 Java 版本与上述一致(Maven 本身不读 alternatives,但依赖系统java命令)
JAVA_HOME 不会自动更新,得手动配或靠脚本
update-alternatives 只改命令软链接,不碰环境变量。所以 $JAVA_HOME 仍可能是旧值,导致 IDE 或构建工具误判。
解决办法(任选其一):
- 在
/etc/profile.d/java.sh中加一行:export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java)))),然后source /etc/profile.d/java.sh - 或用
alternatives --display java查当前选中路径,手动设JAVA_HOME指向其父目录(如/usr/lib/jvm/java-17-openjdk-17.0.1.0-10.el9_4.x86_64) - 注意:RHEL/CentOS 的
/etc/java/下可能有java.conf,但该文件不被 alternatives 自动读取,别指望它生效
最易忽略的是 JAVA_HOME 和 java/javac 不同步——尤其在 CI/CD 或 systemd 服务里,环境变量继承自系统配置而非当前 shell,这点比桌面终端更敏感。


















