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

Sonar中排除Lombok代码覆盖率统计无效问题求助

问题:Sonar中无法排除Lombok生成代码的覆盖率统计

我尝试在Sonar中排除Lombok生成的Getter/Setter等代码的覆盖率统计,当前build.gradle配置如下:

plugins {
//...
    id "org.sonarqube" version "4.0.0.2929"
    id 'jacoco'
}

jacocoTestReport {
    reports {
        xml.enabled true
    }
}
test.finalizedBy jacocoTestReport

//...

我已执行以下操作:

  • 在src\main\resources路径下创建lombok.config文件
  • 添加配置属性:
# 标记当前目录为配置根目录,不再向上查找
config.stopBubbling = true
# 为Lombok生成的所有代码添加@lombok.Generated注解,以便Jacoco排除覆盖率统计
lombok.addLombokGeneratedAnnotation = true
  • 在build.gradle中添加Jacoco排除配置:
jacocoTestReport {
    // ...
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: ['lombok/**'])
        }))
    }
}
  • 执行Sonar任务前清理项目:
gradlew.bat clean build test --debug sonar -Dsonar.projectKey=" + service + " -Dsonar.projectName=" + service + " -Dsonar.host.url=http://localhost:9000 -Dsonar.token=" + global_token

但执行Sonar项目分析后,Lombok生成的代码仍显示未被覆盖(如Getter/Setter方法被标记为未覆盖)。


解决方案

1. 修正Jacoco的排除规则

你当前排除的lombok/**路径是错误的,Lombok生成的代码是嵌在你自己的业务类中,而非lombok包下。正确做法是过滤带有@lombok.Generated注解的方法:

修改jacocoTestReport配置:

jacocoTestReport {
    reports {
        xml.enabled true
    }
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it) {
                exclude { file ->
                    file.name.endsWith('.class') &&
                    new XmlSlurper().parse(file).annotation.any {
                        it.attribute('name') == 'lombok.Generated'
                    }
                }
            }
        }))
    }
}

2. 直接在Sonar配置中排除

更简单的方式是在Sonar配置里直接指定要排除的类或方法,无需依赖Jacoco过滤。在build.gradle中添加sonarqube块:

sonarqube {
    properties {
        // 排除Entity、DTO、VO等常用Lombok注解类的覆盖率统计
        property 'sonar.coverage.exclusions', '**/*Entity.class,**/*DTO.class,**/*VO.class'
        // 也可以通过注解排除(需确保Lombok已添加@Generated)
        property 'sonar.java.coverage.exclusions', '**/*.*[lombok.Generated]'
        
        // 把命令行的Sonar配置移到这里更易维护
        property 'sonar.projectKey', service
        property 'sonar.projectName', service
        property 'sonar.host.url', 'http://localhost:9000'
        property 'sonar.token', global_token
    }
}

3. 确保Lombok注解生效

  • 确认lombok.config放在正确位置:项目根目录或src/main/resources下,config.stopBubbling = true会阻止向上查找其他配置文件。
  • 执行gradlew clean build重新编译,确保编译后的class文件包含@lombok.Generated注解(可以用反编译工具查看)。

4. 简化执行命令

把Sonar配置移到build.gradle后,只需执行:

gradlew clean test jacocoTestReport sonar

5. 检查版本兼容性

确保Jacoco插件版本与SonarQube兼容,SonarQube 9.x及以上建议使用Jacoco 0.8.7+:

jacoco {
    toolVersion = "0.8.10"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:17:13