【问题标题】:JAVA_HOME and PATH are set but java -version still shows the old oneJAVA_HOME 和 PATH 已设置,但 java -version 仍显示旧版本
【发布时间】:2012-12-16 16:45:21
【问题描述】:

我使用的是 Linux Mint Cinnamon 14。我在~/.profile 中设置了$JAVA_HOME$PATH 环境变量,如下所示:

export JAVA_HOME=/home/aqeel/development/jdk/jdk1.6.0_35
export PATH=/home/aqeel/development/jdk/jdk1.6.0_35/bin:$PATH

然后我做了source ~/.profile 进行适当的更改。

当我执行java -version 命令检查活动的java 版本时,它显示了默认的(已经安装的open-jdk)java 版本。如何用我下载的 open-jdk 覆盖默认的 open-jdk?

更新:

which java 说 /usr/bin/java

$JAVA_HOME/bin/java -version 说“权限被拒绝”

sudo $JAVA_HOME/bin/java -version(然后要求输入密码)说找不到命令

但是cd $JAVA_HOME/binls显示是正确的目录。

【问题讨论】:

  • which java 说什么?
  • $JAVA_HOME/bin/java -version 说什么?我怀疑这条路径不正确,所以会被忽略。
  • 可能是反向路径定义export PATH=$PATH:/home/aqeel/development/jdk/jdk1.6.0_35/bin
  • 如果您仍在同一个会话中,则必须重新加载配置文件source ~/.profile
  • @PeterLawrey 我已经编辑了我的问题以包含您告诉的命令的结果,请再看一下。谢谢

标签: java linux environment-variables linux-mint


【解决方案1】:

虽然您的设置看起来是正确的,但仍有一些事项需要检查:

  1. env 的输出 - 特别是 PATH
  2. command -v java 告诉你什么?
  3. $JAVA_HOME\bin 中是否有一个java 可执行文件,它是否设置了执行位?如果不是chmod a+x java它。

我相信在添加/更改 JAVA_HOMEPATH 之后,您已拥有 source.profile

另外,您可以通过编写以下代码来帮助自己在将来维护 JDK 安装:

export JAVA_HOME=/home/aqeel/development/jdk/jdk1.6.0_35
export PATH=$JAVA_HOME/bin:$PATH

那么你在安装JDK的时候只需要更新一个环境变量。

最后,您可能需要运行 hash -r 来清除 Bash 程序缓存。其他 shell 可能需要类似的命令。

干杯,

【讨论】:

  • 我明白了,$JAVA_HOME/bin 目录中没有文件被标记为可执行文件。请告诉我我必须将哪些其他文件标记为可执行文件? (另请参阅我编辑过的问题)非常感谢
  • 见我上面的子弹 3。 bin 目录中的 chmod a+x * 可能会解决问题。还请阅读man chmod 以及有关 unix/linux 权限的一般信息。
  • 好的,在bin目录下执行chmod a+x *后,收到$JAVA_HOME/bin/java -version的结果,但java -version仍然是旧的默认值。
  • 导出 PATH 时,将 $PATH 本身作为最后一个参数。否则你可能仍然会引用旧的。
  • ^^ 这是我的问题,将 $PATH 移到最后一个参数并且工作正常。
【解决方案2】:

$JAVA_HOME/bin/java -version 说“权限被拒绝”

如果您无法访问或运行代码,则将其添加到您的路径时将被忽略。您需要使其可访问和可运行,或者获取您自己的副本。

做一个

ls -ld $JAVA_HOME $JAVA_HOME/bin $JAVA_HOME/bin/java

看看为什么你不能访问或运行这个程序。

【讨论】:

  • 糟糕,它没有被标记为可执行文件(正如@Anders R. Bystrup 在他的回答中指出的那样)。在bin 目录中执行chmod a+x * 后,收到$JAVA_HOME/bin/java -version 结果,但java -version 仍然是旧的默认值。
  • 尝试调用hash -r 以使外壳删除它记住的位置。
【解决方案3】:

有一个简单的方法,只需从“/usr/bin”中删除符号链接。它会起作用的。

【讨论】:

    【解决方案4】:

    当它搜索 java 时,它会从左到右查找以 : 分隔的路径条目,因此您需要在 /usr/bin 之前添加最新的 jdk/bin 目录的路径,这样当它搜索时会找到最新的并停止进一步搜索。

    即PATH=/usr/java/jdk_1.8/bin:/usr/bin:.....等等。

    然后使用命令初始化用户配置文件:source ~/.bash_profile

    并检查:[which java]

    你会得到正确的。

    【讨论】:

      【解决方案5】:

      update-java-alternatives

      在您的JAVA_HOME 中找不到java 可执行文件,它仅取决于您的PATH

      update-java-alternatives是管理它的好方法,整个系统是通过:

      update-java-alternatives -l
      

      样本输出:

      java-7-oracle 1 /usr/lib/jvm/java-7-oracle
      java-8-oracle 2 /usr/lib/jvm/java-8-oracle
      

      选择其中一项:

      sudo update-java-alternatives -s java-7-oracle
      

      update-alternatives 一样,它通过符号链接管理工作。优点是同时管理所有 Java 实用程序的符号链接:javacjavajavap 等。

      我还没有看到 JAVA_HOME 对 JDK 的影响。到目前为止,我只看到它在第三方工具中使用过,e.g. Maven

      【讨论】:

      【解决方案6】:

      更新~/.profile~/.bash_profile 有时不起作用。我刚刚删除了 JDK 6 和 sourced .bash_profile

      尝试运行这个:

      sudo rm -rd jdk1.6.0_* #it may not let you delete without sudo
      

      然后,修改/添加您的 JAVA_HOME 和 PATH 变量。

      source ~/.bash_profile #assuming you've updated $JAVA_HOME and $PATH
      

      【讨论】:

        【解决方案7】:

        在 Linux Mint 18 Cinnamon 中,一定要检查 /etc/profile.d/jdk_home.sh 我将此文件重命名为 jdk_home.sh.old,现在我的路径不会一直被覆盖,我可以调用 java -version 并按预期查看 Java 9。即使我在 update-aternatives --config java 中正确选择了 Java 9,这个 jdk_home.sh 文件在启动时仍然会覆盖 $PATH。

        【讨论】:

          【解决方案8】:

          如果您想使用从 Oracle 网站下载的 JDK,对我有用(使用 Mint)的方法是使用 update-alternatives

          1. 我下载了 JDK 并将其解压到任意位置,例如 /home/aqeel/development/jdk/jdk1.6.0_35
          2. 我跑了:

            sudo update-alternatives --install /usr/bin/java java /home/aqeel/development/jdk/jdk1.6.0_35/bin/java 1
            

            现在您可以执行sudo update-alternatives --config java选择您的Java版本

          3. 这并没有设置我想要配置的 JAVA_HOME 变量,所以我只是将它添加到我的 ~/.bashrc 中,包括一个 export JAVA_HOME="/home/aqeel/development/jdk/jdk1.6.0_35" 语句

          现在,我已经下载了两个 JDK(假设第二个已提取到 /home/aqeel/development/jdk/jdk-10.0.1)。

          如何根据当前使用的 java 动态更改 JAVA_HOME?

          我的解决方案不是很优雅,我很确定那里有更好的选择,但无论如何:

          1. 要根据所选的 java 替代项动态更改 JAVA_HOME,我将这个 sn-p 添加到 ~/.bashrc:

            export JAVA_HOME=$(update-alternatives --query java | grep Value: | awk -F'Value: ' '{print $2}' | awk -F'/bin/java' '{print $1}')
            

          最后(这超出了范围)如果您必须不断更改 java 版本,您可能需要考虑:

          1. 添加一个别名到你的~./bash_aliases

            alias change-java="sudo update-alternatives --config java"
            

          (您可能需要创建文件,并可能在 ~/.bashrc 中取消注释与此相关的部分)

          【讨论】:

          • 似乎最后一个字符应该被删除,不是吗? sudo update-alternatives --install /usr/bin/java java /home/aqeel/development/jdk/jdk1.6.0_35/bin/java 1`
          • 对,命令是sudo update-alternatives --install /usr/bin/java java /home/aqeel/development/jdk/jdk1.6.0_35/bin/java 1,刚刚解决了这个问题,感谢@CleberJorgeAmaral 的提醒
          【解决方案9】:

          使用 update-alternatives 命令检查 Linux 系统上可用的 Java 版本:

           $ sudo update-alternatives --display java
          

          现在有合适的候选者可以更改,您可以通过运行以下命令在可用的 Java JRE 中切换默认 Java 版本:

           $ sudo update-alternatives --config java
          

          出现提示时,选择您要使用的 Java 版本。1 或 2 或 3 等。

          现在您可以验证默认 Java 版本更改如下。

           $ java -version
          

          【讨论】:

            【解决方案10】:

            试试这个:

            • 导出 JAVA_HOME=put_here_your_java_home_path
            • 输入 export PATH=$JAVA_HOME/bin:$PATH(确保 $JAVA_HOME 是 PATH 中的第一个元素)
            • 试试 java -version

            原因:可能有其他 PATH 元素指向替代 java home。如果您将首选的 JAVA_HOME 放在首位,系统将使用这个。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-08-13
              • 2015-11-08
              • 1970-01-01
              • 2012-05-28
              • 1970-01-01
              • 2019-03-20
              • 1970-01-01
              • 2015-05-16
              相关资源
              最近更新 更多