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

Joh*_*han 9 java unix ubuntu command-line environment-variables

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

export JAVA_HOME=/opt/jdk1.8.0_91
export PATH=$JAVA_HOME/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

进而:

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)
Run Code Online (Sandbox Code Playgroud)

乍一看,该命令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
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,sudo update-alternatives --config java关于$JAVA_HOME$变量中的设置,切换到另一种选择后究竟会做什么?

McQ*_*ack 12

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

首先查看从哪里找到命令,你可以这样做:

$which java
/usr/bin/java
Run Code Online (Sandbox Code Playgroud)

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

$ls -l /usr/bin | grep java
java -> /etc/alternatives/java
Run Code Online (Sandbox Code Playgroud)

然后你按照符号链接:

$ls -l /etc/alternatives/java
/etc/alternatives/java -> /path/to/my/java/installation/1.x/bin/java
Run Code Online (Sandbox Code Playgroud)

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

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

因为你设定

PATH=$JAVA_HOME/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

第一个将在$JAVA_HOME/binaka 中找到/opt/jdk1.8.0_91。因为你在PATH变量中默认定义了/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
Run Code Online (Sandbox Code Playgroud)

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

To correct this, you just have to concatenate $JAVA_HOME/bin after $PATH, like this :

PATH=$PATH:$JAVA_HOME/bin
Run Code Online (Sandbox Code Playgroud)

This way you will be able to choose the default java executable from alternatives and the java exe found in $JAVA_HOME/bin will be discarded. But to be consistent, in most cases you should choose the same java exe as in $JAVA_HOME/bin.