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/bin
和ls
显示是正确的目录。
【问题讨论】:
which java
说什么?
$JAVA_HOME/bin/java -version
说什么?我怀疑这条路径不正确,所以会被忽略。
可能是反向路径定义export PATH=$PATH:/home/aqeel/development/jdk/jdk1.6.0_35/bin
如果您仍在同一个会话中,则必须重新加载配置文件source ~/.profile
@PeterLawrey 我已经编辑了我的问题以包含您告诉的命令的结果,请再看一下。谢谢
【参考方案1】:
虽然您的设置看起来是正确的,但仍有一些事项需要检查:
env
的输出 - 特别是 PATH
。
command -v java
告诉你什么?
$JAVA_HOME\bin
中是否有一个java
可执行文件,它是否设置了执行位?如果不是chmod a+x java
它。
我相信在添加/更改 JAVA_HOME
和 PATH
之后,您已拥有 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 实用程序的符号链接:javac
、java
、javap
等。
我还没有看到 JAVA_HOME
对 JDK 的影响。到目前为止,我只看到它在第三方工具中使用过,e.g. Maven。
【讨论】:
update-alternative command not found 帮助【参考方案6】:更新~/.profile
或~/.bash_profile
有时不起作用。我刚刚删除了 JDK 6 和 source
d .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版本。
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 仍显示旧版本的主要内容,如果未能解决你的问题,请参考以下文章
java到底要配几个环境变量 include、lib、path、JAVA_HOME、CLASSPATH 各个环境变量都起啥功能,怎么配