jacoco:report-aggregate属性"需执行Maven项目"含义解析
关于JaCoCo
report-aggregate 目标的疑问解答 文档表述的实际含义
文档里的“需要执行Maven项目”属于模糊表述,实际意思是:必须在同一次Maven执行会话中,完成单元测试与jacoco:report-aggregate目标的执行,或者说要让聚合目标运行在包含测试执行的完整Maven生命周期上下文中。
你遇到问题的原因
JaCoCo的测试覆盖数据(以.exec文件形式存储)是单元测试执行过程中生成的文件。report-aggregate目标需要读取这些文件来生成聚合报告:
- 当你分开执行模块A、B的测试,再单独执行模块C的聚合命令时,第二次Maven会话无法关联到之前测试生成的覆盖数据(默认情况下,
.exec文件可能仅存在于单次会话的临时路径,或聚合模块未配置读取其他模块的存储路径),导致无法读取有效数据,最终生成空报告或0%覆盖率的结果。 - 只有当测试与聚合在同一次命令中执行时,Maven会话会保留所有模块的上下文信息,
report-aggregate能正确找到并读取各模块的覆盖数据。
解决方法
- 单次命令执行:在项目根目录执行包含测试和聚合的完整命令,比如:
mvn clean test jacoco:report-aggregate - 配置统一的覆盖数据存储路径:在所有模块的JaCoCo插件配置中,指定统一的
.exec文件存储路径(比如项目根目录下的target/jacoco),然后在聚合模块的report-aggregate配置中,指定读取该路径下的所有.exec文件。示例配置片段:
配置完成后,先执行所有模块的测试命令,再执行聚合模块的<!-- 子模块JaCoCo配置 --> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.10</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${project.root.dir}/target/jacoco/jacoco.exec</destFile> </configuration> </execution> </executions> </plugin> <!-- 聚合模块report-aggregate配置 --> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.10</version> <executions> <execution> <id>report-aggregate</id> <phase>verify</phase> <goals> <goal>report-aggregate</goal> </goals> <configuration> <dataFileIncludes> <dataFileInclude>${project.root.dir}/target/jacoco/*.exec</dataFileInclude> </dataFileIncludes> <outputDirectory>${project.reporting.outputDirectory}/jacoco-aggregate</outputDirectory> </configuration> </execution> </executions> </plugin>verify或jacoco:report-aggregate命令,就能正确生成报告。
内容的提问来源于stack exchange,提问作者Nishi
相关产品推荐
相关产品推荐

