我正在开始一个新项目,我需要使用SonarQube
,我想使用Lombok
,我已经在Eclipse中配置了它,除静态分析外,一切正常。
@Data
课程时,所有字段都会报告为Unused private field
。@Getter(lazy=true)
:当我使用此注释时,我会Redundant nullcheck of value known to be non-null
看到@Getter(lazy=true)(这与已编译的代码有关)。我认为可能的解决方案是delombok
项目,编译并运行Sonar。
SonarQube Jira
中的类似问题:
(@SuppressWarnings("PMD.UnusedPrivateField")
解决方案不适用于最新SonarQube 4.2
)
我该如何解决这个问题?
答案 0 :(得分:7)
作为一种解决方法,我现在让声纳对delombok生成的代码进行分析。
我想这也不是一个完美的解决方案,因为我正在分析生成的代码而不是实际由开发人员编写的代码。我发现它比使用@SuppressWarnings, //NOSONAR
或关闭Sonar本身的规则更好。
请参阅下面的示例以在Maven中实现此目的。将其添加到您的pom.xml:
<properties>
...
<!-- This is exposed as a workaround to do the sonar analysis in combination with delombok -->
<src.dir>src/main/java</src.dir>
...
</properties>
...
<plugins>
...
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>${lombok-plugin.version}</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<addOutputDirectory>false</addOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
...
<profiles>
...
<profile>
<!-- we have to use this profile to analyse code with sonar until https://jira.codehaus.org/browse/MSONAR-70 is fixed ! -->
<id>sonar</id>
<properties>
<src.dir>target/generated-sources/delombok</src.dir>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>${lombok-plugin.version}</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<addOutputDirectory>true</addOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</profile>
...
</profiles>
答案 1 :(得分:4)
我添加了pull request to support more annotation from Lombok 对于二进制文件,请访问此处:
答案 2 :(得分:1)
我前段时间问了一个类似的问题: sonarqube 4.2 and lombok
基本上,你不能再在代码中使用注释(比如@SuppressWarnings)。相反,您需要在SonarQube中设置(全局)规则排除:
点击设置 - &gt;排除 - &gt;问题 并在“忽略多个标准的问题”中添加条目&#39;部分,输入类似的内容:
Rule Key Pattern File Path Pattern
squid:S1068 **/models/**/*.java
它使您的源代码更加清晰(因为您不再需要@SuppressWarnings),但我不喜欢设置全局规则的想法,因为它可能会导致其他问题。
更新
对于已知为非空的值的冗余nullcheck&#39;,您可以添加如下内容:
Rule Key Pattern File Path Pattern
findbugs:RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE **/xxxxx.java
另一个可能(或可能不)对你有用的人:
Rule Key Pattern File Path Pattern
common-java:InsufficientBranchCoverage **/models/**/*.java
答案 3 :(得分:0)
对于多模块项目,基于finrod的答案,我必须在我的声纳配置文件中添加以下属性以避免重复违规(Sonar正在分析src / main / java和target / generated-sources / delombok)
<properties>
<!-- Sonar will analyze the delombokized version of the code -->
<sonar.exclusions>src/main/java/**/*</sonar.exclusions>
</properties>