Gradle+SpringBoot项目Lombok注解类遭Sonar报Missing Ctor问题求解决
解决Sonar 8.9中Lombok构造函数注解被Checkstyle误报的问题
问题场景
使用Gradle 6.9、SpringBoot 2.7.0的项目,Lombok依赖配置如下:
compileOnly 'org.projectlombok:lombok:1.18.22' annotationProcessor 'org.projectlombok:lombok:1.18.22' testCompileOnly 'org.projectlombok:lombok:1.18.22' testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
通过Sonar 8.9做代码分析时,即便类添加了@NoArgsConstructor注解或标注@Entity的实体类,仍会触发Checkstyle的MissingCtorCheck规则,提示“Class should define a constructor”。已尝试配置sonar.java.libraries指向错误路径、开启lombok.addLombokGeneratedAnnotation = true均无效,且无法禁用该规则。
解决方案
1. 让Sonar读取编译后的class文件
Sonar需要分析编译后的二进制文件才能识别Lombok生成的构造函数,确保配置正确的二进制路径:
- 在
sonar-project.properties中添加:
sonar.java.binaries=build/classes/java/main sonar.java.test.binaries=build/classes/java/test
- 或者在
build.gradle的Sonar配置中加入:
sonar { properties { property "sonar.java.binaries", "build/classes/java/main" property "sonar.java.test.binaries", "build/classes/java/test" } }
2. 正确配置Sonar的Lombok依赖路径
之前配置的sonar.java.libraries路径错误,Lombok的jar不在build/resources目录下,通过Gradle自动获取正确路径:
在build.gradle中修改Sonar配置:
sonar { properties { // 获取编译用的Lombok jar路径 def lombokJar = configurations.compileOnly.resolvedConfiguration.resolvedArtifacts.find { it.moduleVersion.id.name == 'lombok' }.file.absolutePath property "sonar.java.libraries", lombokJar // 测试环境也配置 property "sonar.java.test.libraries", lombokJar } }
3. 调整Checkstyle规则,忽略特定注解的类
既然已经开启lombok.addLombokGeneratedAnnotation = true,可以让Checkstyle忽略带有@Generated或@Entity注解的类的构造函数检查:
- 如果是通过Sonar后台配置规则:找到
MissingCtorCheck规则,添加参数ignoreAnnotation,值设为lombok.Generated,javax.persistence.Entity - 如果项目有自定义的
checkstyle.xml配置文件,修改规则:
<module name="MissingCtor"> <property name="ignoreAnnotation" value="lombok.Generated,javax.persistence.Entity"/> </module>
4. 确保Sonar Java插件兼容
Sonar 8.9对应的Java插件版本应为7.x,该版本原生支持Lombok,检查Sonar后台是否已安装Java插件,且版本匹配。
内容的提问来源于stack exchange,提问作者mariya cherian
相关产品推荐
相关产品推荐

