基于apache commons-parent的项目如何生成SonarCloud所需JaCoCo XML报告?
解决多模块Maven项目(继承commons-parent)JaCoCo生成SonarCloud XML报告问题
核心问题分析
你遇到的问题根源有两个:
- apache commons-parent自带的JaCoCo插件默认只生成
.exec格式文件,不满足SonarCloud对XML报告的需求 - 误将多模块项目按单模块配置,导致覆盖率报告生成不完整
解决方案步骤
1. 在父pom.xml的pluginManagement中重写JaCoCo配置
由于commons-parent通常在<pluginManagement>中定义JaCoCo插件,你需要在父pom的同层级下覆盖配置,确保子模块继承新规则:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <!-- 可指定版本,或沿用commons-parent中的版本 --> <version>${jacoco.version}</version> <executions> <!-- 保留父项目的prepare-agent,保证生成.exec数据文件 --> <execution> <id>jacoco-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <!-- 添加report执行,生成XML(可选HTML)报告 --> <execution> <id>jacoco-report</id> <phase>test</phase> <!-- 绑定到test阶段,执行测试后自动生成报告 --> <goals> <goal>report</goal> </goals> <configuration> <formats> <format>XML</format> <!-- SonarCloud需要的格式 --> <format>HTML</format> <!-- 可选,本地查看更直观 --> </formats> <destFile>${project.build.directory}/jacoco.exec</destFile> <dataFile>${project.build.directory}/jacoco.exec</dataFile> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> </build>
2. 适配多模块项目的执行与SonarCloud扫描
- 生成报告:在项目根目录执行
mvn clean test,每个子模块会在target/site/jacoco/jacoco.xml生成各自的XML报告 - SonarCloud配置:如果SonarCloud无法自动识别报告路径,可在父pom的
<properties>中添加:<properties> <sonar.jacoco.reportPaths>${project.basedir}/**/target/site/jacoco/jacoco.xml</sonar.jacoco.reportPaths> </properties> - 完整扫描流程:执行
mvn clean test sonar:sonar,确保先生成所有模块的覆盖率报告,再提交给SonarCloud
3. 排查之前配置失效的原因
- 如果你之前直接在父pom的
<plugins>而非<pluginManagement>中配置JaCoCo,会因为commons-parent的pluginManagement优先级更高而不生效 - 单模块配置会导致只有父模块生成报告,子模块的覆盖率数据丢失,必须按多模块规则让每个子模块独立生成报告
内容的提问来源于stack exchange,提问作者Antonio Garofalo
相关产品推荐
相关产品推荐

