NoOps

Ops make no ops | Ops的目标是没有Ops,嗯!

alternative 命令学习与多版本 jdk 安装

作者: |   1,308 浏览  | 

alternative 命令用于管理系统上多个提供相同功能的软件包。如 jre mta editor 等。

当系统中有多个 editor 软件安装时,alternative 系统指定其中一套软件(包括相应的 man page)供用户使用。
如 editor 我们有vim nano gedit ed 等可供选择,相应地,有对应的 man page
下文我们将通过实际安装一个 alternative 命令来体会该命令的强大之处。

alternative 命令

该命令需要root 权限运行

看起来 –install 分支较为复杂一些,其他分支看名字就能猜出意思来。

首先,我们想看一下目前系统中安装了哪些 alternatives, 不过遗憾的是,该命令没有 –list 参数。
通过man alternatives,发现系统安装的 alternatives 都在 /var/lib/alternatives/ 下面。检查一下,发现里面有三个文本文件

看起来系统安装了这三个 alternatives
我们来看看links 到底是什么

看起来,links 指向了 /usr/bin/elinks
检查一下,确实是这样的。

下面我们将安装一个叫 editor 的alternative。 editor命令放在 /usr/local/bin/ 下面

这时运行 /usr/local/bin/editor  就可以直接打开 vim 了

但是看起来man page仍然不生效

我们通过安装 slave alternatives 来解决这个问题

试试 man editor

大功告成
当然,我们也可以安装另一个 editor 的候选并设置一个较低的优先级。

在机器上用RPM 装多个版本的JDK

从上面的页面下载所需版本的jdk
对于jdk6,需要先解开bin包,再安装里面的所有rpm包。
会得到一个jdk的包和很多sun-javadb-*的包
将这些包都传到yum repo,然后更新repo索引。
在机器上运行:
就可以看到传到yum repo上的所有jdk版本

见图

5291ead1-b43b-4806-be47-6c3c7fbfb8d8

从jdk1.8起,包的命名方式竟然改了。
把jdk 1.6 1.7 1.8都装上
检查 java 链接

看起来这个链接不属于任何包。

我们安装之前学习的 alternatives 来管理多个版本的jdk
我们以jdk为名字来管理上面的java/javac/javadoc/javaws/…的链接

看起来版本已经是正确的了
然后,再更新下相关联的j* 程序的链接
看起来下面的包都需要做一下alternatives 链接

用一个脚本解决:

上面的脚本同时解决了 JAVA_HOME 环境变量的配置。

这应该就是安装多版本JDK的正确姿势了。

PS: 根据实际的安装经验,jdk1.8的RPM已经自行安装 alternatives,不需要运行上面的脚本了。

参考:

http://www.if-not-true-then-false.com/2010/install-sun-oracle-java-jdk-jre-7-on-fedora-centos-red-hat-rhel/

5 Comments

  1. jiangwei
    2015/09/08 at 11:54 上午
  2. transtone
    2015/11/22 at 9:18 上午

    首先给此篇文章点赞。
    但我觉得文章末尾还可以加上一些盘外招:
    1. gentoo的slot机制能很好的解决多版本的问题
    2. docker就是为这个目的(我个人理解为单系统下的复杂环境配置和多系统下的配置统一)而生的
    运维中面临的复杂情况很多,当然要具体情况具体分析,个人觉得没有哪个方法是万能的,只有最合适的。

  3. 2015/12/14 at 11:50 上午

    github上有个jenv多版本一键切换jdk的工具,非常好用。
    https://github.com/gcuisinier/jenv

  4. iambocai
    2016/01/14 at 12:58 下午

    alternative install 权重参数那块,写成100或者一个固定数字并不推荐,比较好的实践是写成程序版本号,比如160063、 170079、 180051,这样写的好处有三个:
    1. 不同版本java安装的时候不会因为权重相同而导致alternative只能按照安装时间排序,造成不同机器上可能出现不同active版本
    2. 如果不进行手动alternative –config,默认权重最高的(也就是版本最高的)为active版本,这与我们一般的期望一致;
    3. 仍可以通过手动 alternative –config jdk 来选择任意已安装java版本为active版本。

    另外对系统JAVA_HOME的设置,并不建议直接指定为/usr/java/jdk_, 理由是会给java版本切换留坑(想象一下你进行了上面第3个操作,但是没有改JAVA_HOME会带来怎样的诡异效果), 建议的做法是指定为/usr/java/default

    • jiangwei
      2016/01/14 at 6:13 下午

      赞实践出真知

iambocai 进行回复 取消回复