Spring Boot多模块项目能否用jacoco:report生成覆盖率报告及配置方法
问题解答
能否直接用mvn clean test jacoco:report生成跨模块覆盖率报告?
不能直接用该命令生成包含portal-jup-biz主代码的覆盖率报告。因为jacoco:report是单模块目标,默认只会统计执行命令所在模块的代码覆盖率——如果在根路径执行,它只会处理无业务代码的根模块;如果在portal-jup-test模块执行,只会统计portal-jup-test自身的代码,不会包含portal-jup-biz的覆盖率数据。
要让jacoco:report生成包含主代码的聚合覆盖率报告,需要通过pom配置显式关联portal-jup-biz的类文件和覆盖率数据,具体配置步骤如下:
具体配置步骤
1. 根模块(portal-jup/pom.xml)配置全局Jacoco属性与插件管理
在根pom中定义Jacoco版本、数据存储路径,并通过pluginManagement统一管理插件配置,让子模块继承:
<project> <!-- 全局属性定义 --> <properties> <jacoco.version>0.8.10</jacoco.version> <!-- 覆盖率数据文件存储目录 --> <jacoco.data.dir>${project.build.directory}/jacoco</jacoco.data.dir> </properties> <build> <pluginManagement> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>${jacoco.version}</version> <executions> <!-- 所有子模块默认执行prepare-agent,生成覆盖率数据 --> <execution> <id>default-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${jacoco.data.dir}/jacoco.exec</destFile> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> </build> </project>
2. 业务模块(portal-jup-biz/pom.xml)配置
只需继承根pom的配置即可,无需额外修改——测试时会自动生成自身的覆盖率数据文件:
<project> <parent> <groupId>你的项目GroupId</groupId> <artifactId>portal-jup</artifactId> <version>你的项目版本</version> </parent> <artifactId>portal-jup-biz</artifactId> <!-- 依赖、其他配置保持原有内容即可 --> </project>
3. 测试模块(portal-jup-test/pom.xml)配置聚合报告
在测试模块中扩展Jacoco插件,配置report目标,显式引入portal-jup-biz的类文件和覆盖率数据:
<project> <parent> <groupId>你的项目GroupId</groupId> <artifactId>portal-jup</artifactId> <version>你的项目版本</version> </parent> <artifactId>portal-jup-test</artifactId> <dependencies> <!-- 引入业务模块依赖,确保测试能调用主代码 --> <dependency> <groupId>你的项目GroupId</groupId> <artifactId>portal-jup-biz</artifactId> <version>你的项目版本</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <executions> <!-- 保留prepare-agent,生成测试模块自身的覆盖率数据 --> <execution> <id>default-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> <configuration> <destFile>${jacoco.data.dir}/jacoco-test.exec</destFile> </configuration> </execution> <!-- 配置report目标,聚合业务模块与测试模块的覆盖率 --> <execution> <id>default-report</id> <phase>test</phase> <!-- 绑定到test阶段,执行测试后自动生成报告 --> <goals> <goal>report</goal> </goals> <configuration> <!-- 指定要聚合的覆盖率数据文件 --> <dataFiles> <dataFile>${project.parent.basedir}/portal-jup-biz/${jacoco.data.dir}/jacoco.exec</dataFile> <dataFile>${jacoco.data.dir}/jacoco-test.exec</dataFile> </dataFiles> <!-- 指定要统计的类文件来源 --> <classFiles> <classFile>${project.parent.basedir}/portal-jup-biz/target/classes</classFile> <classFile>${project.build.directory}/classes</classFile> </classFiles> <!-- 报告输出路径(可选,默认是target/site/jacoco) --> <outputDirectory>${project.build.directory}/site/jacoco</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
执行命令生成报告
配置完成后,执行以下任一命令即可生成聚合覆盖率报告:
- 自动生成报告:在根路径执行
mvn clean test,测试完成后会自动生成报告,路径为portal-jup/portal-jup-test/target/site/jacoco/index.html - 单独生成报告:若已执行过测试(已有覆盖率数据文件),可在根路径执行
mvn jacoco:report,同样会生成上述路径的报告
内容的提问来源于stack exchange,提问作者Min Chen
相关产品推荐
相关产品推荐

