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

如何在Gradle 4.6多模块项目中聚合SonarQube报告?

在Gradle 4.6多模块项目中聚合SonarQube与Jacoco报告的方案

我来帮你搞定这个多模块项目的Sonar报告聚合问题,结合你当前的Gradle 4.6和SonarQube 7环境,咱们一步步来:

核心思路

多模块项目的Sonar聚合需要根项目统一触发全量分析,同时要生成一个全局聚合的Jacoco测试报告——因为默认每个子项目只会生成自己的覆盖率报告,Sonar需要读取合并后的报告才能展示整体覆盖率。


1. 根项目的配置调整(关键)

把SonarQube和Jacoco的核心配置放在根项目的build.gradle中,让所有子项目继承基础规则,同时添加聚合逻辑:

// 根项目build.gradle
buildscript {
    dependencies {
        // 适配Gradle 4.6和SonarQube 7的插件版本
        classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.2'
        classpath 'org.jacoco:org.jacoco.core:0.7.9'
    }
}

// 给所有子项目统一配置Jacoco和Sonar基础规则
subprojects {
    apply plugin: 'jacoco'
    apply plugin: 'org.sonarqube'

    jacoco {
        toolVersion = "0.7.9"
    }

    test {
        jacoco {
            enabled = true
            // 固定子项目的测试执行文件路径,方便后续聚合
            destinationFile = file("$buildDir/jacoco/test.exec")
        }
    }

    jacocoTestReport {
        group = "Reporting"
        reports {
            xml.enabled true
            xml.destination "${buildDir}/reports/jacoco/report.xml"
            csv.enabled false
            html.enabled true
        }
    }

    // 子项目的Sonar局部配置,确保每个模块有唯一标识
    sonarqube {
        properties {
            property "sonar.moduleKey", "${rootProject.name}:${project.name}"
            property "sonar.sources", "src/main/java"
            property "sonar.tests", "src/test/java"
            property "sonar.jacoco.reportPaths", "${project.buildDir}/jacoco/test.exec"
        }
    }
}

// 根项目的全局Sonar配置,作为聚合入口
apply plugin: 'org.sonarqube'
sonarqube {
    properties {
        property 'sonar.host.url', sonarHostUrl
        property 'sonar.projectKey', rootProject.name
        property 'sonar.projectName', rootProject.name
        property 'sonar.projectVersion', rootProject.version
        // 指定Sonar读取根项目生成的聚合Jacoco报告
        property 'sonar.jacoco.reportPaths', "${rootProject.buildDir}/jacoco/allTests.exec"
    }
}

// 新增聚合Jacoco报告的任务,收集所有子项目的测试数据
task jacocoRootReport(type: JacocoReport) {
    group = "Reporting"
    description = "生成所有子项目的聚合Jacoco覆盖率报告"

    // 收集所有子项目的test.exec文件
    executionData fileTree(rootDir.absolutePath).include("**/build/jacoco/test.exec")

    // 关联所有子项目的源码和测试代码
    subprojects.each { subproject ->
        sourceSets subproject.sourceSets.main
    }

    reports {
        xml.enabled true
        xml.destination "${rootProject.buildDir}/reports/jacoco/aggregate.xml"
        csv.enabled false
        html.enabled true
        html.destination "${rootProject.buildDir}/reports/jacoco/aggregateHtml"
    }
}

// 确保先生成聚合报告,再执行Sonar分析
sonarqube.dependsOn jacocoRootReport

2. 子项目的简化配置

子项目的build.gradle不需要重复写插件和基础配置,只需要根据自身业务调整特殊属性(比如非标准的源码路径)即可,大部分规则会自动继承根项目的subprojects块配置。

3. 执行分析的命令

在根项目目录下运行以下命令,就能完成全量测试、聚合覆盖率报告、提交Sonar分析的全流程:

./gradlew clean test jacocoRootReport sonarqube

关键注意事项

  • 插件版本兼容性:选用的sonarqube-gradle-plugin:2.6.2是经过验证的、适配Gradle 4.6和SonarQube 7的稳定版本,不要随意升级,避免出现兼容性问题。
  • 路径一致性:确保所有子项目的test.exec路径统一,不然根项目的聚合任务无法收集到数据。
  • 模块唯一性:每个子项目的sonar.moduleKey必须唯一,这样Sonar才能正确识别各个子模块的独立数据。

内容的提问来源于stack exchange,提问作者Dmitry Senkovich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:18:20