【问题标题】:Default JAVA, $JAVA_HOME vs sudo update-alternatives --config java默认 JAVA,$JAVA_HOME 与 sudo update-alternatives --config java
【发布时间】:2016-12-09 11:58:35
【问题描述】:

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

我的问题是,关于$JAVA_HOME$ 变量中的设置,sudo update-alternatives --config java 在切换到另一个替代方案后究竟做了什么?

【问题讨论】:

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


    【解决方案1】:

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

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

    $which java
    /usr/bin/java
    

    which 命令在我的 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 中,但是当您键入 @987654334 时,只会考虑找到的第一个@ 命令。

    因为你设置了

    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。

    【讨论】:

      猜你喜欢
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多