问题描述
起因是在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这个目录下,因为服务器重启最先读取的就是这个文件配置。