首页/系统/Linux 运维命令速查/alternatives 多版本切换(java 等)

alternatives 多版本切换(java 等)

同一命令多版本共存(java、python、editor):alternatives/update-alternatives 维护符号链接优先级,切换全局默认版本。

Linux 运维命令速查系统更新于 2026-10-13

多版本切换是什么

alternatives(RHEL 系)与 update-alternatives(Debian 系)解决同一个问题:让一个通用命令名对应多个版本的实现。它维护两级符号链接——/usr/bin/java 指向 /etc/alternatives/java,再由后者指向真实文件(如 /opt/jdk17/bin/java),同时记录候选清单与优先级。切换默认版本只需改中间链接,所有依赖通用命令名的程序自动跟随。

基本信息

适用平台RHEL 系命令名 alternatives(chkconfig 包);Debian 系为 update-alternatives(dpkg 包)
命令语法alternatives --config <名称> / update-alternatives --config <名称>
优先级--install 的最后一个数字,越大越优先;自动模式下选最大者
两种模式自动模式按优先级决定;--config 手工选择后进入手动模式,自动切换停止
链接结构/usr/bin/通用名 指向 /etc/alternatives/通用名,再指向真实程序

典型使用场景

  • 同机多 JDK:应用要 Java 8、新服务要 Java 17,按需切换默认 java
  • 多版本 Python 或 gcc:开发与编译环境要求不同
  • 编辑器替换:把默认 editor 从 vi 换成 vim 或 nano
  • 集群统一:批量把节点上的默认运行时对齐到同一版本
  • 回滚:切换出问题时用 --config 或 --set 快速退回旧版本

RHEL 系用法

RHEL 系用法
alternatives --display java                       # 看候选、优先级与当前模式
alternatives --config java                        # 交互选择版本
alternatives --install /usr/bin/java java /opt/jdk17/bin/java 1700   # 注册新候选
alternatives --set java /opt/jdk17/bin/java       # 非交互指定,适合脚本
java -version                                     # 验证实际生效版本

Debian 系用法

Debian 系用法
update-alternatives --display java
update-alternatives --config java
update-alternatives --install /usr/bin/java java /opt/jdk17/bin/java 1700
update-alternatives --set java /opt/jdk17/bin/java
update-alternatives --list java                   # 列出全部候选路径

常用操作与状态读法

操作作用注意
--config交互式选择候选进入手动模式,自动切换停止
--display显示候选、优先级与当前链接排查「切了没变」的第一条命令
--install注册新的候选路径优先级要与版本新旧一致,避免误判
--set非交互指定候选适合放到部署脚本里
--auto恢复自动模式恢复后按优先级重新决定
--remove删除某个候选注册的路径被删前先移除,避免悬空
理解两级链接就不容易迷路:/usr/bin/java 是「通用名」,/etc/alternatives/java 是「记录当前选择的中间层」,真实程序在最后一跳。ls -l 顺着这两跳看,就能确认到底在跑哪个版本。
优先级数字只是自动模式下的排序依据,相同优先级时选择结果不确定,所以注册时给每个候选一个明确且不重复的数字;一旦用 --config 手工选过,模式就变为手动,之后新装更高优先级的版本也不会自动生效。
排查「版本不对」的三步:which java 看命令实际解析到的路径,ls -l 顺着 /usr/bin 与 /etc/alternatives 两级链接看最终目标,java -version 确认运行时版本。三者对不上时问题就在候选清单或手动模式上,而不是应用的配置。

易错点

  • 装了新 JDK 但 java -version 没变:新路径未注册进 alternatives,或优先级低于旧候选,用 --display 核对
  • 手工改 /usr/bin/java 软链会被包管理器与 alternatives 覆盖,要改就改中间层或走官方命令
  • 用 --config 手工选过后就进入手动模式,之后升级或新装版本不会自动切换,容易在几个月后造成版本困惑
  • 多个候选注册了相同优先级时结果不确定,注册时务必给唯一数字
  • 升级 JDK 后旧路径被删除但候选未清理,display 里会出现悬空项,切换时报错

数据来源与参考

  • man 8 alternatives(RHEL)
  • man 1 update-alternatives(Debian)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌