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

Gradle项目中SonarQube与Lombok结合的代码覆盖率问题排查

解决Gradle+SonarQube+Jacoco+Lombok @Data类的代码分析问题

我之前也碰到过几乎一模一样的场景——用Gradle构建项目,Docker本地跑SonarQube,搭配Jacoco做覆盖率统计,结果Lombok @Data生成的代码总是在Sonar分析里出问题。结合你提到的已经配置了lombok.config来给生成代码加@Lombok.Generated注解,下面给你整理几个必查的点和解决方案:

1. 先确认lombok.config的配置是否正确生效

首先得确保你的lombok.config放在了正确的位置(项目根目录,或者对应模块的根目录),而且配置内容没写错:

lombok.addLombokGeneratedAnnotation = true

这个配置是全局开启,让Lombok给所有自动生成的代码(getter、setter、toString、equals/hashCode这些)都加上@Lombok.Generated注解。这里要注意:这个注解是Lombok自己的,不是JDK原生的javax.annotation.Generated,所以SonarQube默认不会识别它,得额外配置。

2. 给SonarQube配置,让它识别Lombok的@Generated注解

在你的Gradle构建脚本里,针对sonarqube任务添加配置,告诉Sonar把带@Lombok.Generated的代码当成生成代码,排除在质量检查和覆盖率统计之外:

如果你用Groovy DSL(build.gradle)

sonarqube {
    properties {
        // 可选:如果有其他生成代码目录,先排除
        property 'sonar.java.exclusions', '**/generated/**'
        // 指定Lombok的Generated注解,让Sonar识别生成代码
        property 'sonar.java.annotations', 'lombok.Generated'
        // 或者更明确地标记生成代码的规则
        property 'sonar.java.generatedCode', '**/*.java', 'Lombok.Generated'
    }
}

如果你用Kotlin DSL(build.gradle.kts)

sonarqube {
    properties {
        setProperty("sonar.java.exclusions", "**/generated/**")
        setProperty("sonar.java.annotations", "lombok.Generated")
        setProperty("sonar.java.generatedCode", "**/*.java", "Lombok.Generated")
    }
}

这一步是核心——让SonarQube知道,带有lombok.Generated注解的代码是自动生成的,不需要做质量检查和覆盖率统计。

3. 调整Jacoco配置,排除生成代码的覆盖率统计

有时候Jacoco会把Lombok生成的代码也算进覆盖率里,导致Sonar显示的覆盖率数据不准。你可以在Jacoco的测试报告配置里排除这些代码:

Groovy DSL

jacocoTestReport {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [
                // 排除带有Generated注解的类/方法对应的class文件
                '**/*Generated*',
                // 保险起见,也可以直接排除Lombok相关的生成内容
                '**/lombok/**'
            ])
        }))
    }
}

Kotlin DSL

jacocoTestReport {
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.map {
            fileTree(it) {
                exclude(
                    "**/*Generated*",
                    "**/lombok/**"
                )
            }
        }))
    }
}

这样Jacoco就不会统计Lombok生成代码的覆盖率,传给SonarQube的数据就准确了。

4. 检查Docker里SonarQube的服务器端配置

如果你是用Docker跑SonarQube,别忘记检查服务器端的全局配置有没有覆盖你的注解规则:

  1. 登录SonarQube的Web界面(默认是http://localhost:9000)
  2. 进入Administration > General Settings > Java > Generated Code
  3. 确认Annotations列表里已经包含了lombok.Generated

5. 清理缓存,重新构建

有时候Gradle的缓存会导致配置不生效,执行下面的命令彻底清理后重新运行Sonar分析:

./gradlew clean build jacocoTestReport sonarqube

(Windows用户换成gradlew.bat即可)

最后排查小技巧

如果还是没解决,先验证Lombok确实给生成代码加了注解:用反编译工具(比如JD-GUI)打开编译后的class文件,看看getter/setter这些方法上有没有@Lombok.Generated注解。另外,确保你的SonarQube版本是9.x以上的,旧版本可能对自定义Generated注解的支持不够好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:49:21