update-alternatives是Linux下管理OpenJDK与Oracle JDK共存的核心工具,需分别注册java和javac命令,优先级数字仅影响自动模式选值,不强制设为默认;JAVA_HOME须在/etc/profile.d/java.sh中固定配置,不可动态设置,且需配合readlink -f $(which java)验证真实路径。

update-alternatives 是 Linux 下让 OpenJDK 与 Oracle JDK 并存的核心工具,不是靠删一个装另一个,也不是靠改 JAVA_HOME 临时切版本——那只能骗过部分命令,骗不过 javac、IDE 或系统服务。
update-alternatives 必须手动注册两个 JDK
系统自带的 OpenJDK 通常已自动注册进 update-alternatives,但 Oracle JDK 解压后是“裸路径”,不注册就完全不在切换列表里:
- 运行
sudo update-alternatives --install /usr/bin/java java /opt/java/jdk-17.0.x/bin/java 2 - 再运行
sudo update-alternatives --install /usr/bin/javac javac /opt/java/jdk-17.0.x/bin/javac 2 - 注意末尾数字是优先级:
2表示比默认 OpenJDK(通常是1)高,但不强制设为默认——只是让它可选
常见错误:
- 只注册了
java没注册javac→java -version显示 Oracle,javac -version却还是 OpenJDK - 路径写错,比如漏掉
/bin,或指向了jre/bin/java(Oracle JDK tar.gz 包里没有独立 JRE 目录,直接用jdk-xx/bin) - 用
rpm安装的 Oracle JDK(旧版)可能已注册,但新版 tar.gz 必须手动来
JAVA_HOME 不参与 update-alternatives 切换
update-alternatives 只管 /usr/bin/java 这类符号链接,而 JAVA_HOME 是纯环境变量,由你控制:
- 推荐在
/etc/profile.d/java.sh里固定写死一个值,例如export JAVA_HOME=/opt/java/jdk-17.0.x - 不要试图用脚本根据
java -version动态设JAVA_HOME—— 多数 Java 工具(如 Maven、Tomcat 启动脚本)读的是环境变量,不是which java的结果 - 如果你用 IDE(IntelliJ、Eclipse),它们通常忽略系统
JAVA_HOME,而是读自己配置的 SDK 路径,所以得单独配
多版本共存时最易被忽略的点:PATH 顺序和用户级 vs 系统级配置
-
PATH里如果同时有/usr/lib/jvm/java-17-openjdk-amd64/bin和/opt/java/jdk-17.0.x/bin,且前者在前,那即使update-alternatives切到 Oracle,which java仍可能返回 OpenJDK 路径 -
/etc/profile.d/下的脚本对所有用户生效,但如果你在~/.bashrc里又 export 了另一个JAVA_HOME,当前 shell 会以用户级为准,导致终端和 GUI 应用行为不一致 - 验证是否真生效,别只信
java -version,加一条:readlink -f $(which java)→ 它会显示最终指向的二进制文件路径,这才是铁证
真正麻烦的从来不是装两个 JDK,而是让 shell、IDE、systemd 服务、CI 脚本全部看到同一个“当前 JDK”。update-alternatives 解决命令层面的一致性,JAVA_HOME 解决工具链层面的一致性,两者缺一不可,且不能互相替代。


















