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
相关产品推荐
相关产品推荐

