jenkins+maven编译WEB项目中遇到的坑
事件背景:
本人在一个web项目中依赖一个新的jar包,在上传到公司maven私服后,jenkins打包编译过程中出错,jenkins控制台中提示“类文件具有错误的版本52.0,应为50.0”。接下来进入正题。
报错处理:
发现上述报错后,明显是jar包编译时使用的是jdk8,而该web项目编译时是使用jdk6产生了jdk版本冲突,因此需要将该jar包重新使用jdk6编译。将该jar包使用jdk6重新编译之后,重新上传到公司maven远程仓库,本以为问题迎刃而解。但是此时问题正在慢慢靠近。
问题浮现:
在将jar包重新上传到公司maven远程仓库后,本来信心满满的到jenkins上点击重新构建等待项目打包成功,结果又出现了报错,jenkins中打印的错误日志还是“类文件具有错误的版本52.0,应为50.0”。可能到这已经有人意识到博主的操作在哪个环节出现了问题。
再次出现该报错,我已经有点懵。接下来是我的问题处理路径:
- 检查jar包编译是否存在问题 :
通过***.jar\META-INF下的MANIFEST.MF文件,发现该jar包确实是jdk1.6编译。
再次进入到报错的.class文件,通过Sublime Text查看.class文件的字节码,此处显示为32,确实是jdk1.6编译的jar。至此,可以排除jar包编译的问题。
备注:
只看第一行:
前面8个字节CA FE BA BE是固定的
随后4个字节00 00是次版本号
再后面的4个字节00 32是JDK的版本号(JDK1.6)
34(对应十进制的52):JDK1.8
33(对应十进制的51):JDK1.7
32(对应十进制的50):JDK1.6 - 手忙脚乱 :如果在本地编译,可能我已经意识到哪里出现了问题,但是在jenkins上打包对问题不敏感,因此在这个问题的处理上花费了些时间,直到最后突然意识到自己在哪个环节出现了问题。
问题解决:
jenkins+maven在对项目进行编译时,如果发现jenkins所在服务器的本地仓库没有对应版本的jar包,会先到远程maven仓库拉取jar,而本人在第一次将jdk1.8版本的jar上传到远程maven后发现版本错误,重新将jar编译为jdk1.6后上传到远程maven,直接来到了jenkins点击构建,而此时,jenkins所在服务器的本地maven仓库并没有重新拉取jar包。备注:maven仓库的特点:如果本地仓库已经存在某个版本的jar包,不会在远程仓库对jar进行重新拉取。
因此,我们需要来到jenkins所在服务器的本地maven仓库,将之前拉取下来的jdk1.8编译的jar包删除,再在远程仓库中拉取已重新上传的jdk1.6编译的jar包。
问题解决。原因就是,本人在两次maven远程仓库上传jar包时,jar包的版本号并没有修改,同时本地仓库已经拉取了该版本的jar,因此第二次上传的jar并没有被本地仓库重新拉取。