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

49

我正在使用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?
更新: which java显示/usr/bin/java。 $JAVA_HOME/bin/java -version显示“拒绝许可”。 sudo $JAVA_HOME/bin/java -version(要求密码,然后)显示未找到命令。
但是cd $JAVA_HOME/bin,并且ls会显示正确的目录。

可能需要反转PATH定义:export PATH=$PATH:/home/aqeel/development/jdk/jdk1.6.0_35/bin - Subin Sebastian
1
如果您仍在同一会话中,则必须重新加载配置文件 source ~/.profile - Manish
10个回答

71

虽然你的设置看起来是正确的,但仍需要检查以下几点:

  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目录中没有标记为可执行的文件。请告诉我还有哪些文件需要标记为可执行?(另外请查看我编辑过的问题)非常感谢。 - user517491
请参考我上面的第三点。在bin目录中执行chmod a+x *可能会解决问题。同时阅读man chmod以及关于Unix/Linux权限的一些内容。 - Anders R. Bystrup
好的,在bin目录中执行chmod a+x *命令后,可以得到$JAVA_HOME/bin/java -version的输出结果,但是java -version仍然是旧的默认版本。 - user517491
关闭当前终端,打开一个新的终端,确保PATH设置正确,然后再次尝试。 - Anders R. Bystrup
3
当导出PATH时,将$ PATH本身作为最后一个参数。否则,您可能仍然会引用旧的路径。 - magiccrafter

20

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产生影响。到目前为止,我只在第三方工具中看到它被使用,例如Maven


1
找不到update-alternative命令。这个链接可能会有所帮助。 - Stalin Gino

11
如果您想使用从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"语句。
  4. 现在,我已经下载了两个JDK(假设第二个已经提取到/home/aqeel/development/jdk/jdk-10.0.1)。

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

    我的解决方案不是很优雅,我相信还有更好的选择,但无论如何:

  5. 为了根据所选java交替动态更改JAVA_HOME,我添加了以下代码片段到~/.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 - Cleber Jorge Amaral
没错,命令是 sudo update-alternatives --install /usr/bin/java java /home/aqeel/development/jdk/jdk1.6.0_35/bin/java 1,感谢 @CleberJorgeAmaral 的提醒,我已经修复了。 - Gerardo Roza

4

$JAVA_HOME/bin/java -version 显示“Permission Denied”

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

执行以下操作:

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”仍然是旧的默认版本。 - user517491
1
尝试调用 hash -r 命令,以使 shell 删除其记忆的位置。 - Peter Lawrey

4
当系统搜索java时,它从由“:”分隔的路径条目的左到右进行搜索,因此您需要在/usr/bin之前添加最新jdk/bin目录的路径,以便搜索找到最新版本并停止进一步搜索。
例如: PATH=/usr/java/jdk_1.8/bin:/usr/bin:.....等等。
然后使用命令初始化用户配置文件:source~/.bash_profile 最后通过[which java]检查您将获得正确的结果。

2
尝试这个:
  • 将export JAVA_HOME=put_here_your_java_home_path替换成实际的JAVA_HOME路径
  • 键入 export PATH=$JAVA_HOME/bin:$PATH(确保$JAVA_HOME是PATH中的第一个元素)
  • 尝试 java -version
原因:可能有其他PATH元素指向备选java路径。 如果首先放置您首选的JAVA_HOME,则系统将使用此路径。

2

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

最初的回答

 $ sudo update-alternatives --display java

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

sudo update-alternatives --config java

请注意,此命令需要root权限。

原始答案: "最初的回答"

 $ sudo update-alternatives --config java

当提示时,请选择您想要使用的Java版本,例如1、2、3等。
现在,您可以验证默认的Java版本是否已更改,如下所示。
最初的回答:

当提示时,请选择您想要使用的Java版本,例如1、2、3等。

现在,您可以验证默认的Java版本是否已更改,如下所示。

 $ java -version

1

有一种简单的方法,只需从“/usr/bin”中删除符号链接即可。它将正常工作。


1

有时更新~/.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

0
在Linux Mint 18 Cinnamon中,请务必检查/etc/profile.d/jdk_home.sh文件。我将此文件重命名为jdk_home.sh.old,现在我的路径不再被覆盖,我可以调用java -version并按预期看到Java 9。尽管我在update-alternatives --config java中正确选择了Java 9,但此jdk_home.sh文件仍会在启动时覆盖$PATH。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接