用 update-alternatives 切换 jdk 版本核心三步:先验证 jdk 路径与可执行性(如 /usr/lib/jvm/jdk-17.0.14+8/bin/java -version 必须成功输出),再分别注册 java 和 javac 命令(路径、优先级一一对应),最后通过 --config 切换并手动同步 java_home 确保构建工具一致。

用 update-alternatives 切换 JDK 版本,核心就三步:注册、选择、同步环境变量。它不改配置文件、不重载 shell,但必须把 java 和 javac 分开注册,且 JAVA_HOME 得手动对齐,否则 Maven、Gradle 会悄悄用错版本。
确认 JDK 安装路径和可执行性
别急着注册,先确保每个 JDK 解压完整、权限正常、命令真能跑:
- 检查
bin/java是否存在且可执行:ls -l /usr/lib/jvm/jdk-17.0.14+8/bin/java - 直接运行验证:
/usr/lib/jvm/jdk-17.0.14+8/bin/java -version—— 必须输出版本号,否则注册也没用 - 注意路径细节:Oracle/Adoptium 包含
+或_(如jdk-21.0.4+7),别手误删掉 - RHEL/CentOS 默认 OpenJDK 路径类似
/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-1.el9.x86_64,可用ls /usr/lib/jvm/查看
用 update-alternatives 注册 java 和 javac
update-alternatives 管的是命令软链,java 和 javac 必须分别注册,否则编译时可能“运行用 JDK 21,编译用 JDK 17”,报 Unsupported class file major version 错误:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 注册 JDK 17 的
java:sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-17.0.14+8/bin/java 170 - 注册 JDK 17 的
javac:sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk-17.0.14+8/bin/javac 170 - 注册 JDK 21 的
java:sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-21.0.4+7/bin/java 210 - 注册 JDK 21 的
javac:sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk-21.0.4+7/bin/javac 210 - 优先级数字(如 170/210)只影响默认选中项,不影响能否切换;只要注册成功,
--config就能手动选
交互式切换并验证一致性
注册完后执行切换命令,但要注意:命令行的 java -version 和构建工具依赖的 JAVA_HOME 是两套系统,必须保持一致:
- 切换运行时:
sudo update-alternatives --config java - 切换编译器:
sudo update-alternatives --config javac - 验证命令版本:
java -version和javac -version输出主版本号应相同 - 检查环境变量:
echo $JAVA_HOME—— 若不匹配,Maven/Gradle/IDEA 后台很可能用错 JDK - 临时同步:
export JAVA_HOME=/usr/lib/jvm/jdk-21.0.4+7 - 长期方案:在
/etc/profile.d/java.sh中定义函数,例如:
jdk21() { export JAVA_HOME=/usr/lib/jvm/jdk-21.0.4+7; export PATH=$JAVA_HOME/bin:$PATH; },之后执行jdk21即可
常见问题快速排查
如果 java -version 正确但 mvn compile 报错,大概率是 JAVA_HOME 没同步。其他典型问题包括:
-
update-alternatives: error: no alternatives for java→ 检查是否漏注册,或路径写错(比如少写了/bin/java) - 切换后
which java还指向旧路径 → 执行hash -r清除 shell 命令缓存 - 想一键查看所有已注册 JDK →
update-alternatives --display java或update-alternatives --list java - 卸载某个 JDK 版本 → 先用
update-alternatives --remove java /path/to/old/jdk/bin/java,再删目录










