2015年5月8日金曜日

Maven でビルド時に CheckStyle を実行する

概要

Mavenビルド時に CheckStyle を適用したいと思います
CodeStyleの目的は

  • ソースの可読性をあげる
  • 無駄なコードを排除する
  • 複数人で開発している場合に変数名やクラス名などに統一性を持たせる

などあります
ビルド時に実施することで強制的にスタイルを合わせることができるので間違いも発見しやすくなります

今回はEclipseを使って基本的な設定から独自のルール設定をする方法まで紹介したいと思います

環境

  • Windows7 64bit
  • Java 1.8.0_25
  • Maven 3.2.2
  • maven-checkstyle-plugin 2.1.5
  • Eclipse 4.4 Luna
  • Eclipse CheckStyle Plugin 6.5.0

maven-checkstyle-plugin のインストール

pom.xmlを編集します
<build> -> <plugins>配下に以下を追記することでインストール可能です

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>2.15</version>
    <executions>
        <execution>
            <phase>test</phase>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <configLocation>checkstyle.xml</configLocation>
        <encoding>UTF-8</encoding>
        <consoleOutput>true</consoleOutput>
        <failsOnError>true</failsOnError>
        <linkXRef>false</linkXRef>
    </configuration>
</plugin>

Mavenビルド時のtestフェーズでCheckstyleを実施します
<configLocation>に独自のCheckstyleルールを設定することができます
ここを指定しないとデフォルトで提供されるconfig/sun_checks.xmlというルールが適用されます
それを使っても問題ないのですが、ルールが結構厳しいので今回はもう少し緩めのルールを使いたいと思います

checkstyle.xmlを作成する

その緩めのルールを作成したいと思います
ルールはデフォルトで用意されているものをコピーして作成したいと思います
デフォルトのルールをコピーするのにEclipseの「Checkstyle Plug-in」をインストールします

Checkstyle Plug-inのインストール

Help -> Eclipse Marketplace -> Search

で「checkstyle」と入力してください
以下のプラグインが検索されるのでInstall -> Finishとしてインストールしましょう
install_checkstyle_plugin.png

途中利用規約に同意してEclipseの再起動を求められるので再起動してください

再起動が完了すればインストールが完了です

デフォルトで用意されているのcheckstyle.xmlをコピーする

Window -> Preferences -> Checkstyle

と移動します
デフォルトで用意されているCheckstyleのルールが表示されます

プラグインのバージョンにもよると思いますが3種類のデフォルトルールがありました
そのうち「Google Checks」というルールがプラグインではデフォルトで使われているようです
今回はこれではなく「Sun Checks (Eclipse)」のルールを元にcheckstyle.xmlを作成します
list_default_checkstyle.png

上記の画面から「Sun Checks (Eclipse)」を選択した状態で「Copy」をクリックしてください
Typeに「External Configuration File」を選択します
Locationにはcheckstyle.xmlを保存するパスを指定します
今回はプロジェクトのカレントディレクトリを指定しましょう
create_checkstyle.png

こんな感じで入力してOKをクリックしましょう
するとプロジェクトの直下に「checkstyle.xml」というファイルができていると思います
これがCheckstyleするときに適用されるルールになります

ビルドしてみる

この状態でMavenビルドすればCheckStyleをかけることができます
testフェーズで実施されるのでmvn packageあたりでビルドすればOKです

初回はプラグインのダウンロード等が発生するので遅いですが2回目以降はスムーズに終了すると思います
maven-checkstyle-pluginのログの部分だけ抜粋すると以下のようになっていました

[INFO] --- maven-checkstyle-plugin:2.15:check (default) @ test-webapp ---
[INFO] Starting audit...
Audit done.

最終的にはBUILD SUCCESSになっていればOKです

ルールを独自に編集してみる

ルールの詳細はこちらを御覧ください

今回用意したcheckstyle.xmlはかなり緩く、そして結構謎なチェックルールが多いです
ほとんどコーティングしていない環境であれば警告はほぼでないと思いますが、結構開発していてコード量も多い場合は平気で1000とかの単位で警告が出ます
そんな場合はルールを変更して警告を無視するようなことをよくやります

例えば以下のようなコードを追加するだけで結構な警告が出るようになります

package test;

public class Test {

    private String name;

    public Test(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

出現する警告は以下の通り

[INFO] --- maven-checkstyle-plugin:2.15:check (default) @ test-webapp ---
[INFO] Starting audit...
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:0: warning: Missing package-info.java file.
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:3: warning: Javadoc コメントがありません。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:5:5: warning: Javadoc コメントがありません。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:7:5: warning: Javadoc コメントがありません。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:7:17: warning: Parameter name should be final.
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:7:24: warning: 'name' がフィールドを隠しています。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:12:5: warning: Javadoc コメントがありません。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:12:5: warning: メソッド 'getName' は拡張するように設計されていません - abstract か final か空である必要があります。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:16:5: warning: Javadoc コメントがありません。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:16:5: warning: メソッド 'setName' は拡張するように設計されていません - abstract か final か空である必要があります。
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:16:25: warning: Parameter name should be final.
C:\Users\kakakikikeke\workspace\test-webapp\src\main\java\test\Test.java:16:32: warning: 'name' がフィールドを隠しています。
Audit done.

今回の設定の場合は緩いルールを使っているので警告として怒られるのでビルド自体は最後までいきます
主に怒られるのはJavadoc系になると思います
Eclipse等のIDEで開発している場合IDE自体がある程度フォーマットしてくれるのでスペースがない等のエラーはあまり見ないと思います
ではこの警告の一部を無視する設定を紹介します

Checkstyleの警告を無視する設定を追加する

設定はEclipseであればGUIを使って行うことができます
もちろんcheckstyle.xmlを直接編集してXMLを書き直すでもOKです

Window -> Preferences -> Checkstyle

でプラグインに登録されているルールの一覧を表示したら今回のプロジェクトが使っているルールをダブルクリックしてください
するとルールを設定するウィンドウが表示されるのでここで

Javadoc Comments -> Package Javadoc

のチェックボックスをOFFにしてください
OFFにしたらOKでウィンドウを閉じてください
ignore_package_info_warning.png

これでcheckstyle.xmlの方にも設定を反映することができます
一旦ウィンドウを閉じて再度mvn packageでビルドしてみてください

再度ビルドしてみる

ビルドの結果を見てみましょう
すると先ほど警告されていた先頭の

warning: Missing package-info.java file.

が警告されなくなっているのがわかると思います

こんな感じでルールの編集を行うことができます
GUIからだと割りと直感的にルールを編集することができます
それでも英語のkeywordから何を設定しているのかを読み解く部分も出てくると思いますので
その場合はドキュメントを読むなりWebで調べるなりする必要が出てきます

最後に

導入自体は割りと簡単に行えますが導入後に自分でルールを調整しなければいけなく、XMLとの戦いを避けられないのが辛いところです

それでも一度導入できてしまえば再度変更することはほとんどないと思うので、それと比較するとCheckStyleを導入する恩知は大きいと思います

個人で開発する分には導入するメリットはそれほど無いかもしれませんが、チームで開発していたりオープンソースとして公開することを目標にしているのであれば
むしろ導入は必須と言っていいかもしれません

0 件のコメント:

コメントを投稿