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
相关产品推荐
相关产品推荐

