因为项目的原因,所以我们从JDK8升级到了JDK11(openjdk),但是也因此除了一些问题,这次主要列举jenkins的问题。
首先列举出现问题的原因,因为文字比较长,可能大家会没有耐心。

  1. JDK8是yum安装的,但是OPENJDK11是绿色免安装版的。
  2. 因为Jenkins构建的时候publish over ssh是non-login的,所以我们配置环境变量不能只配置/etc/profile,还要配置/etc/bashrc。

接下来是出现的问题和解决的思路

一、不能用JDK8环境去运行JDK11的程序

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/zpmc/ztos/system/ZtosSystemApplication has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
很明显,这个报错提示我们程序使用JDK11编译的,但是用的JDK8运行的,所以我把一些该配置的都配置了,主要是两点。

  1. /etc/profile的JAVA_HOME
    在这里插入图片描述
    因为从JDK9之后就没有了dt.jar和tools.jar,所以JDK11不配置CLASSPATH
  2. Jenkins配置JDK
    在这里插入图片描述
    配置同样的JAVA_HOME路径。

两步做完了之后,便像从前一样开始构建一个应用试试。
在这里插入图片描述
构建结果显示成功
但是查看微服务日志却发现
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/zpmc/ztos/system/ZtosSystemApplication has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
意思就是不能用JDK8环境去运行JDK11的程序
我在想,我哪里不对了
微服务目录下有刚刚Jenkins构建的jar包
我用Jenkins中同样的命令去启动,发现完全没问题,难道Jenkins还有一个地方配置JDK?
不对,JDK8好像之前别人装的时候是yum装的,而我新下载的jdk11是绿色版的。
rpm -qa|grep java
发现还有JDK1.8余党,而我之前竟然只是删掉了JDK8的文件夹和修改了/etc/profile,哈哈真是天真
yum erase -y java-1.8.0*
卸载完毕之后重新再Jenkins构建一次
发现了下面的第二个的问题

二、nohup: failed to run command ‘java’: No such file or directory

为虾米?
java -version
没错啊,显示是OPENJDK11
[root@elk /usr/Microservices/logs]# java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
我去网上找了一些答案
有的说SSH的shell脚本应该前面加上
source /etc/profile
我试过不行

有的说你不仅要在/etc/profile配置JAVA_HOME
还要在~/.bashrc里面也配置JAVA_HOME
我试了一下,可以!
终于构建成功了!
但是我在网上找到了这几个配置文件的区别

/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:  为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.
~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件.
 
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.

所以既要配置成全局的,又要在每次SSH时候能够读取到JAVA_HOME。
所以我在/etc/bashrc中配置了JAVA_HOME
最后大功告成!
附上参考链接
http://blog.sina.com.cn/s/blog_64693fd40101eyyh.html
https://www.cnblogs.com/probemark/p/5886766.html
https://www.cnblogs.com/kevingrace/p/8072860.html
https://www.codeleading.com/article/64173001185/

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐