解决linux服务器中的JAVA_HOME配置无法生效或配置错误问题

747 阅读1分钟

问题描述

起因是在gradle打包应用的时候遇到了一个关于JAVA_HOME的问题:JAVA_HOME is set to an invalid directory,具体的描述如下:

ERROR: JAVA_HOME is set to an invalid directory: /usr/lib/jvm/java-11-openjdk-11

我打包需要使用java11版本,但目前的java版本出现了错误。

初步解决

定位

首先想到的是我的服务器之前因为配置了1.8的JAVA_HOME,导致版本指向出现了错误,也就是JAVA_HOME设置出现了问题,所以我先查了java的版本。

$ java -version

结果确实是JAVA_HOME指向了1.8版本的java。

解决

所以我修改了centos的JAVA_HOME路径(注意:centos的bash在/etc/profile中):

$ sudo vim /etc/profile

/etc/profile的内容:

$ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.16.0.8-1.el7_9.x86_64
$ export JRE_HOME=$JAVA_HOME/jre
$ export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
$ export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

配置文件生效后,查询java版本:

$ source /etc/profile
$ java -version

如果之前没配置过java,这样简单的处理应该就可以解决了。

但是!!!

在我的服务器上这样简单的处理还是失败了orz!java版本仍然是1.8!也就是不只是配置文件的问题,还需要继续定位其他地方是不是也出现了问题。

二次解决

因为是java命令指向了1.8版本,所以我们反向一步一步推导java如何链接到java1.8的。

定位

通过which java命令,查询到java的第一层链接/usr/bin/java,通过ll查询java的链接位置:

$ which java
/usr/bin/java
$ ll | grep java
lrwxrwxrwx   1 root root         22 Jul 29 10:36   java -> /etc/alternatives/java
lrwxrwxrwx   1 root root         23 Jul 29 10:36 javac -> /etc/alternatives/javac
lrwxrwxrwx   1 root root         25 Jul 29 10:36 javadoc -> /etc/alternatives/javadoc
lrwxrwxrwx   1 root root         23 Jul 29 10:36 javah -> /etc/alternatives/javah
lrwxrwxrwx   1 root root         23 Jul 29 10:36 javap -> /etc/alternatives/javap

可以看到所有的链接都到了/etc/alternatives/这个目录。所以进入到该目录中,继续查看java的链接目标:

$ cd /etc/alternatives
$ ll | grep java$
lrwxrwxrwx 1 root root 73 Jul 29 10:36 java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/bin/java

可以明显看到是在这一块的链接指向了1.8,更新/etc/profile并没有更新该链接。

解决

所以需要删除/usr/bin//etc/alternatives/中的java链接(记得加sudo),重新source一遍路径配置。

$ cd /etc/alternatives
$ sudo rm -f java
$ ll | grep java$
$ cd /usr/bin
$ sudo rm -f java
$ ll | grep java$

重新配置java软链,将当前新版本的java安装路径下的bin/java链接到/usr/bin/java下。以防万一可以重新source一遍/etc/profile

$ sudo ln -s usr/lib/jvm/java-11-openjdk-11.0.16.0.8-1.el7_9.x86_64/bin/java /usr/bin/java
$ source /etc/profile

大功告成!

ps:其实在centos环境下,最好是把JAVA_HOME写在/etc/bashrc这个目录下,因为服务器重启最先读取的就是这个文件配置。