Linux update-alternatives命令

目录

  • [一. 简介](#一. 简介)
  • [二. 使用](#二. 使用)
    • [2.1 添加候选项](#2.1 添加候选项)
    • [2.2 查看](#2.2 查看)
      • [2.2.1 查看当前所有的可切换的版本](#2.2.1 查看当前所有的可切换的版本)
      • [2.2.2 查看所有`alternatives`](#2.2.2 查看所有alternatives)
    • [2.3 版本切换](#2.3 版本切换)
      • [2.3.1 手动指定默认版本](#2.3.1 手动指定默认版本)
      • [2.3.2 自动切换版本](#2.3.2 自动切换版本)
    • [2.4 删除](#2.4 删除)
      • [2.4.1 删除指定的`alternative`](#2.4.1 删除指定的alternative)
      • [2.4.2 完全删除整个`alternative`](#2.4.2 完全删除整个alternative)
    • [2.5 `Master/Slave`的主从机制](#2.5 Master/Slave的主从机制)

一. 简介

update-alternatives 是 Debian、Ubuntu 及其衍生发行版提供的一个系统管理工具,用于管理同一功能的多个可执行程序或文件。

它的核心思想可以概括为一句话:让多个实现共享一个统一的入口,并且可以随时切换默认实现。

  • DebianUbuntu 系发行版使用的是:update-alternatives
  • Red Hat(RHEL)使用的是:alternatives

假设系统中安装了多个版本的JDK:

※本文只是用JDK来举例子,若有多个不同版本的其他程序也可适用

bash 复制代码
/opt/jdk/jdk21/bin/java
/opt/jdk/jdk25/bin/java

如果需要修改PATH环境变量的话,每次都需要

bash 复制代码
# 如果想使用jdk21的话
export PATH=/opt/jdk/jdk21/bin:$PATH
# 如果想使用jdk25的话
export PATH=/opt/jdk/jdk25/bin:$PATH

有了 alternatives 以后,可以通过update-alternatives来控制java命令所对应的JDK版本。

bash 复制代码
java
 │
 ▼
/usr/bin/java
 │
 ▼
/etc/alternatives/java
 │
 ├────────► /opt/jdk/jdk21/bin/java
 │
 └────────► /opt/jdk/jdk25/bin/java

👍推荐使用 update-alternatives 的场景:

  • 系统中安装了多个版本的 Java、GCC 等,希望统一管理。
  • 希望通过一个命令切换默认版本,而不是频繁修改 PATH。
  • 需要保证一组相关工具(如 java、javac、jar)始终来自同一个版本。

🙄不太适合的场景:

  • 仅为当前用户临时切换版本(直接修改 JAVA_HOME 或 PATH 更方便)。
  • 项目需要固定使用某个 JDK(通常由项目脚本、IDE 或构建工具指定,而不是依赖系统默认版本)。

对于服务器管理员来说,update-alternatives 是一种标准、稳定的系统级管理方式;

对于 Java 开发者来说,JAVA_HOMEPATH 更常用于项目开发,两者并不冲突,而是分别解决不同层面的问题。


二. 使用

  • 例如当前系统安装了2个JDK
bash 复制代码
apluser@ubuntu22-1:~$ find /opt/jdk/ -name "java"
/opt/jdk/jdk25/bin/java
/opt/jdk/jdk21/bin/java
apluser@ubuntu22-1:~$

2.1 添加候选项

  • 最后一个参数90100表示优先级,数字越大优先级越高,自动模式下就会优先使用
  • 不能把bin文件夹给添加进去,只能添加bin目录下的一个个程序
bash 复制代码
sudo update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk21/bin/javac 90
sudo update-alternatives --install /usr/bin/java java /opt/jdk/jdk21/bin/java 90

sudo update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk25/bin/javac 100
sudo update-alternatives --install /usr/bin/java java /opt/jdk/jdk25/bin/java 100
bash 复制代码
apluser@ubuntu22-1:~$ which java
/usr/bin/java
apluser@ubuntu22-1:~$
apluser@ubuntu22-1:~$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Jul 26 20:49 /usr/bin/java -> /etc/alternatives/java
apluser@ubuntu22-1:~$
apluser@ubuntu22-1:~$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 23 Jul 26 20:49 /etc/alternatives/java -> /opt/jdk/jdk25/bin/java

2.2 查看

2.2.1 查看当前所有的可切换的版本

bash 复制代码
apluser@ubuntu22-1:~$ update-alternatives --display java
java - auto mode
  link best version is /opt/jdk/jdk25/bin/java
  link currently points to /opt/jdk/jdk25/bin/java
  link java is /usr/bin/java
/opt/jdk/jdk21/bin/java - priority 90
/opt/jdk/jdk25/bin/java - priority 100

2.2.2 查看所有alternatives

bash 复制代码
apluser@ubuntu22-1:~$ update-alternatives --get-selections | head
arptables                      auto     /usr/sbin/arptables-nft
awk                            auto     /usr/bin/gawk
builtins.7.gz                  auto     /usr/share/man/man7/bash-builtins.7.gz
ebtables                       auto     /usr/sbin/ebtables-nft
editor                         auto     /bin/nano
ex                             auto     /usr/bin/vim.basic
ftp                            auto     /usr/bin/tnftp
infobrowser                    auto     /usr/bin/info
ip6tables                      auto     /usr/sbin/ip6tables-nft
iptables                       auto     /usr/sbin/iptables-nft
apluser@ubuntu22-1:~$

2.3 版本切换

2.3.1 手动指定默认版本

bash 复制代码
apluser@ubuntu22-1:~$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                     Priority   Status
------------------------------------------------------------
* 0            /opt/jdk/jdk25/bin/java   100       auto mode
  1            /opt/jdk/jdk21/bin/java   90        manual mode
  2            /opt/jdk/jdk25/bin/java   100       manual mode

Press <enter> to keep the current choice[*], or type selection number:

2.3.2 自动切换版本

  • 会自动选择 priority 最大的那个
bash 复制代码
apluser@ubuntu22-1:~$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 23 Jul 26 20:38 /etc/alternatives/java -> /opt/jdk/jdk21/bin/java
apluser@ubuntu22-1:~$
apluser@ubuntu22-1:~$ sudo update-alternatives --auto java
update-alternatives: using /opt/jdk/jdk25/bin/java to provide /usr/bin/java (java) in auto mode
apluser@ubuntu22-1:~$
apluser@ubuntu22-1:~$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 23 Jul 26 20:38 /etc/alternatives/java -> /opt/jdk/jdk25/bin/java

2.4 删除

2.4.1 删除指定的alternative

bash 复制代码
sudo update-alternatives --remove java /opt/jdk/jdk21/bin/java
sudo update-alternatives --remove javac /opt/jdk/jdk21/bin/javac

sudo update-alternatives --remove java /opt/jdk/jdk25/bin/java
sudo update-alternatives --remove javac /opt/jdk/jdk25/bin/javac

2.4.2 完全删除整个alternative

bash 复制代码
sudo update-alternatives --remove-all java
sudo update-alternatives --remove-all javac

2.5 Master/Slave的主从机制

🔷JDK不只有java,还有javac,jar,jshell等,如果版本切换时一个个切换,容易版本不一致。

可以建立:

bash 复制代码
Master
↓
java

同时:

bash 复制代码
Slave
↓
javac
jar
jshell
javadoc

这样切换java命令版本的时候,其他命令的版本也会一同切换。

  • 设置主从命令
bash 复制代码
sudo update-alternatives --install \
    /usr/bin/java java /opt/jdk/jdk25/bin/java 100 \
    --slave /usr/bin/javac javac /opt/jdk/jdk25/bin/javac \
    --slave /usr/bin/jar jar /opt/jdk/jdk25/bin/jar \
    --slave /usr/bin/jshell jshell /opt/jdk/jdk25/bin/jshell

sudo update-alternatives --install \
    /usr/bin/java java /opt/jdk/jdk21/bin/java 90 \
    --slave /usr/bin/javac javac /opt/jdk/jdk21/bin/javac \
    --slave /usr/bin/jar jar /opt/jdk/jdk21/bin/jar \
    --slave /usr/bin/jshell jshell /opt/jdk/jdk21/bin/jshell 
  • 效果展示
相关推荐
Johny_Zhao4 小时前
网络安全等级保护测评实施方案
linux·网络·人工智能·网络安全·信息安全·云计算·等保测评·系统运维·itsm
落羽的落羽4 小时前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法
刚入门的大一新生4 小时前
Linux-进程控制
linux·运维·服务器·c++
上火的金鱼妹4 小时前
K8S基础组件作用和关系整理
linux·运维·服务器·kubernetes
Vcaker5 小时前
Linux学习25-harbor私有仓库部署
linux·运维·学习
刃神太酷啦5 小时前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap
编程的一拳超人5 小时前
DeepSeek Harness Linux/macOS/Windows 本地下载、启动与模型配置指南
linux·windows·macos·deepseek
时凌云.5 小时前
【2026最新】JDK 下载安装与环境配置全教程(Windows/Mac/Linux 三平台,零基础友好)
java·linux·macos
不懂的浪漫6 小时前
ToDesk 连接 Linux 后分辨率过低的解决方法
linux·运维·数据库
广州灵眸科技有限公司7 小时前
从手动三步到上电即连:4G模组systemd开机自连方案
linux·运维·服务器·开发语言·网络·人工智能·php