直接用 update-alternatives 管理 jdk 是最稳妥方式,因其可独立注册并同步 java 与 javac 命令,避免版本错配;而仅用 ln -s 无法联动 java_home,导致 maven/gradle 因环境变量未更新而报错。

直接用 update-alternatives 管理 JDK 软链接是最稳妥的方式,手动 ln -s 容易和 java/javac 不同步,且无法联动 JAVA_HOME —— 这是多数人切换后 mvn 或 gradle 仍报错的根本原因。
为什么不能只 ln -s /path/to/jdk8 /usr/lib/jvm/default-java
这种符号链接只解决单一路径指向问题,但 Linux 下 Java 生态依赖两个独立入口:java(运行时)和 javac(编译器)。它们可能来自不同 JDK 版本,导致 Unsupported class file major version 错误。更关键的是:JAVA_HOME 环境变量完全不受该软链影响,构建工具(Maven/Gradle/IDEA 后台)全靠它找 JDK,不是靠 which java。
常见错误现象:
-
java -version显示 JDK 17,但mvn compile报错 “class file version 61.0”(即 JDK 17 编译的 class 被 JDK 8 运行) - 手动改了
/usr/bin/java软链,javac -version却还是旧版本 - 切换后
echo $JAVA_HOME没变,或指向一个根本不存在的路径
必须分开注册 java 和 javac
update-alternatives 不是一个“JDK 切换工具”,而是“命令别名管理器”。它对每个命令单独建表,所以 java 和 javac 必须各自注册、各自配置。
实操要点:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 注册前先验证路径真实存在且可执行:
/usr/lib/jvm/jdk-17.0.14+8/bin/java -version必须输出结果 - 优先级数字(如
170)仅用于默认选中,不影响切换能力;只要注册成功,--config就能选 - 务必使用绝对路径,不能带
~或环境变量(如$JAVA_17_HOME),否则注册失败静默无提示 - 示例命令(JDK 17):
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-17.0.14+8/bin/java 170;同理注册javac,路径换成/bin/javac
切换后 JAVA_HOME 不自动更新怎么办
update-alternatives --config java 只改 /usr/bin/java 的软链,JAVA_HOME 是纯环境变量,系统不会、也不能替你改——这是设计使然,不是 bug。
推荐做法:
- 临时修复(调试用):
export JAVA_HOME=/usr/lib/jvm/jdk-17.0.14+8,再export PATH=$JAVA_HOME/bin:$PATH - 长期方案:在
/etc/profile.d/java.sh中定义函数,例如:jdk17() { export JAVA_HOME=/usr/lib/jvm/jdk-17.0.14+8; export PATH=$JAVA_HOME/bin:$PATH; },然后直接运行jdk17 - 验证是否真正同步:
java -version输出主版本号,必须和echo $JAVA_HOME路径中的版本号一致(如都含17)
alternatives --display java 显示 “no alternatives for java” 怎么办
说明注册失败或路径写错。不要猜,按顺序排查:
- 确认
/usr/bin/java是否已被其他包(如 openjdk-17-jdk)占用了注册记录:ls -l /usr/bin/java看是否已指向/etc/alternatives/java - 检查注册命令里目标路径是否存在:
ls /usr/lib/jvm/jdk-17.0.14+8/bin/java,注意+和_在路径中是合法字符,别手抖删掉 - 确认权限:注册用户需有
sudo权限,且目标 JDK 目录所有者对bin/java有执行权限(chmod +x) - 注册后立即验证:
sudo update-alternatives --display java,若仍为空,说明上一步命令未执行成功(比如少了个空格或路径拼错)
最常被忽略的一点:JDK 解压后目录里必须包含完整的 bin/java 和 bin/javac,有些精简版或错误解压会导致 bin 下只有 java 没有 javac,这时注册 javac 会静默失败,而你根本不知道。










