确认JDK安装路径应执行ls /usr/lib/jvm/查看可用目录,若缺失java-8/17/21-openjdk-amd64等条目需补装;多版本切换须用update-alternatives --install成对注册java与javac,并手动同步JAVA_HOME指向真实JDK根目录。

确认系统已安装目标JDK路径
执行 ls /usr/lib/jvm/ 查看可用JDK目录,输出中必须包含类似 java-8-openjdk-amd64、java-17-openjdk-amd64 或 java-21-openjdk-amd64 的条目。若缺失,先运行 sudo apt install openjdk-17-jdk(替换为你要的版本)补装。update-alternatives 不会自动发现未安装的版本,也不会处理符号链接路径(如 /usr/lib/jvm/java-17-openjdk-amd64 可能是软链,实际应指向带完整版本号的子目录)。
用 update-alternatives 注册 java 和 javac 两项
OpenJDK 多版本切换依赖 update-alternatives 管理命令别名,但默认只注册首个安装的 JDK。其余版本需手动注册,且 java 和 javac 必须成对注册,否则 javac -version 会报错或与 java -version 不一致。
- 注册 JDK 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 - 优先级数字(如
1171)必须唯一、非零,且建议按版本逻辑递增(JDK 8 → 1081,JDK 17 → 1171,JDK 21 → 1211),避免冲突导致切换失败 - 路径中的
bin/java和bin/javac不能写错:OpenJDK 17/21 的java在bin/下,不是jre/bin/java;JDK 8 则在jre/bin/java,注意区分
交互式切换并验证一致性
运行以下两条命令分别选择目标版本:
sudo update-alternatives --config javasudo update-alternatives --config javac
终端会列出编号菜单,输入对应数字即可切换。切完后必须同时验证:
-
java -version和javac -version输出主版本号要一致(如都是 17) - 若不一致,说明
javac没注册或注册路径错误,重新检查update-alternatives --list java和--list javac输出是否匹配 - 不要跳过
javac切换——Maven 编译、IDE 启动、Gradle 构建都依赖它,仅改java会导致“找不到编译器”类错误
JAVA_HOME 不会自动更新,必须手动同步
update-alternatives 只改命令软链,不碰环境变量。很多工具(Maven、Tomcat、IntelliJ)读取 JAVA_HOME 而非 java 命令路径,所以你得自己设:
编辑 ~/.bashrc 或 ~/.zshrc,添加一行(以 JDK 17 为例):export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
然后执行 source ~/.zshrc 生效。注意:
-
JAVA_HOME必须指向 JDK 根目录(含bin/和lib/),不能是jre/子目录,也不能是/usr/lib/jvm/default-java这类软链 - Ubuntu 24.04 自带的
update-java-home脚本可自动推导,但仅在部分 OpenJDK 包中存在,不可依赖;最稳的方式仍是硬编码真实路径 - IDE 和构建工具不会继承终端的
JAVA_HOME,需单独在设置里指定 JDK 路径,否则看到java -version正确但项目仍报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











