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

Gradle多模块项目JaCoCo聚合代码覆盖率报告生成问题求助

解决Gradle 7.3多模块项目Jacoco聚合覆盖率报告问题

我完全理解你在Gradle多模块项目里生成类似Maven jacoco:aggregate-report效果时遇到的麻烦——之前的代码片段报错,核心原因是Gradle 7.x版本对JacocoReport任务的API做了调整,additionalSourceDirs变成了只读属性,不能直接赋值,这就是你看到GroovyRuntimeException的根源。

下面是适配Gradle 7.3的完整解决方案,一步步帮你生成聚合覆盖率报告:

1. 根项目统一配置Jacoco(确保子项目生成执行数据)

首先在根项目的build.gradle中添加基础配置,确保所有子项目都能生成Jacoco执行数据(.exec文件):

plugins {
    id 'jacoco'
}

// 给所有子项目应用Jacoco插件,统一配置
subprojects {
    apply plugin: 'jacoco'

    // 指定Jacoco工具版本,和Gradle 7.3兼容的稳定版本推荐0.8.7
    jacoco {
        toolVersion = "0.8.7"
    }

    // 确保测试任务完成后,自动生成子项目的Jacoco报告(主要是生成.exec执行数据)
    test {
        finalizedBy jacocoTestReport
    }
}

2. 定义聚合报告任务

接着在根项目的build.gradle中添加聚合任务,替换你之前报错的代码:

// 生成跨所有子项目的聚合Jacoco覆盖率报告
task jacocoAggregateReport(type: JacocoReport) {
    // 依赖所有子项目的test任务,保证先执行完所有测试
    dependsOn subprojects.test

    // 配置聚合所需的源码目录:收集所有子项目的主源码
    sourceDirectories.set(files(subprojects.sourceSets.main.allSource.srcDirs))
    // 配置聚合所需的类文件目录:收集所有子项目编译后的主类文件
    classDirectories.set(files(subprojects.sourceSets.main.output))
    // 配置聚合所需的执行数据:收集所有子项目的Jacoco执行数据文件
    executionData.set(files(subprojects.jacocoTestReport.executionData))

    // 可选:过滤掉不需要统计覆盖率的类(比如自动生成的配置类、测试类等)
    classDirectories.setFrom(classDirectories.files.collect { file ->
        fileTree(dir: file, exclude: [
            '**/BuildConfig.class',
            '**/R.class',
            '**/R$*.class',
            '**/*Test*.class',
            '**/*Mock*.class'
        ])
    })

    // 确保只使用存在的执行数据,避免因某些子项目没生成.exec文件而报错
    doFirst {
        executionData.set(files(executionData.findAll { it.exists() }))
    }

    // 配置报告格式:开启HTML报告,关闭XML/CSV(按需调整)
    reports {
        html.required = true  // Gradle 7+用required替代旧版的enabled
        xml.required = false
        csv.required = false
    }

    // 可选:自定义报告输出目录(默认在build/reports/jacoco/jacocoAggregateReport/html)
    reports.html.outputLocation = layout.buildDirectory.dir('reports/jacoco/aggregate/html')
}

3. 执行任务生成报告

在项目根目录执行以下命令:

./gradlew jacocoAggregateReport

执行完成后,你可以在根项目的build/reports/jacoco/aggregate/html目录下找到生成的HTML报告,打开index.html就能看到所有子项目的聚合覆盖率数据了。

关键注意事项

  • 如果有部分子项目不需要统计覆盖率,可以在筛选子项目时排除,比如把subprojects改成subprojects.findAll { it.name != 'ignore-me-project' }
  • 确保所有子项目都有sourceSets.main配置(Java/Kotlin/Groovy项目默认都会有,无需额外配置)
  • 若遇到执行数据找不到的情况,先单独执行某个子项目的test任务,确认build/jacoco/test.exec文件生成正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:55:32