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

标签 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 --安装/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$ 变量中的设置的另一种选择后到底做了什么?

最佳答案

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

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

$which java
/usr/bin/java

which 命令在我的 Debian 发行版中显示 /usr/bin/java。此文件是指向 /etc/alternatives/java 的符号链接(symbolic link)。

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

然后你点击符号链接(symbolic link):

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

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

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

因为你设置了

PATH=$JAVA_HOME/bin:$PATH

第一个可以在 $JAVA_HOME/bin aka /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 中定义的其他目录之后。

要更正此问题,您只需在 $PATH 之后连接 $JAVA_HOME/bin,如下所示:

PATH=$PATH:$JAVA_HOME/bin

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

关于java - 默认 JAVA,$JAVA_HOME 与 sudo update-alternatives --config java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41059994/

相关文章:

java - 我的 String 和 StringBuilder 未在控制台中显示输出

java - 当我在运行时只能在字符串变量中找到类的名称时,如何使用该类?

linux - 内核崩溃 - 创建自己的 AMI(Amazon 机器镜像)

java - 仅使用 Spring Security 为某些请求设置多种身份验证方法

PHP - 写入文件

linux - 未找到 UNIX 中的 _recalloc

c - 将变量传递到另一个文件

ubuntu - 在 anaconda 中安装包 gcc-7 时发生错误

java - Ubuntu 上的 Sun Java 6

java - 如何动态创建一个包含 n 行的 Swing 列表,其中我为每一行放置 2 个数据