Linux下多java版本共存与切换
1. 切换java版本
使用 update-alternatives 建立主链接:
update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_281/bin/java 200
之后,使用 -- config 参数,系统会列出已安装的 Java 版本,并且你可以根据提示选择要使用的版本:
update-alternatives --config java
然后会显示一个选项列表:
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 auto mode
1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode
2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode
Press <enter> to keep the current choice[*], or type selection number:
后面的数字越大,默认自动模式下越优先。输入要切换到的 Java 版本的编号,然后按下 Enter 键,系统就会切换到你选择的 Java 版本作为默认版本。
2. 建立链接组
我们已经可以为不同版本的 java 二进制文件建立对应的链接,并在需要时手动切换。但是这很麻烦,一般我们不止使用某一个单独的 /java/bin 下的文件,我们更希望可以一次性安装和切换所有的 Java 二进制文件进行编译和运行,这就需要使用 update-alternatives 命令的 --slave(从属)选项。
--slave 选项允许将多个相关联的二进制文件(如 javac, jar, javap 等)绑定到一个主链接(Master Link)上,形成一个链接组 (Link Group)。当切换主链接的版本时,所有从属链接也会自动切换到相应版本的路径。
这行命令就是在设置主链接:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_281/bin/java 200
现在,为每个需要同步切换的二进制文件添加一个或多个 --slave 选项来建立链接组。
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_281/bin/java 200 \
--slave /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_281/bin/javac \
--slave /usr/bin/jar jar /usr/lib/jvm/jdk1.8.0_281/bin/jar \
--slave /usr/bin/javadoc javadoc /usr/lib/jvm/jdk1.8.0_281/bin/javadoc \
--slave /usr/bin/javap javap /usr/lib/jvm/jdk1.8.0_281/bin/javap
# 可以根据需要添加所有其他 Java/JDK 二进制文件,如 jconsole, jdb, keytool 等。
--slave 选项的语法:
--slave <从属链接路径> <从属链接名> <从属实际文件路径>
注意: --slave 选项不需要再次指定优先级,因为它会继承主链接的优先级。
如果安装了多个版本的 Java(例如,另一个是 OpenJDK 17),并且它们都以相同的链接组名(java)通过 --slave 选项安装,那么现在只需配置主链接即可:
sudo update-alternatives --config java
当从列表中选择一个新的 Java 版本时,javac、jar 等所有从属命令将同时切换到该版本。
输入以下命令查询对应链接组:
sudo update-alternatives --display java
查看所有已配置的链接组:
update-alternatives --get-selections
删除链接:
sudo update-alternatives --remove java /usr/lib/jvm/jdk1.8.0_471/bin/java
使用 --remove 移除主链接的一个版本时,所有通过 --slave 选项与该版本关联的从属链接(如 javac, jar 等)也会自动从该链接组中移除。

浙公网安备 33010602011771号