0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コンピューターシステム株式会社Advent Calendar 2024

Day 8

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

Last updated at Posted at 2024-12-08

【Java 環境構築】Windows+Scoop+VSCode で開発環境を構築する の続き的な記事です。

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

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

SonarQube for IDE

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

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

基本的な使い方

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

image.png

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

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

image.png

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

image.png

指摘箇所の一覧

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

image.png

ルール一覧

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

image.png

ルールのカスタマイズ

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

~/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 を試していきます。

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

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

基本的な使い方

checkstyle は先にルールの設定ファイルを用意する必要があります。
設定ファイルは Google's CheckSun's Check が checktyle の公式から提供されているため、このどちらかを使うことが多い印象です。

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

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

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

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

image.png

Maven でも checkstyle の解析をする

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

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

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

  1. 以前は、SonarLint という名前でした

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?