categories: [问题排查]


起因

自己在生产环境准备整个自动部署功能,走到使用 mvn clean package 打包时突然报了一个错误

  1. *** JAVA_HOME should point to a JDK not a JRE

排查

这个问题很常见,在idea中,一般都是我们配置为jre的位置,而不是jdk的位置,但是这是在Linux服务器上执行命令行出现的,顺着这个思路,去查看了Java的安装目录

  1. [root@iZm5e5d84aus1oanps2omoZ bin]# whereis java
  2. java: /usr/bin/java /usr/lib/java /etc/java /usr/share/java /usr/share/man/man1/java.1.gz

挨个找似乎没我预想到的jdk安装包,想到这个时朋友安装的,十有八九时工具安装的,试着查看了yum的JDK安装目录,了解到时安装在/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64,这个目录着实有点怪,因为他在jvm文件夹下
由于我可以使用java -version命令获取jdk版本,我就认为JDK已经安装成功了,猜想应该是目录没配对或者被修改了之类的,那就重新配下环境变量吧

  1. vim /etc/profile
  2. 添加如下内容
  3. JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64
  4. export JAVA_HOME
  5. source /etc/profile

本想着配项PATH变量的,但想到可以执行java命令,那应该不用配置,重新执行 mvn clean install, clean阶段直接就报错了,错误一样
无语😶
重新看了网上关于JDK和JRE的说明,发现自己对他们的理解都忘的差不多了,重新理解了一波

  1. JRE是面向客户的,仅给JAVA运行的,最明显的区分就在于他是不能编译代码的,因为它只包含 Java 虚拟机、Java 平台核心类和支持文件,它不包含开发工具(编译器、调试器等)
  2. 只要我们安装了JRE,那么不需要配置环境变量我们也能使用java命令,这是自动的,但是诸如javac的编译命令是无法拥有的

这里解答了我的疑惑,就是到目前为止,我使用的都是jre的java命令,所以可以查看版本号,值得注意的是,yum安装的会自动将/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/bin目录下的可执行文件java复制到/usr/bin目录下,众所周知,该目录是默认在PATH环境变量中被导出的,所以疑惑解决了
现在猜想应该是朋友只装了JRE没装JDK,这个可以从/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64这个目录下仅包含了JRE一个文件夹可以看出来,另外我执行javac命令也不能识别
验证google了yum的安装流程,需要安装两个文件

  1. # 两个分别代表JRE和JDK
  2. yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

而这里缺了第二个image.png

解决

知道问题就好办,安装上java-1.8.0-openjdk-devel即可

  1. yum -y install java-1.8.0-openjdk-devel.x86_64

重新执行mvn clean install
image.png

其他

在yum安装目录下可以见到很多版本的JDK,当安装了多个版本JDK时,如何确认和修改使用版本呢

这个可以在/etc/alternatives目录下查看java的软连接确认
image.png