1. 概要

ビルド中に、さまざまなツールを使用してソースコードの品質を報告できます。 そのようなツールの1つがSonarQubeで、静的コード分析を実行します。

返される結果に同意できない場合があります。 したがって、SonarQubeによって誤ってフラグが付けられたコードを除外したい場合があります。

この短いチュートリアルでは、Sonarチェックを無効にする方法を見ていきます。 SonarQubeのサーバーでルールセットを変更することは可能ですが、ここでは、ソースコード内の個々のチェックとプロジェクトの構成を制御する方法にのみ焦点を当てます。

2. 違反の例

例を見てみましょう:

public void printStringToConsoleWithDate(String str) {
    System.out.println(LocalDateTime.now().toString() + " " + str);
}

デフォルトでは、SonarQubeは、 java:S106ルール違反が原因で、このコードをコードの臭いとして報告します。

ただし、この特定のクラスについて、System.outを使用したロギングが有効であると判断したと想像してみてください。 たぶん、これはコンテナで実行される軽量のユーティリティであり、stdoutにログを記録するためだけにロギングライブラリ全体を必要としません。

SonarQubeユーザーインターフェース内で違反を誤検知としてマークすることも可能であることに注意する必要があります。 ただし、コードが複数のサーバーで分析された場合、またはリファクタリング後に行が別のクラスに移動した場合は、違反が再度表示されます。

ソースコードリポジトリ内で除外を行い、それらが持続するようにしたい場合があります。

それでは、プロジェクトを構成することで、このコードをSonarQubeレポートから除外する方法を見てみましょう。

3. // NOSONARを使用

// NOSONARを最後に置くことで1行のコードを無効にすることができます

System.out.println(
  LocalDateTime.now()
    .toString() + " " + str); //NOSONAR lightweight logging

行末の//NOSONAR タグは、発生する可能性のあるすべての問題を抑制します。 このアプローチは、SonarQubeでサポートされているほとんどの言語で機能します。

NOSONAR の後に、チェックを無効にした理由を説明するコメントを追加することもできます。

先に進んで、チェックを無効にするJava固有の方法を見てみましょう。

4. @SuppressWarningsを使用する

4.1. コードに注釈を付ける

Javaでは、組み込みの@SuppressWarningsアノテーションを使用してSonarチェックを除外できます。

関数に注釈を付けることができます。

@SuppressWarnings("java:S106")
public void printStringToConsoleWithDate(String str) {
    System.out.println(LocalDateTime.now().toString() + " " + str);
}

これは、コンパイラの警告を抑制するのとまったく同じように機能します。 ルール識別子(この場合は java:S106 )を指定するだけです。

4.2. 識別子を取得する方法

SonarQubeユーザーインターフェースを使用してルール識別子を取得できます。 違反を確認しているときに、これが問題になるのはなぜですか?をクリックできます。

それは私たちに定義を示しています。 これから、右上隅にルール識別子を見つけることができます。

5. sonar-project.propertiesの使用

分析プロパティを使用して、sonar-project.propertiesファイルで除外ルールを定義することもできます。

sonar-project.propertiesファイルを定義してリソースディレクトリに追加しましょう。

sonar.issue.ignore.multicriteria=e1

sonar.issue.ignore.multicriteria.e1.ruleKey=java:S106
sonar.issue.ignore.multicriteria.e1.resourceKey=**/SonarExclude.java

e1という名前の最初の多基準を宣言しました。  SonarExcludeクラスのjava:S106ルールを除外しました。 私たちの定義では、の前にあるruleKeyおよびresourceKeyプロパティで、ルール識別子とファイルマッチングパターンをそれぞれ使用して除外を混合できます。 e1ネームタグ。

このアプローチを使用すると、複数のファイルにまたがる特定のルールを除外する複雑な構成を構築できます。

sonar.issue.ignore.multicriteria=e1,e2

# Console usage - ignore a single class
sonar.issue.ignore.multicriteria.e1.ruleKey=java:S106
sonar.issue.ignore.multicriteria.e1.resourceKey=**/SonarExclude.java
# Too many parameters - ignore the whole package
sonar.issue.ignore.multicriteria.e2.ruleKey=java:S107
sonar.issue.ignore.multicriteria.e2.resourceKey=com/baeldung/sonar/*.java

多基準のサブセットを定義しました。 2番目の定義を追加して構成を拡張し、e2という名前を付けました。 次に、両方のルールを1つのサブセットに結合し、名前をコンマで区切ります。

6. Mavenの使用を無効にする

すべての分析プロパティは、Mavenプロパティを使用して適用することもできます。 同様のメカニズムがGradleでも利用できます。

6.1. Mavenの多基準

例に戻って、pom.xmlを変更してみましょう。

<properties>
    <sonar.issue.ignore.multicriteria>e1</sonar.issue.ignore.multicriteria>
    <sonar.issue.ignore.multicriteria.e1.ruleKey>java:S106</sonar.issue.ignore.multicriteria.e1.ruleKey>
    <sonar.issue.ignore.multicriteria.e1.resourceKey>
      **/SonarExclude.java
    </sonar.issue.ignore.multicriteria.e1.resourceKey>
</properties>

この構成は、sonar-project.propertiesファイルで使用された場合とまったく同じように機能します。

6.2. 焦点を絞る

分析されたプロジェクトには、除外したい生成されたコードが含まれている場合があり、SonarQubeチェックのフォーカスを絞り込みます。

pom.xmlsonar.exclusionsを定義して、クラスを除外しましょう。

<properties>
    <sonar.exclusions>**/SonarExclude.java</sonar.exclusions>
</properties>

その場合、名前で1つのファイルを除外しました。 チェックは、1つを除くすべてのファイルに対して実行されます。

ファイルマッチングパターンを使用することもできます。 次のように定義して、パッケージ全体を除外しましょう。

<properties>
    <sonar.exclusions>com/baeldung/sonar/*.java</sonar.exclusions>
</properties>

一方、 sonar.inclusions プロパティを使用すると、SonarQubeにプロジェクトのファイルの特定のサブセットの分析のみを依頼できます。

<properties>
    <sonar.inclusions>com/baeldung/sonar/*.java</sonar.inclusions>
</properties>

このスニペットは、com.baeldung.sonarパッケージのjavaファイルの分析のみを定義します。

最後に、sonar.skip値を定義することもできます。

<properties>
    <sonar.skip>true</sonar.skip>
</properties>

これにより、Mavenモジュール全体がSonarQubeチェックから除外されます。

7. 結論

この記事では、コードで特定のSonarQube分析を抑制するさまざまな方法について説明しました。

個々の行のチェックを除外することから始めました。 次に、組み込みの@SuppressWarningsアノテーションと特定のルールによる除外について説明しました。 これには、ルールの識別子を見つける必要があります。

また、分析プロパティの構成についても検討しました。 multicriteriasonar-project.propertiesファイルを試しました。

最後に、プロパティを pom.xml に移動し、フォーカスを絞り込むための他の方法を確認しました。