Default JAVA, $JAVA_HOME vs sudo update-alternatives --config java

我在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)

乍一看,该命令没有显示我手动安装的Java,因此我将其安装到带有.sudo update-alternatives --config javasudo update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_91 1

现在,该命令会像这样下拉正在安装的所有 Java 版本的列表:sudo update-alternatives --config 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

它只会更改位于 的符号链接(我猜在大多数发行版上)。绝对不会更改您设置的环境变量。/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

这表明这是另一个符号链接。当你在java上做一个时,你只需将这个符号链接目标更改为另一个。/etc/alternatives/javaupdate-alternatives

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

而且因为你设置

PATH=$JAVA_HOME/bin:$PATH

第一个将在 aka 中找到。因为您使出现在 PATH 变量中默认定义的之前。您可以通过输入终端进行检查$JAVA_HOME/bin/opt/jdk1.8.0_91/opt/jdk1.8.0_9/usr/bin

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

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

要纠正这一点,您只需要在 之后连接 ,如下所示:$JAVA_HOME/bin$PATH

PATH=$PATH:$JAVA_HOME/bin

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


答案 2

推荐