update-alternatives 通过软链接统一调度不同版本 Java 命令,核心是接管 /usr/bin/java 等入口指向,实现 java 与 javac 版本自动对齐;需先确认 JDK 路径并注册各命令(优先级一致),再用 --config 或 --set 切换,最后可选配 /usr/lib/jvm/current 软链接使 JAVA_HOME 自动同步。

Linux 系统中用 update-alternatives 管理多个 JDK,核心是让系统通过软链接统一调度不同版本的 Java 命令,而不是靠反复改 JAVA_HOME 或 PATH。它不直接操作环境变量,而是接管 /usr/bin/java 这类入口命令的指向,切换一次,java、javac 等命令就自动对齐到同一版本——这才是真正“一站式”切换的关键。
确认 JDK 安装路径并检查当前状态
先确保各 JDK 已解压到位(例如:/usr/lib/jvm/jdk-8u351、/usr/lib/jvm/jdk-17.0.2),且每个目录下都有 bin/java 和 bin/javac。然后运行:
-
update-alternatives --list java—— 若提示“无替代项”,说明尚未注册; -
which java和ls -l /usr/bin/java—— 查看当前软链接链路,确认是否已由 alternatives 管理; -
ls /usr/lib/jvm/—— 快速核对已安装的 JDK 目录名,避免路径写错。
为 java 和 javac 分别注册替代项
每个命令需单独注册,但建议保持版本对应、优先级一致。例如注册 JDK 8 和 JDK 17:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-8u351/bin/java 80sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk-8u351/bin/javac 80sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-17.0.2/bin/java 170sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk-17.0.2/bin/javac 170
注意:数字是优先级,值越大默认选中概率越高;java 和 javac 的优先级最好设成相同数值,防止命令版本错配。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
交互式切换或一键指定版本
注册完成后,执行以下任一方式即可生效:
-
sudo update-alternatives --config java→ 终端列出选项,输入编号选择; -
sudo update-alternatives --config javac→ 同步切换编译器(推荐两命令都执行,确保一致); - 若想跳过交互、直接设为 JDK 8:
sudo update-alternatives --set java /usr/lib/jvm/jdk-8u351/bin/java(同理设javac)。
JAVA_HOME 不再需要手动维护(可选但推荐)
update-alternatives 本身不设置 JAVA_HOME,但你可以借助软链接让它自动跟随:
- 创建统一入口目录:
sudo mkdir -p /usr/lib/jvm/current; - 让
JAVA_HOME指向它:export JAVA_HOME=/usr/lib/jvm/current(加到/etc/profile.d/java.sh); - 每次切换 JDK 后,运行:
sudo rm -f /usr/lib/jvm/current && sudo ln -s /usr/lib/jvm/jdk-17.0.2 /usr/lib/jvm/current(路径按实际选)。
这样 IDE、Maven 或 Spring Boot 就能通过 JAVA_HOME 正确识别运行时环境,无需额外配置。

















