转载

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

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

当系统中有多个 editor 软件安装时,alternative 系统指定其中一套软件(包括相应的 man page)供用户使用。

如 editor 我们有vim nano gedit ed 等可供选择,相应地,有对应的 man page

下文我们将通过实际安装一个 alternative 命令来体会该命令的强大之处。

alternative 命令

该命令需要root 权限运行

Shell

]# alternatives  alternatives version 1.3.49.3 - 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>]                     [--slave <link> <name> <path>]*        alternatives --remove <name> <path>        alternatives --auto <name>        alternatives --config <name>        alternatives --display <name>        alternatives --set <name> <path>  common options: --verbose --test --help --usage --version                 --altdir <directory> --admindir <directory>

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

首先,我们想看一下目前系统中安装了哪些 alternatives, 不过遗憾的是,该命令没有 –list 参数。

通过man alternatives,发现系统安装的 alternatives 都在 /var/lib/alternatives/ 下面。检查一下,发现里面有三个文本文件

Shell

]# ll /var/lib/alternatives/ total 12 -rw-r--r-- 1 root root 113 Aug 13 11:42 links -rw-r--r-- 1 root root 689 Aug 13 11:26 mta -rw-r--r-- 1 root root 861 Aug 13 11:27 print

看起来系统安装了这三个 alternatives

我们来看看links 到底是什么

Shell

]# alternatives  --display links links - status is auto.  link currently points to /usr/bin/elinks /usr/bin/elinks - priority 90  slave links-man: /usr/share/man/man1/elinks.1.gz Current `best' version is /usr/bin/elinks.

看起来,links 指向了 /usr/bin/elinks

检查一下,确实是这样的。

Shell

]# readlink -f `which links` /usr/bin/elinks

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

Shell

]# alternatives --verbose --install /usr/local/bin/editor editor /usr/bin/vim 10 reading /var/lib/alternatives/editor  ]# readlink -f /usr/local/bin/editor  /usr/bin/vim  ]# alternatives --display editor editor - status is auto.  link currently points to /usr/bin/vim /usr/bin/vim - priority 10 Current `best' version is /usr/bin/vim.

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

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

Shell

]# man editor No manual entry for editor

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

Shell

# alternatives --verbose --install /usr/local/bin/editor editor /usr/bin/vim 10 --slave /usr/local/share/man/man1/editor.1.gz editor-man /usr/share/man/man1/vim.1.gz reading /var/lib/alternatives/editor  ]# alternatives --display editor editor - status is auto.  link currently points to /usr/bin/vim /usr/bin/vim - priority 10  slave editor-man: /usr/share/man/man1/vim.1.gz Current `best' version is /usr/bin/vim.

试试 man editor

大功告成

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

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

jdk6 下载页  http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html

jdk7 下载页  http://www.oracle.com/technetwork/java/java-archive-downloads-javase7-521261.html

jdk8 下载页  http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html

从上面的页面下载所需版本的jdk

对于jdk6,需要先解开bin包,再安装里面的所有rpm包。

Shell

chmod +x jdk-6u31-linux-x64-rpm.bin && ./jdk-6u31-linux-x64-rpm.bin -x

会得到一个jdk的包和很多sun-javadb-*的包

将这些包都传到yum repo,然后更新repo索引。

在机器上运行:

Shell

yum makecache yum list all jdk* --showduplicates

就可以看到传到yum repo上的所有jdk版本

见图

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

从jdk1.8起,包的命名方式竟然改了。

把jdk 1.6 1.7 1.8都装上

检查 java 链接

Shell

]# ll /usr/bin/java* lrwxrwxrwx 1 root root 26 Jan 13  2015 /usr/bin/java -> /usr/java/default/bin/java lrwxrwxrwx 1 root root 27 Jan 13  2015 /usr/bin/javac -> /usr/java/default/bin/javac lrwxrwxrwx 1 root root 29 Jan 13  2015 /usr/bin/javadoc -> /usr/java/default/bin/javadoc lrwxrwxrwx 1 root root 28 Jan 13  2015 /usr/bin/javaws -> /usr/java/default/bin/javaws

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

我们安装之前学习的 alternatives 来管理多个版本的jdk

我们以jdk为名字来管理上面的java/javac/javadoc/javaws/…的链接

Shell

]# alternatives --install /usr/bin/java jdk /usr/java/jdk1.6.0_31/bin/java 100 ]# java -version java version "1.6.0_31"

看起来版本已经是正确的了

然后,再更新下相关联的j* 程序的链接

看起来下面的包都需要做一下alternatives 链接

jar         javac       javap       jcontrol    jinfo       jrunscript  jstat        jarsigner   javadoc     javaws      jdb         jmap        jsadebugd   jstatd       java        javah       jconsole    jhat        jps         jstack      jvisualvm

用一个脚本解决:

Shell

]# cat update_jdk_alternatives.sh  #!/bin/bash JAVA_HOME=$1 if test -z "$JAVA_HOME";then     echo "usage: $0 JAVA_HOME"     exit -1 fi  JAVA_BINS="jar         javac       javap       jcontrol    jinfo       jrunscript  jstat        jarsigner   javadoc     javaws      jdb         jmap        jsadebugd   jstatd       java        javah       jconsole    jhat        jps         jstack      jvisualvm"  CMD="alternatives --install /usr/bin/java jdk ${JAVA_HOME}/bin/java 100"  SLAVE_CMD="" for BIN in $JAVA_BINS;do #    ls -l $JAVA_HOME/bin/$BIN     SLAVE_CMD="--slave /usr/bin/$BIN jdk-$BIN ${JAVA_HOME}/bin/$BIN $SLAVE_CMD" done $CMD $SLAVE_CMD alternatives --display jdk alternatives --set jdk ${JAVA_HOME}/bin/java echo "export JAVA_HOME=$JAVA_HOME" > /etc/profile.d/jdk.sh  ]# sh update_jdk_alternatives.sh /usr/java/jdk1.7.0_25/ ]# javac -version                  javac 1.7.0_25

上面的脚本同时解决了 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/

正文到此结束
Loading...