【Java環境構築】VSCode で静的解析ツールを導入する

[【Java 環境構築】Windows+Scoop+VSCode で開発環境を構築する](https://qiita.com/nimzo6689/items/72898eb9dc3896a41269) の続き的な記事です。

VSCode で Java の静的解析をするために SonarQube for IDE[^1] と checkstyle を導入してみます。

だいたいは公式に沿う形で書いていて、細かい補足を所々入れています。

https://code.visualstudio.com/docs/java/java-linting#_checkstyle

[^1]: 以前は、SonarLint という名前でした

# SonarQube for IDE

SonarQube はこちらの拡張機能をインストールすると、設定不要ですぐに使えます。

https://marketplace.visualstudio.com/items?itemName=SonarSource.sonarlint-vscode

SonarQube サーバーとは違い、軽量版の静的解析ツールとして機能するのが前提のため、レポート機能だったり、SonarQube Plugin を用いた解析などはできません。

## 基本的な使い方

インストールすると、すぐに警告が出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/8a67344b-eec4-e0a4-4a96-f00e2c75c536.png)

「`System.out` ではなくて、 Logger で出力しましょう」という警告です。
波線のところにマウスポインタをホバーすると上のスクショのように詳細が表示されます。

`View Problem (Alt+F8)` をすると、左に水色の丸ボタンが出てくるので、そこから次のアクション候補が選べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/b51e321e-4006-b4dd-5d27-a7bdd366dc79.png)

Quick Fix の `SonarQube: Show issue details ...` を選ぶと VSCode 内で解説ページが表示されます。これは便利！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/c2dd1527-3d79-cd43-3613-fe8362733f22.png)

## 指摘箇所の一覧

SonarQube から指摘を受けている箇所については、ステータスバーの右側のアイコンで指摘件数を把握できます。また、`PROBLEMS` タブで一覧表示され、クリックで指摘箇所に移動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/88371ce1-b754-5e08-ecb0-4615961eceff.png)

## ルール一覧

ルールの一覧も VSCode 内で確認可能です。
`コマンドパレット（F1）`にて `Show: SonarQube View` をすると、以下のようにルールが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/59ecb179-7d8d-bb8d-dec5-60c0d6e8a393.png)

## ルールのカスタマイズ

コード上の指摘を受けている波線にて、Quick Fix から`SonarQube: Deactivate rule ...` を選ぶと、ローカル環境の VSCode の `settings.json` にこのルールを無視する設定が追加されます。

```javascript:~/AppData/Roaming/Code/User/settings.json
{
  "sonarlint.rules": {
    "java:S106": {
      "level": "off"
    }
  }
}
```

ただ、この設定への追加ですが、グローバルの `settings.json` にしか反映することができず、プロジェクトのルートパス配下の `.vscode/settings.json` へは記載できません。（記載しても無視されます）
そのため、複数の Java プロジェクトの開発をしていて、かつ、SonarQube のルール設定が違う場合は、最大公約数的な設定値をとりあえず含めておく、みたいな使い方になると思います。
可能であれば、`sonarlint.connectedMode.connections.sonarqube` にて CI などで利用している SonarQube サーバーと接続してルール設定の共有ができるので、それをするのがおススメです。

# Checkstyle for Java

続いて Checkstyle for Java を試していきます。

https://marketplace.visualstudio.com/items?itemName=shengchen.vscode-checkstyle

checkstyle は SonarQube の指摘範囲と多少重複するところはありますが、得意範囲は違っているため、併用することで相互補完的に機能することが見込めます。

ただ SonarQube を有効にした状態で Checkstyle for Java をインストールした場合、そのままですと checkstyle の警告がエディタ上で確認できないようです。 VSCode を再起動すればすぐ直りました。

## 基本的な使い方

checkstyle は先にルールの設定ファイルを用意する必要があります。
設定ファイルは [Google's Check](https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml) や [Sun's Check](https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/sun_checks.xml) が checktyle の公式から提供されているため、このどちらかを使うことが多い印象です。

今回は Sun's Check を試しに使ってみます。
※ Google's Check はインデントが２つだけですが、 Java 界隈だと４つがメジャーなので。

プロジェクトのルートディレクトリ配下に `config/checkstyle/sun_checks.xml` を作成し、 [GitHub](https://raw.githubusercontent.com/checkstyle/checkstyle/refs/heads/master/src/main/resources/sun_checks.xml) から中身をコピーします。その後、 `.vscode/settings.json` にて以下の設定を追加してください。（公式ドキュメントには xml を右クリックして「Set the Checkstyle Configuration File」を選択してと記載されていましたが、私の環境では有効化されていないようでした）

```diff_javascript:.vscode/settings.json
+  "java.checkstyle.configuration": "${workspaceFolder}\\config\\checkstyle\\sun_checks.xml"
```

すると、以下のように SonarQube の警告（橙）に追加する形で、checkstyle の警告（赤）が増えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/c6d68756-0d35-3fd2-ce8e-04667702b92f.png)

## Maven でも checkstyle の解析をする

`maven-checkstyle-plugin` を使うことで、mvn コマンドから checkstyle の解析を実行したり、ルールに違反している場合は、コンパイルエラーにしたりすることができます。

```diff_xml:pom.xml
            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <version>3.3.0</version>
+                <dependencies>
+                    <dependency>
+                        <groupId>com.puppycrawl.tools</groupId>
+                        <artifactId>checkstyle</artifactId>
+                        <version>10.12.1</version>
+                    </dependency>
+                </dependencies>
+                <configuration>
+                    <configLocation>${project.basedir}/config/checkstyle/sun_checks.xml</configLocation>
+                    <failsOnError>true</failsOnError>
+                </configuration>
+            </plugin>
        </plugins>
    </build>
```

上の設定を適用すれば、MAVEN -> demo -> Plugins -> checkstyle から checkstyle のコマンドが実行できます。check は単純な検査（下のスクショの通り）で、checkstyle は html のレポートが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/4a7c3a0c-0420-33c0-bb92-3e090d8d711e.png)

`pom.xml` の `failsOnError` を true にしているので、`mvn package` までは成功しますが、 verify や install では checkstyle の警告があれば BUILD FAILURE で終了するようにしています。