Maven在使用中遇到的坑

概述

最近将项目的spring boot版本从1.3升到了2.1,中间跨过的坑无数,其中遇到最大的麻烦是升级之后自动化测试框架testNG在Eclipse中能够正常运行,但是用命令行执行 mvn clean test时就会提示找不到测试类。由于testNG及maven插件相关资料在网上都比较少,所以排查故障还花了挺长时间的,因此在这里稍微介绍一下。

故障定位

由于系统启动和服务都正常,所以spring-boot框架和系统中用到的开源软件不兼容的概率很小,最有可能的就是maven、testNG还有spring-boot-test组件中的其中一个了。为什么在Eclipse中测试能正常运行,在命令行就不行呢?在跑了N次测试用例后,终于发现通过命令行执行mvn test的时候,test-classes文件夹中只有resources文件,没有编译好的class文件。而通过Eclipse执行的时候就两者都有。由于执行mvn test时编译是由maven来做的,因此问题应该就出在maven身上了。
项目中用到了maven-compiler-plugin跟maven-surefire-plugin,翻看mvn test的日志,发现compiler在执行自动化测试的时候根本没有编译测试文件!而在pom文件中看到compiler plugin中有个fork的配置项写的是true。我按照字面意思理解这可能是一个选择执行并发的配置项,因此把这个配置改成了false试试看,结果问题果然不见了。应该是我spring-boot升级到高版本后,相应的maven插件也被升级了,不知道是插件本身的bug还是和testNG兼容性不好,导致了这个bug。

maven-compiler-plugin

那么问题来了,这个fork配置项到底是干啥的呢?为啥项目的pom文件会设成true呢?把它改成false会不会有什么影响?百度compiler plugin的中文资料里对这个配置项只有一句"用于明确表示编译版本配置的可用",一看就是不知道哪里机翻的。所以我只能去maven的官网查询相关资料,但这个配置的官方说明也不是很多,不过在插件的使用说明里提到,需要使compilerVersion配置生效,需要将fork设为true。而compilerVersion的作用是使compiler plugin在指定的jdk版本下执行。这个配置项需要生效的话,自然需要和Maven其他插件执行不同的线程。因此按我的理解,fork确实是并发执行maven-compiler-plugin的选择配置项,而且我的故障也确实是由于maven的多线程运行导致的。
为啥项目中会配置了compilerVersion和fork呢?因为项目是在jdk1.8的环境下开发的,但CI环境中只有一个jdk1.7的镜像。同事当时懒的重新做一个jdk1.8的的镜像,直接在镜像里进行编译又会失败,因此加了compilerVersion这个配置项使CI能正常运行。但其实后面已经做好了jdk1.8的镜像了,因此这两个配置已经没有作用了,但CI过程一直也都正常,所以也就没人注意到了。。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值