You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:57:21