SonarQube + Lombok配置

时间:2014-07-31 13:06:27

标签: sonarqube lombok

我正在开始一个新项目,我需要使用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

我该如何解决这个问题?

4 个答案:

答案 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)

答案 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>