默认JAVA,$ JAVA_HOME vs sudo update-alternatives --config java

时间:2016-12-09 11:58:35

标签: java unix ubuntu command-line environment-variables

我在Ubuntu上,我在~/.bashrc文件中设置了以下内容:

export JAVA_HOME=/opt/jdk1.8.0_91
export PATH=$JAVA_HOME/bin:$PATH

然后:

echo $JAVA_HOME
>/opt/jdk1.8.0_91

java -version
>java version "1.8.0_91"
>Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
>Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
乍一看,命令sudo update-alternatives --config java没有显示我手动安装的Java,因此我使用sudo update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_91 1将其安装到命令中。

现在,命令sudo update-alternatives --config java将下载所有正在安装的Java版本的列表:

0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      auto mode
1            /opt/jdk1.7.0_51/bin/java                        1         manual mode
* 2            /opt/jdk1.8.0_91                                 1         manual mode
3            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      manual mode
4            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      manual mode

但是,使用sudo update-alternatives --config java的提示在这些内容之间切换不会影响$JAVA_HOME,然后$java -version

我的问题是,sudo update-alternatives --config java在切换到$JAVA_HOME$变量中的设置之后的其他替代方案时,究竟做了什么?

1 个答案:

答案 0 :(得分:2)

它仅在/etc/alternatives/java更改位于(我猜的大多数发行版)的符号链接。 绝对没有设置$JAVA_HOME的环境变量的变化。

首先看一下找到命令的位置,你可以这样做:

$which java
/usr/bin/java

哪个命令在我的Debian发行版中显示/usr/bin/java。此文件是符号链接,指向/etc/alternatives/java

$ls -l /usr/bin | grep java
java -> /etc/alternatives/java

然后你按照符号链接:

$ls -l /etc/alternatives/java
/etc/alternatives/java -> /path/to/my/java/installation/1.x/bin/java

这表明/etc/alternatives/java是另一个符号链接。 在java上执行update-alternatives时,只需将此符号链接目标更改为另一个符号链接。

然后,当您执行update-alternatives命令时,为什么执行的版本不会更改? 我想这是因为在$PATH中找到了可执行文件的顺序。 由于您向PATH环境变量添加了一个目录,现在有两个可能的java可执行文件:一个在/usr/bin中,另一个在/opt/jdk1.8.0_9中,但只有当找到的第一个时,才会考虑到# 39; ll键入java命令。

因为你设置了

PATH=$JAVA_HOME/bin:$PATH

第一个将在$JAVA_HOME/bin又名/opt/jdk1.8.0_91中找到。 因为您/opt/jdk1.8.0_9出现在/usr/bin之前,这是在PATH变量中默认定义的。 您可以通过键入终端

来检查它
$echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/path/to/my/java/installation/1.x/bin

您可以看到我的java / bin目录位于PATH中定义的其他目录之后。

要解决此问题,您只需在$JAVA_HOME/bin之后连接$PATH,就像这样:

PATH=$PATH:$JAVA_HOME/bin

这样您就可以从alternative中选择默认的java可执行文件,并且$JAVA_HOME/bin中的java exe将被丢弃。 但为了保持一致,在大多数情况下,您应该选择与$JAVA_HOME/bin中相同的java exe。