web-dev-qa-db-ja.com

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_では機能しません)

どうすればこの問題を解決できますか?

10
Arturo Volpe

回避策として、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>
7
finrod
4
liudongmiao

私は少し前に同様の質問をしました: sonarqube 4.2とlombok

基本的に、コード内のアノテーション(@SuppressWarningsなど)を使用してそれを行うことはできなくなりました。代わりに、SonarQubeで(グローバル)ルール除外を設定する必要があります。

[設定]-> [除外]-> [問題]をクリックし、[複数の基準で問題を無視する]セクションにエントリを追加して、次のように入力します。

Rule Key Pattern  File Path Pattern
squid:S1068       **/models/**/*.Java

ソースコードが少しすっきりしますが(@SuppressWarningsはもう必要ないので)、他の問題を引き起こす可能性があるため、グローバルルールを設定するというアイデアは好きではありません。


更新:

「null以外であることがわかっている値の冗長nullcheck」の場合、次のようなものを追加できます。

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 
1
su-

マルチモジュールプロジェクトの場合、finrodの回答に記載されている内容に基づいて、違反が重複しないように、ソナープロファイルに以下のプロパティを追加する必要がありました(ソナーはsrc/main/Javaとtarget/generate-sources/delombokの両方を分析していました)

<properties>

    <!-- Sonar will analyze the delombokized version of the code -->
    <sonar.exclusions>src/main/Java/**/*</sonar.exclusions>

</properties>
0
Vincent F