多模块Maven项目Jacoco配置异常:子模块报告缺失自身覆盖率
多模块Maven项目Jacoco代码覆盖率异常排查方案
项目结构
- ABC
- module1
- DEF
- module1
- module2
- module3
- pom.xml
Jacoco配置(仅DEF父pom)
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.8</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>prepare-package</phase> <goals> <goal>report-aggregate</goal> </goals> <configuration> <outputDirectory>${project.basedir}/target/reports</outputDirectory> </configuration> </execution> </executions> </plugin>
异常现象
DEF下的module1生成的覆盖率报告不包含自身代码数据,反而显示module2、module3的覆盖率;同时每个子模块都会单独生成报告。
排查与解决思路
解决模块命名冲突
DEF和ABC下都存在module1,Maven依赖解析或Jacoco的.exec执行文件可能因重名出现覆盖、混淆。建议给DEF下的module1重命名(例如def-module1),消除跨项目的模块名重复问题。调整插件配置范围
当前在DEF父pom直接配置插件,会导致所有子模块继承并执行完整插件逻辑,既生成单独报告又触发聚合操作,容易造成数据混乱。可以将基础配置放在<pluginManagement>中让子模块继承prepare-agent,仅在父模块单独绑定report-aggregate目标:<pluginManagement> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.8</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> </executions> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <executions> <execution> <id>report-aggregate</id> <phase>prepare-package</phase> <goals> <goal>report-aggregate</goal> </goals> <configuration> <outputDirectory>${project.basedir}/target/reports</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins>清理旧数据文件
执行mvn clean彻底清除各模块target目录下的.exec、编译后的.class等文件,避免旧数据干扰新的覆盖率统计,之后重新执行mvn verify生成报告。验证子模块测试执行情况
执行mvn test -pl DEF/module1查看测试日志,确认DEF的module1测试用例是否正常运行。如果测试未执行,自然不会生成对应的覆盖率数据。明确聚合报告的数据源范围
在report-aggregate的配置中指定需要聚合的模块,避免数据范围错误:<configuration> <outputDirectory>${project.basedir}/target/reports</outputDirectory> <includes> <include>**/DEF/module1/**</include> <include>**/DEF/module2/**</include> <include>**/DEF/module3/**</include> </includes> </configuration>
内容的提问来源于stack exchange,提问作者Lokesh Pandey
相关产品推荐
相关产品推荐

