Gradle多模块项目中如何创建带参数的可复用Jacoco任务?
Gradle多模块项目中为指定子项目配置参数化Jacoco覆盖率任务
实现方案
通过在根项目封装可复用的Jacoco配置逻辑,仅在目标子项目中引入并传入自定义参数,既避免全局应用,又支持每个子项目独立设置覆盖率阈值。
1. 根项目封装通用Jacoco配置函数
在根目录的build.gradle.kts中定义一个可复用的函数,包含Jacoco的基础配置,并接收覆盖率最小值作为参数:
// 根项目 build.gradle.kts fun Project.configureJacocoCoverage(minCoverage: Double) { // 应用Jacoco插件 plugins.apply("jacoco") // 配置Test任务关联Jacoco tasks.withType<Test> { jacoco.includeNoLocationClasses = true jacoco.excludes = listOf("jdk.internal.*") } // 配置覆盖率验证规则 tasks.jacocoTestCoverageVerification { violationRules { rule { limit { minimum = minCoverage.toBigDecimal() } } } // 可选:排除不需要统计的类(如启动类、配置类) afterEvaluate { classDirectories.setFrom(files(classDirectories.files.map { fileTree(it) { exclude("**/*Application.class", "**/*Configuration.class") } })) } } // 创建组合任务:先执行测试,再验证覆盖率 val checkCoverage by tasks.registering { dependsOn(tasks.test, tasks.jacocoTestCoverageVerification) group = "verification" description = "执行测试并验证覆盖率达标" } }
2. 目标子项目引入并自定义参数
分别在child2、child3、child4的build.gradle.kts中调用上述函数,传入各自的覆盖率最小值:
child2/build.gradle.kts
// 要求80%的覆盖率 configureJacocoCoverage(0.8)
child3/build.gradle.kts
// 要求75%的覆盖率 configureJacocoCoverage(0.75)
child4/build.gradle.kts
// 要求90%的覆盖率 configureJacocoCoverage(0.9)
3. 任务运行方式
- 单独验证某个子项目:
./gradlew child2:checkCoverage - 批量验证所有目标子项目:
./gradlew child2:checkCoverage child3:checkCoverage child4:checkCoverage - 可选:在根项目创建聚合任务,一键运行所有验证
在根项目build.gradle.kts中添加:
val checkAllCoverage by tasks.registering { dependsOn(":child2:checkCoverage", ":child3:checkCoverage", ":child4:checkCoverage") group = "verification" description = "批量验证所有目标子项目的覆盖率" }
运行命令:./gradlew checkAllCoverage
注意事项
- 确保目标子项目已应用Java/Kotlin插件(如
java或org.jetbrains.kotlin.jvm),否则Test任务无法生成Jacoco数据。 - 可根据需求扩展
configureJacocoCoverage函数,增加更多参数(如自定义排除类列表、多规则验证等)。
内容的提问来源于stack exchange,提问作者darth jemico
相关产品推荐
相关产品推荐

