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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:15:28