必须同步注册java和javac到update-alternatives,否则两者版本必然脱节;需为二者分别执行--install并设相同优先级,再分别--config切换,最后用update-java-home或手动修正java_home确保一致。

必须同步注册 java 和 javac 到 update-alternatives,否则两者版本必然脱节——这是 Ubuntu/Debian 系统上最常被忽略的根源问题。
为什么 java -version 和 javac -version 总是不一致
因为系统把 java 和 javac 当作两个独立命令管理。默认只注册了 java(比如 apt 安装时自动完成),而 javac 往往还指向旧 JDK 的 bin 目录,或根本没注册。运行时走 java 路径,编译时却用另一个 JDK 的 javac,结果就是编译通过、运行报 UnsupportedClassVersionError。
验证方法:
- 运行
which java和which javac,看路径是否同属一个 JDK 根目录 - 运行
readlink -f $(which java)和readlink -f $(which javac),比对真实路径
用 update-alternatives --install 同步注册 java 和 javac
每装一个 JDK,都要为 java 和 javac 各执行一次 update-alternatives --install,且优先级数字必须相同。
例如注册 OpenJDK 17:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1171 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac 1171
关键点:
-
/usr/bin/java和/usr/bin/javac是软链接目标位置,不能写错 - 路径中的
bin/java和bin/javac必须来自同一 JDK 安装目录 - 优先级数字(如
1171)要唯一且可排序,建议用 “主版本号+两位序号”,如 JDK 8 用1081,JDK 21 用1211
切换时必须分别执行 --config
update-alternatives --config java 只改 java,--config javac 才改 javac。不能只调一次就以为全切好了。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
正确流程:
- 运行
sudo update-alternatives --config java,选目标版本编号 - 再运行
sudo update-alternatives --config javac,选**完全相同的编号**(对应同一 JDK) - 最后验证:
java -version和javac -version输出应完全一致
漏掉第二步,或者两个命令选了不同编号,就会回到版本不一致的老问题。
JAVA_HOME 不会自动更新,必须手动补救
update-alternatives 只管命令软链,不管环境变量。JAVA_HOME 仍可能指向旧值,导致 Maven、Gradle 或 IDE 编译行为异常。
Ubuntu 24.04 提供了 update-java-home 脚本(需安装 java-common 包),运行它可自动根据当前 java 软链推导并重写 JAVA_HOME:
sudo update-java-home
若该脚本不存在,就手动执行:
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
然后把这行加进 ~/.bashrc 或 ~/.zshrc,再 source 加载——否则新开终端又失效。
真正麻烦的不是切换动作本身,而是切换后没人检查 JAVA_HOME 是否同步,以及是否忘了 javac 这个“隐形另一半”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










