2回目以降のCheckstyle実行結果を見る方法

f:id:excite-takayuki-miura:20220405130322p:plain

こんにちは。 エキサイト株式会社の三浦です。

皆さんは、Checkstyleを使っていますか?

Javaのコードが指定したコード規約に即しているかをチェックしてくれるツールで、これによってコードの品質を保つことができます。

Gradleからタスクを実行したりして違反が無いかを確認できるのですが、実際に使ってみて、初見だと少しハマりそうな部分があったので、その部分について書いていこうと思います。

Checkstyleとは

Checkstyleは、Javaがコード規約に即しているかをチェックしてくれるツールです。

公式では以下のように説明されています。

Checkstyle is a development tool to help programmers write Java code that adheres to a coding standard. It automates the process of checking Java code to spare humans of this boring (but important) task. This makes it ideal for projects that want to enforce a coding standard.

人の目でわざわざチェックしていくのが面倒で、しかもプログラマチックに解決できるコード規約周りのチェックをしてくれるので、簡単にコードの品質を保つことができるようになります。

Gradleであれば、以下のように設定できます。

build.gradle

plugins {
    // ...
    id 'checkstyle'
    // ...
}

// 今回はマルチプロジェクト構成なので、 `subprojects` に細かい設定を追記
subprojects {
    apply plugin: 'checkstyle'

    checkstyle {
        configFile = rootProject.file("path/to/xxx.xml") // ここに、使用したいコード規約の設定をXML形式で作る
        toolVersion = "10.0"
        sourceSets = [project.sourceSets.main]
    }

    // ...
}

この設定をすれば checkstyleMain というGradleタスクが使えるようになるので、後はそれを実行すればチェックしてくれるようになります。

f:id:excite-takayuki-miura:20220404170517p:plain

とても簡単で非常に便利なのですが、全くコードを変更せずにもう一回実行すると、以下のような表示になってしまいます。

f:id:excite-takayuki-miura:20220404170638p:plain

先程まで出ていたはずのWarningが全く出てこなくなってしまいました。 これはどういうことなのでしょうか?

2回目以降のCheckstyle実行

実はGradleには、入出力の結果が全く同じ場合、タスクを実行せずにスキップするという機能があります。 2回目の実行時に UP-TO-DATE という文字列が出ていますが、これはスキップされたことを表しているのです。

つまり、一度 checkstyleMain を実行してしまうと、コードを変更しない限りもう一度コマンドライン上からWarningを確認することができないのです。 当然ですが、1回目しか確認できないのは大きな問題です。

ではどうすれば良いかというと、実は checkstyleMain を実行すると、その結果をHTMLファイルとして以下のパスに出力してくれます。

build/reports/checkstyle/main.html

ブラウザで開くと以下のようになっているので、これを見れば良いというわけです。

f:id:excite-takayuki-miura:20220404171246p:plain

f:id:excite-takayuki-miura:20220404171332p:plain

ページ内リンク等も適切に貼られているので、慣れてしまえば特にストレスなく確認できるでしょう。

まとめ

知ってしまえば簡単なことですが、初めてCheckstyleを触ると「さっきまで出ていたはずのWarningがなくなった…?」と混乱してしまうこともあると思います。

ぜひこの情報を参考にしてもらえれば幸いです。