晓夏

YoungCheung

Zhang Sir's technical way

Linux下alternatives管理多版本软件

浏览量:1266

无意之中在系统发现了这个 alternatives 命令,然后百度了下,我靠,这个很实用啊,平时服务环境都需要依赖jdk,那么管理jdk版本就成了一个一个问题,然后打开服务器,先下载了三个不同版本的jdk:

 yum install java-1.8.0-openjdk-devel.x86_64 -y
 yum install java-1.7.0-openjdk-devel.x86_64 -y
 yum install java-1.6.0-openjdk-devel.x86_64 -y

我这连续下载了三个不同版本的jdk,系统到底默认会用哪个呢?看一下

[root@k8s-master local]# java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

我能理解这是我刚才下载的第一个为默认了吗?是的,没错。那么,我想换到1.6的jdk怎么办?接下来我们主角alternatives就出来了?详细命令我们后面再讲,我们先试下效果:

[root@k8s-master local]# alternatives  --config java

There are 4 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1  java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64/jre/bin/java)
   2  java-1.7.0-openjdk.x86_64 (/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.161-2.6.12.0.el7_4.x86_64/jre/bin/java)
   3  /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java

Enter to keep the current selection[+], or type selection number: 3
[root@k8s-master local]# java -version
java version "1.6.0_41"
OpenJDK Runtime Environment (IcedTea6 1.13.13) (rhel-1.13.13.1.el7_3-x86_64)
OpenJDK 64-Bit Server VM (build 23.41-b41, mixed mode)

哎哟,不错,这个是不是挺厉害的,别着急,后面还有更好的。我们上面只是yum了三个版本,如果我想自己指定版本呢?这可就难倒我了,不怕!试一下,先上传个jdk到服务器试试。

 tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
 alternatives --install /usr/bin/java  java  /usr/local/jdk1.8.0_60/bin/java  4

这样就可以了? 

[root@k8s-master local]# alternatives  --config java

There are 4 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1   java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64/jre/bin/java)
   2   java-1.7.0-openjdk.x86_64 (/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.161-2.6.12.0.el7_4.x86_64/jre/bin/java)
   3   /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
   4   /usr/local/jdk1.8.0_60/bin/java

Enter to keep the current selection[+], or type selection number: 4
[root@k8s-master local]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

果然切换过来了,怎么样?小伙伴,如果有需要不妨试试这个命令工具。

我们看看  /usr/bin/java有什么变化没有

[root@k8s-master local]# ll  /usr/bin/java
lrwxrwxrwx. 1 root root 22 Dec 20 14:09 /usr/bin/java -> /etc/alternatives/java
[root@k8s-master local]# ll /etc/alternatives/java
lrwxrwxrwx. 1 root root 46 Dec 20 14:09 /etc/alternatives/java -> /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java

可以看到 /usr/bin/java 的连接的地方没有变,改变了的/etc/alternatives/java 的连接,这其实是一个策略模式的实现:

Strategy


/usr/bin/java 的“调用”没有变,还是连接到 /etc/alternatives/java,/etc/alternatives/java的连接却被修改了,这个由 alternatives 管理。

通过linux的连接也可以简单地实现这种“接口”和“具体实现”的分离,但是 alternatives 提供一个配置清单,简单选一下就OK了,这为我们提供了很大的便利。


alternatives 命令详解

[root@k8s-master local]# alternatives  -h
alternatives version 1.7.2 - Copyright (C) 2001 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License.

usage: alternatives --install <link> <name> <path> <priority>
                    [--initscript <service>]
                    [--family <family>]
                    [--slave <link> <name> <path>]*
       alternatives --remove <name> <path>
       alternatives --auto <name>
       alternatives --config <name>
       alternatives --display <name>
       alternatives --set <name> <path>
       alternatives --list

common options: --verbose --test --help --usage --version --keep-missing
                --altdir <directory> --admindir <directory>

注释:

用法:alternatives --install <链接> <名称> <路径> <优先度>

                    [--initscript <服务>]

                    [--slave <链接> <名称> <路径>]*

       alternatives --remove <名称> <路径>

       alternatives --auto <名称>

       alternatives --config <名称>

       alternatives --display <名称>

       alternatives --set <名称> <路径>

       alternatives --list


神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。