Lombok、Gradle、JaCoCo与Sonar代码覆盖率过滤问题排查
解决Sonar统计Lombok生成代码覆盖率的问题
我来帮你搞定这个头疼的覆盖率问题!咱们先理清楚问题出在哪,再一步步解决:
问题根源
你已经配置了lombok.addLombokGeneratedAnnotation = true,生成的代码也带了@lombok.Generated注解,但SonarJava 5.0.1和JaCoCo 0.8.0的组合可能存在两个关键问题:
- 早期版本的SonarJava默认不会自动识别
@lombok.Generated注解,所以依然会把这些生成的代码纳入覆盖率统计 - 你的JaCoCo配置里的
classDirectories路径和过滤规则有问题,导致JaCoCo没有排除这些生成代码,Sonar读取JaCoCo报告时自然会算进去
分步解决方案
1. 修正JaCoCo的Class目录配置
你原来的jacocoTestReport.doFirst里的路径写错了,而且没有做过滤。改成下面的配置,确保JaCoCo只统计业务代码,排除Lombok生成的类/方法:
jacoco { toolVersion = "0.8.0" reportsDir = file("$buildDir/reports/jacoco") } jacocoTestReport.doFirst { classDirectories = files(classDirectories.files.collect { fileTree(dir: it, exclude: [ // 排除@Builder生成的内部Builder类 '**/*$Builder.class', // 按需调整:比如排除实体类包下的所有类(如果你的实体类都用了Lombok注解) '**/model/**/*.class' ]) }) } task jacocoReport(type: JacocoReport){ sourceSets sourceSets.main executionData test, integrationTest // 同步classDirectories过滤规则,确保报告只包含业务代码 classDirectories = sourceSets.main.output.asFileTree.matching { exclude '**/*$Builder.class' exclude '**/model/**/*.class' } }
2. 配置SonarQube识别Lombok的Generated注解
SonarJava 5.0.1需要明确配置才能识别@lombok.Generated,在你的build.gradle里添加SonarQube的配置:
sonarqube { properties { // 告诉Sonar忽略带指定注解的生成代码 property 'sonar.java.generatedCodeAnnotations', 'lombok.Generated' // 保险起见,直接排除已知的生成类 property 'sonar.java.coverage.exclusions', '**/*$Builder.class, **/model/**/*.class' } }
3. 验证Lombok注解是否正确生成
先确认lombok.config放在项目根目录或者src/main/resources下,然后反编译build/classes里的class文件,检查生成的getter、builder方法上是否真的带有@lombok.Generated注解。如果没有,可能是Lombok配置没生效,你可以尝试升级Lombok版本到1.18+(确保稳定支持addLombokGeneratedAnnotation属性)。
最后验证顺序
- 先执行
./gradlew clean test jacocoReport,查看JaCoCo的HTML报告,确认生成的代码已经被排除 - 再执行Sonar扫描,检查Sonar的覆盖率报告是否不再统计这些Lombok生成的代码
内容的提问来源于stack exchange,提问作者ioreskovic
相关产品推荐
相关产品推荐

