JAVA_HOME 和 PATH 已设置,但 java -version 仍显示旧版本

Posted

技术标签:

【中文标题】JAVA_HOME 和 PATH 已设置,但 java -version 仍显示旧版本【英文标题】:JAVA_HOME and PATH are set but java -version still shows the old one 【发布时间】: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 我已经编辑了我的问题以包含您告诉的命令的结果,请再看一下。谢谢 【参考方案1】:

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

    env 的输出 - 特别是 PATHcommand -v java 告诉你什么? $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。

【讨论】:

update-alternative command not found 帮助【参考方案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

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

    我跑了:

    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版本

    这并没有设置我想要配置的 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?

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

    要根据所选的 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 版本,您可能需要考虑:

    添加一个别名到你的~./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 放在首位,系统将使用这个。

【讨论】:

以上是关于JAVA_HOME 和 PATH 已设置,但 java -version 仍显示旧版本的主要内容,如果未能解决你的问题,请参考以下文章

jdk环境变量配置

java环境配置,试用和基本数据结构

java配置问题

JDK安装和卸载

class编译默认用jdk11

java到底要配几个环境变量 include、lib、path、JAVA_HOME、CLASSPATH 各个环境变量都起啥功能,怎么配