新しいプロジェクトを開始していて、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
_では機能しません)
どうすればこの問題を解決できますか?
回避策として、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>
私は少し前に同様の質問をしました: 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
マルチモジュールプロジェクトの場合、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>