1からプロジェクトを立ち上げたことが無く、なんとなく先人が築き上げてくれた物の上に乗っかているため知識整理のため静的解析とフォーマットを導入してみた。よく聞くEsLintは静的解析で、Prettierがフォーマッターらしい。静的解析は品質向上のためコードエラーやコード規約を検査するもので、フォーマッターは見た目を統一するもの。役割が違うためとりあえず両方入れとく。 コード規約とフォーマットはほぼ同じ話と思われ、それぞれ別々のツールを入れるとポリシー差から一生お互いに修正し合う事態になりそうなためどちらもGoogle提供を使用することにした。静的解析はcheckStyle,フォーマッターはgoogle-java-formatを入れる。checkStyleそのものはGoogleが提供しているものでは無い(?)が、Googleが提供するチェック定義を使用可能なため導入することとした。

checkStyle

gradleのプラグインとして導入する。

導入

gradleのUsage通りにpluginsに足した。checkstyleは所定のディレクトリにあるcheckstyle.xmlを探しに行くため、Project layout通りにcheckstyle.xmlを作成し中身をgoogle_checks.xmlにしておいた。

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.4.1'
	id 'io.spring.dependency-management' version '1.1.7'
	id 'checkstyle'
}

check!

無事失敗。無念。

% ./gradlew check

* What went wrong:
Execution failed for task ':checkstyleTest'.
> A failure occurred while executing org.gradle.api.plugins.quality.internal.CheckstyleAction
   > An unexpected error occurred configuring and executing Checkstyle.
      > Unable to create Root Module: config {/Users/xxxx/Documents/programing/practice_java_spring_controller/config/checkstyle/checkstyle.xml}, classpath {null}.

エラー解消

エラーでググるとGradleでCheckStyleを利用するがヒットする。スタックトレースでエラーの詳細を調べて解決していたので、とりあえず真似する。(参考にさせていただいた上記ブログではcheckStyleのバージョンが古いため失敗していたらしい。同じ香りしかしない。。)スタックトレースでエラー箇所を確認してみる。

% ./gradlew check --stacktrace

Caused by: com.puppycrawl.tools.checkstyle.api.CheckstyleException: cannot initialize module SuppressWithNearbyTextFilter - 'SuppressWithNearbyTextFilter' クラスをインスタンス化できませんでした。また、以下のクラス名でもインスタンス化できませんでした .SuppressWithNearbyTextFilter, SuppressWithNearbyTextFilterCheck, .SuppressWithNearbyTextFilterCheck 。 クラス名を正規名で指定しているか再確認してください。または、単純名の使用を設定する方法 https://checkstyle.org/config.html#Packages をお読みください。 また、Checker に渡されているクラスローダが正しく設定されているか再確認してください。
        at com.puppycrawl.tools.checkstyle.Checker.setupChild(Checker.java:473)
        at com.puppycrawl.tools.checkstyle.api.AutomaticBean.configure(AutomaticBean.java:201)
        at com.puppycrawl.tools.checkstyle.ant.CheckstyleAntTask.createRootModule(CheckstyleAntTask.java:424)
        ... 52 more

ついでにデフォルトで使用されているcheckstyleのversionも見ておく(9.3古そうだ。。)

% ./gradlew dependencies | grep checkstyle
checkstyle - The Checkstyle libraries to be used for this project.
\--- com.puppycrawl.tools:checkstyle:9.3

問題のsuppresswithnearbytextfilter10.0.0以降なので、それは確かに使えない(参考)。 versionは下記フォーマットで指定可能。中途半端なバージョンだと別のエラーで動かなかったため、現時点での最新バージョンを指定した。

checkstyle {
	toolVersion = "10.21.1"
}

再実行

成功!

% ./gradlew check

BUILD SUCCESSFUL in 897ms
6 actionable tasks: 6 up-to-date

省略しているがエグいぐらいWARNがでてくる。手で修正するのは酷なので、google-java-formatにフォーマットしてもらう。

google-java-format

gradleでバージョン指定とかできそうだけど、フォーマットはプロジェクトで管理するものでは無く個人で使用する意味合いが強そうなのでgradle周りに追加せず、提供されているプラグインのインストールだけ対応することにした。

導入

特に無し!書いてある通りプラグインインストールとjava実行時のoption設定で完了!

フォーマット

で、どうやってフォーマットしてくれるんだ?commad lineでファイル指定すればできるみたいな説明が書いてあるが、めんどくさすぎる。。 intilljだとファイルを保存(ctr + s)でアクションをキックできるそうなので、それでフォーマットを実行することにした。Reformat codeにチェックを入れればフォーマットしてくれる。全くgoogle-java-formatを使ってる感ないけど、とりあえずフォーマット後はcheckStyleをpassするためとりあえず良しとする。