必须同步注册java和javac,否则版本不一致;通过ls /usr/lib/jvm/确认已安装JDK,用update-alternatives --install手动添加未注册版本,并用--config分别切换两者,再验证java -version与javac -version一致,最后用update-java-home或export同步JAVA_HOME。

能切,但必须同时注册 java 和 javac,否则编译运行会不一致——这是最常踩的坑。
确认已安装的 JDK 路径
先别急着切,得知道系统里到底有哪些 JDK 可用:
- 运行
ls /usr/lib/jvm/,看输出里有没有类似java-8-openjdk-amd64、java-17-openjdk-amd64、java-21-openjdk-amd64的目录 - 如果只看到一个(比如只有
java-17-openjdk-amd64),那update-alternatives --config java就不会列出多个选项——它只管理已注册的路径,不自动发现未安装的版本 - 手动解压安装的 JDK(如 Temurin tar.gz)默认不在
/usr/lib/jvm/下,也不会被自动识别,必须手动注册
手动注册多个 JDK 版本
Ubuntu 24.04 及更新版本默认只给首个安装的 JDK 自动注册;其余版本必须用 update-alternatives --install 显式添加:
- 为 OpenJDK 17 注册:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1171sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac 1171 - 为 OpenJDK 21 注册:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-21-openjdk-amd64/bin/java 1211sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-21-openjdk-amd64/bin/javac 1211 - 优先级数字(如
1171、1211)必须互不相同,且建议按版本逻辑递增;数值越大,自动模式下越优先 -
javac必须和java同步注册,否则java -version显示 JDK 17,而javac -version却报错或返回 JDK 8
交互式切换并验证一致性
注册完成后,分两步切换,不能只切一个:
立即学习“Java免费学习笔记(深入)”;
- 运行
sudo update-alternatives --config java,选目标编号 - 再运行
sudo update-alternatives --config javac,**必须选同一个 JDK 对应的javac路径** - 验证是否真正同步:
java -version和javac -version输出的版本号必须完全一致 - 注意:终端新开后生效;已打开的 shell 不会自动刷新
$PATH或JAVA_HOME,需手动重载或新开终端
JAVA_HOME 不会自动更新
update-alternatives 只改命令软链接,不碰环境变量。很多工具(Maven、Gradle、IDE)依赖 JAVA_HOME,它仍可能指向旧版本:
- 不要硬编码路径到
/etc/environment;推荐用update-java-home(Ubuntu 提供)自动同步:sudo update-java-home -s java - 若该命令不存在(如某些 minimal 安装),可临时设置:
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:/jre/bin/java::;s:/bin/java::") - 更稳妥的做法是:在项目级用
.env或 IDE 设置覆盖JAVA_HOME,避免全局污染
真正麻烦的不是切换动作本身,而是 java 和 javac 不同步、JAVA_HOME 滞后、以及手动解压 JDK 没注册进 alternatives——这三点漏掉任一,都会导致构建失败或运行时异常,但错误信息往往不直接指向根源。


















