alternative 命令用于管理系统上多个提供相同功能的软件包。如 jre mta editor 等。
当系统中有多个 editor 软件安装时,alternative 系统指定其中一套软件(包括相应的 man page)供用户使用。
如 editor 我们有vim nano gedit ed 等可供选择,相应地,有对应的 man page
下文我们将通过实际安装一个 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 的候选并设置一个较低的优先级。
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版本
见图
从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/