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

Gradle多模块项目仅生成SonarQube Jacoco测试覆盖率报告求助

Gradle多模块项目仅上传Jacoco覆盖率报告、跳过静态代码分析解决方案

核心思路

要实现只生成覆盖率报告、跳过耗时的静态代码分析,关键是让SonarQube保留源码与覆盖率的映射关系,同时关闭所有代码质量检测类的分析任务。

可行配置方案(Gradle插件方式)

在根项目的build.gradle中添加如下配置,替代手动sonar-scanner调用:

plugins {
    id 'jacoco'
    id 'org.sonarqube' version '4.4.1.3373' // 使用兼容项目的最新版本
}

// 合并多模块Jacoco执行数据
task jacocoMerge(type: JacocoMerge) {
    executionData fileTree(project.rootDir).include("**/build/jacoco/*.exec")
    destinationFile = file("$buildDir/jacoco/jacocoMerge.exec")
}

// 生成合并后的Jacoco XML报告(SonarQube推荐格式)
task jacocoReportMerge(type: JacocoReport) {
    dependsOn jacocoMerge
    executionData jacocoMerge.destinationFile
    sourceSets = project.subprojects.collect { it.sourceSets.main }
    reports {
        xml.required = true
        xml.outputLocation = file("$buildDir/reports/jacoco/jacocoReport.xml")
    }
}

// SonarQube配置
sonarqube {
    dependsOn jacocoReportMerge // 确保先生成覆盖率报告
    properties {
        // 基础项目配置
        property 'sonar.projectKey', '你的项目Key'
        property 'sonar.projectName', '你的项目名称'
        property 'sonar.host.url', '你的SonarQube服务地址'
        
        // 保留源码路径,用于覆盖率与代码的映射
        property 'sonar.sources', project.subprojects.collect { 
            it.sourceSets.main.java.srcDirs 
        }.flatten().join(',')
        
        // 指定编译后的class文件(解决Java项目必须提供binaries的报错)
        property 'sonar.java.binaries', project.subprojects.collect { 
            "${it.buildDir}/classes/java/main" 
        }.join(',')
        
        // 关闭所有静态代码分析任务
        property 'sonar.skipDuplication', 'true' // 跳过重复代码检测
        property 'sonar.rule.all.disable', 'true' // 禁用所有代码质量规则
        property 'sonar.skipDesign', 'true' // 跳过架构设计分析
        property 'sonar.issues.mode', 'skip' // 跳过Bug、漏洞等所有问题检测
        
        // 指定合并后的Jacoco覆盖率报告
        property 'sonar.coverage.jacoco.xmlReportPaths', "$buildDir/reports/jacoco/jacocoReport.xml"
    }
}

若使用sonar-scanner CLI的修复方案

在项目根目录创建sonar-project.properties,添加以下配置:

sonar.projectKey=你的项目Key
sonar.projectName=你的项目名称
sonar.host.url=你的SonarQube服务地址

# 必须保留源码和class路径,否则覆盖率无法映射
sonar.sources=src/main/java
sonar.java.binaries=build/classes/java/main

# 关闭所有静态代码分析
sonar.skipDuplication=true
sonar.rule.all.disable=true
sonar.skipDesign=true
sonar.issues.mode=skip

# 指定Jacoco XML报告路径
sonar.coverage.jacoco.xmlReportPaths=build/reports/jacoco/jacocoReport.xml

之前尝试方案失效原因说明

  • 设置sonar.sources为空:SonarQube无法找到源码文件,导致覆盖率数据无法关联到具体代码,最终无有效报告。
  • 设置sonar.exclusions='**':排除了所有文件(包括源码和class文件),覆盖率失去映射基础,自然无法生成有效数据。
  • 设置sonar.issue.ignore.allfiles=true:该属性需要配合具体的规则忽略条目使用,单独设置会因缺少关联规则而报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:55:01