Gradle多模块项目Sonar任务未优先执行Check任务的问题
问题分析
核心问题是根项目的check任务并未触发子项目的check任务:当根项目没有自身Java代码时,根项目的check是一个空任务,Gradle会直接标记为UP-TO-DATE,导致依赖它的sonar任务跳过了所有子项目的Test、JaCoCo报告生成流程。
另外,子项目中jacocoTestReport通过finalizedBy绑定到test任务,但finalizedBy的任务不会被check任务自动包含——check默认只包含test、validation这类标准检查任务,jacocoTestReport需要明确关联到检查流程中。
解决方案
1. 让根项目check触发所有子项目检查
在根项目build.gradle.kts中,修改check任务配置,使其依赖所有子项目的check:
tasks.check { subprojects.forEach { subproj -> dependsOn(subproj.tasks.check) } }
2. 绑定jacocoTestReport到子项目check流程
在子项目的java-common-conventions.gradle.kts中,将jacocoTestReport加入check任务的依赖链,确保检查流程包含报告生成:
tasks.check { dependsOn(tasks.jacocoTestReport) } tasks.named<Test>("test") { dependsOn(tasks.javadoc) useJUnitPlatform() // 保留finalizedBy确保测试失败时也能生成报告(可选) finalizedBy(tasks.jacocoTestReport) } tasks.jacocoTestReport { dependsOn(tasks.test) reports { xml.required.set(true) } }
3. 可选:明确Sonar的JaCoCo报告路径
如果Sonar仍无法自动识别子项目报告,在根项目Sonar配置中添加路径声明:
sonar { properties { property("sonar.projectName", rootProject.name) property("sonar.host.url", project.property("sonar.host.url").toString()) property("sonar.projectKey", project.property("sonar.projectKey").toString()) property("sonar.token", project.property("sonar.token").toString()) // 为每个子项目指定JaCoCo XML报告路径 subprojects.forEach { subproj -> val reportPath = "${subproj.buildDir}/reports/jacoco/test/jacocoTestReport.xml" property("sonar.${subproj.name}.jacoco.reportPaths", reportPath) } } }
验证执行
运行命令:./gradlew clean sonar,此时执行顺序为:
- 所有子项目:
javadoc→test→jacocoTestReport→check - 根项目
check(触发子项目检查流程) - 最终执行
sonar任务
内容的提问来源于stack exchange,提问作者Massimo Pavoni
相关产品推荐
相关产品推荐

