Gradle项目中SonarQube与Lombok结合的代码覆盖率问题排查
我之前也碰到过几乎一模一样的场景——用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,别忘记检查服务器端的全局配置有没有覆盖你的注解规则:
- 登录SonarQube的Web界面(默认是
http://localhost:9000) - 进入Administration > General Settings > Java > Generated Code
- 确认
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

