かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その8 )( build.gradle への checkstyle, findbugs の導入+CheckStyle-IDEA, FindBugs-IDEA Plugin の導入 )

概要

記事一覧はこちらです。

Spring Boot 1.3.x の Web アプリを 1.4.x へバージョンアップする ( その7 )( Google の Java コンパイル時バグチェックツール? Error Prone を試してみる ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • 前回 Error Prone を導入してみてコードチェックツールはいれた方が良さそうに感じたので、有名な checkstyleFindBugs を入れてみます。
    • 最初に build.gradle に checkstyle, findbugs を導入してみます。
    • その後で IntelliJ IDEA の Plugin である CheckStyle-IDEA, FindBugs-IDEA を導入してみます。

参照したサイト・書籍

  1. Google’s Java Style の CheckStyle を使う
    http://create-something.hatenadiary.jp/entry/2015/01/31/121332

  2. checkstyle/src/main/resources/google_checks.xml
    https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml

  3. Google Java Style Guide
    https://google.github.io/styleguide/javaguide.html

  4. checkstyle
    http://checkstyle.sourceforge.net/

  5. How can I disable checkstyle rules for tests in gradle?
    http://stackoverflow.com/questions/32772872/how-can-i-disable-checkstyle-rules-for-tests-in-gradle

  6. FindBugsExtension http://gradle.monochromeroad.com/docs/dsl/org.gradle.api.plugins.quality.FindBugsExtension.html

    • build.gradle へ findbugs を導入する時の設定はこちらを参照しました。
  7. JavaのバグをFindBugsで見つける
    https://internetcom.jp/developer/20081017/26.html

  8. Jenkins+GradleでJavaのCIのための基本build.gradle設定 (JUnit,PMD,FindBugs,CPD,JaCoCo)
    http://qiita.com/mychaelstyle/items/74baa62b7bf2fe81e309

  9. How to generate HTML output using Gradle FindBugs Plugin
    http://stackoverflow.com/questions/15406469/how-to-generate-html-output-using-gradle-findbugs-plugin

  10. 第8章 フィルターファイル
    http://findbugs.sourceforge.net/ja/manual/filter.html

目次

  1. build.gradle に checkstyle を導入してみる
    1. Google Java Style の checkstyle 用XMLファイル google_checks.xml をダウンロードする
    2. build.gradle を変更する
    3. build タスクを実行する
    4. のための間違った辞書式順序 '...' インポート。 ... [CustomImportOrder]のインポート文 '...' は、間違った順序です。 ... [CustomImportOrder]
    5. 行が 100 文字を超えています。 [LineLength]
    6. インデント階層 ... の ... が正しいインデント ... にありません [Indentation]
    7. Javadoc コメントがありません。 [JavadocMethod]
    8. ',' は前の行にあるべきです。 [SeparatorWrap]
    9. Javadocのの??最初の文は、(期間が欠落している)、または存在しない不完全です。 [SummaryJavadoc]
    10. アット節非空の記述を持っている必要があります。 [NonEmptyAtclauseDescription]
    11. 'METHOD_DEF' 前の文から分離する必要があります。 [EmptyLineSeparator]
    12. オーバーロードメソッドは、分割すべきではありません。 ... [OverloadMethodsDeclarationOrder]
    13. 再び build タスクを実行するも、まだエラーが出ます
    14. '.*' 形式のインポートの使用は避けるべきです ... [AvoidStarImport]
    15. 名前に略語は '...' 以下にする必要があります ... [AbbreviationAsWordInName]
    16. Member name '...' must match pattern '^[a-z][a-z0-9][a-zA-Z0-9]*$'. [MemberName]
    17. '}' 欄で ... はマルチブロック文を直接複数のブロックが含まれています ... [RightCurly]
    18. 変数 '...' の宣言と、その変数の使用開始位置までの距離が 7 です。許可された距離 は 3 です。... [VariableDeclarationUsageDistance]
    19. 再び build タスクを実行し警告もエラーも出なくなりました
  2. build.gradle に findbugs を導入してみる
    1. build.gradle を変更する
    2. build タスクを実行する
    3. レポートの出力形式を xml ではなく html に変更する
    4. ... は、static 内部クラスにすべきです。
    5. ... への無効な代入です。
    6. 再び build タスクを実行し何も警告が出なくなりました
  3. CheckStyle-IDEA Plugin を導入してみる
    1. CheckStyle-IDEA Plugin をインストールする
    2. Plugin から checkstyle を実行する
  4. FindBugs-IDEA Plugin を導入してみる
    1. FindBugs-IDEA Plugin をインストールする
    2. Plugin から FindBugs を実行する
  5. 次回は。。。

手順

build.gradle に checkstyle を導入してみる

Google Java Style の checkstyleXMLファイル google_checks.xml をダウンロードする

Google Java Style 用の chekstyle の XMLファイルがダウンロードできますので、それをベースに自分向けの変更を加えて導入してみます。

  1. プロジェクトのルートから config/checkstyle ディレクトリを作成します。

  2. checkstyle/src/main/resources/google_checks.xml から google_checks.xml をダウンロードし、config/checkstyle の下に配置します。

build.gradle を変更する

  1. build.gradle を リンク先のその1の内容 に変更します。

  2. 変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

build タスクを実行する

  1. clean タスク → Rebuild Project → build タスク の順に実行します。

    build タスクが実行されるといろいろダウンロードされます。

    f:id:ksby:20170218142430p:plain

    その後に大量の WARN メッセージが出力されました。

    f:id:ksby:20170218142614p:plain

    出力されているのは以下の WARN メッセージです。1つずつ対応していきます。

    • インポートの順番間違いに関するメッセージ
      • のための間違った辞書式順序 ‘…’ インポート。の前にすべきである … [CustomImportOrder]
      • のインポート文 ‘…’ は、間違った順序です。 … [CustomImportOrder]
    • 行が 100 文字を超えています。 [LineLength]
    • インデント階層 … の … が正しいインデント … にありません [Indentation]
    • Javadoc コメントがありません。 [JavadocMethod]
    • ‘,’ は前の行にあるべきです。 [SeparatorWrap]
    • Javadocのの??最初の文は、(期間が欠落している)、または存在しない不完全です。 [SummaryJavadoc]
    • アット節非空の記述を持っている必要があります。 [NonEmptyAtclauseDescription]
    • ‘METHOD_DEF’ 前の文から分離する必要があります。 [EmptyLineSeparator]
    • オーバーロードメソッドは、分割すべきではありません。 … [OverloadMethodsDeclarationOrder]

のための間違った辞書式順序 '...' インポート。 ... [CustomImportOrder]のインポート文 '...' は、間違った順序です。 ... [CustomImportOrder]

import 文の順序は IntelliJ IDEA 任せにしているので checkstyle ではチェックしないようにします。以下の部分をコメントアウトします。

        <!-- import 文の順序は IntelliJ IDEA 任せにしているのでチェックしない -->
        <!--<module name="CustomImportOrder">-->
            <!--<property name="sortImportsInGroupAlphabetically" value="true"/>-->
            <!--<property name="separateLineBetweenGroups" value="true"/>-->
            <!--<property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>-->
        <!--</module>-->

行が 100 文字を超えています。 [LineLength]

IntelliJ IDEA のエディタの右側に縦線が引かれていますが、これは 120 文字の位置に引かれています。

f:id:ksby:20170218175459p:plain

この設定を変える気はありませんので、checkstyle によるチェックも 120 文字に変更します。

        <module name="LineLength">
            <property name="max" value="120"/>
            <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
        </module>
  • <property name="max" value="100"/><property name="max" value="120"/> に変更します。

また 120 文字を超えている行がある場合にはソースを変更します。

インデント階層 ... の ... が正しいインデント ... にありません [Indentation]

Google Java Style のインデントのデフォルトは 2 ですが、IntelliJ IDEA のフォーマットではインデントは 4 なので 4 に変更します。

        <module name="Indentation">
            <property name="basicOffset" value="4"/>
            <property name="braceAdjustment" value="0"/>
            <property name="caseIndent" value="4"/>
            <property name="throwsIndent" value="4"/>
            <property name="lineWrappingIndentation" value="4"/>
            <property name="arrayInitIndent" value="4"/>
        </module>
  • value="2"value="4" に変更します。

Javadoc コメントがありません。 [JavadocMethod]

これは checkstyle のルールは変更せずにソースに Javadoc を付ける方針とします。今回は詳細なコメントは書かずに単に Javadoc のヘッダだけ書いておきます。

',' は前の行にあるべきです。 [SeparatorWrap]

自分は “,” を前に付ける方が好みなので checkstyle のルールを変更します。

        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapComma"/>
            <property name="tokens" value="COMMA"/>
            <property name="option" value="nl"/>
        </module>
  • SeparatorWrapComma の option の value="EOL"value="nl" へ変更します。

Javadocのの??最初の文は、(期間が欠落している)、または存在しない不完全です。 [SummaryJavadoc]

Google Java Style だと Javadoc のコメントの1行目には、このメソッドが何を返すのか、あるいは何をするメソッドなのかを記述することを強制するルールのようです。あとから真似るかもしれませんが、今はコメントアウトしておきます。

        <!-- Javadoc の1行目のフォーマットを指定するルールだが、今はそこまで真似られないのでコメントアウトする -->
        <!--<module name="SummaryJavadoc">-->
            <!--<property name="forbiddenSummaryFragments" value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>-->
        <!--</module>-->

アット節非空の記述を持っている必要があります。 [NonEmptyAtclauseDescription]

最初に日本語のメッセージを見た時は何を言っているのか分かりませんでしたが、Javadoc で @param, @return 等の @ から始まるタグの説明が空の場合に警告を出すルールでした。

ルールとしては入れておきたいので checkstyleXMLファイルはこのままにしますが、今からソースの Javadoc に説明を追加するのはさすがに手間なので今は “???” だけ書いておくことにします。

。。。と思ったのですが、"???“ を書いていて @throws だけこの対象から外しておきたくなったので checkstyle のルールを以下のように変更します。

        <module name="NonEmptyAtclauseDescription">
            <!-- @throws はチェックの対象から外す -->
            <property name="javadocTokens" value="PARAM_LITERAL,RETURN_LITERAL,DEPRECATED_LITERAL"/>
        </module>
  • <property name="javadocTokens" value="PARAM_LITERAL,RETURN_LITERAL,DEPRECATED_LITERAL"/> を追加します。

'METHOD_DEF' 前の文から分離する必要があります。 [EmptyLineSeparator]

この警告はここまで修正したら消えてしまったので無視します。

オーバーロードメソッドは、分割すべきではありません。 ... [OverloadMethodsDeclarationOrder]

ksbysample.webapp.lending.dao.LendingAppDao クラス等 Doma 2 の interface で出力されていて対応のしようがないので、ルールをコメントアウトすることにします。

        <!-- Doma2 の Dao interface で警告が出て対応のしようがないのでコメントアウトする -->
        <!--<module name="OverloadMethodsDeclarationOrder"/>-->

再び build タスクを実行するも、まだエラーが出ます

出ていた警告には対応したので、再び clean タスク → Rebuild Project → build タスク の順に実行します。

まだ警告が出力されており、出力されたのは以下の WARN メッセージでした。1つずつ対応していきます。

  • ‘.*’ 形式のインポートの使用は避けるべきです … [AvoidStarImport]
  • 名前に略語は ‘…’ 以下にする必要があります … [AbbreviationAsWordInName]
  • Member name ‘…’ must match pattern ‘^[a-z][a-z0-9][a-zA-Z0-9]*$’. [MemberName]
  • ‘}’ 欄で … はマルチブロック文を直接複数のブロックが含まれています … [RightCurly]
  • 変数 ‘…’ の宣言と、その変数の使用開始位置までの距離が 7 です。許可された距離 は 3 です。… [VariableDeclarationUsageDistance]

'.*' 形式のインポートの使用は避けるべきです ... [AvoidStarImport]

import 文の記述は IntelliJ IDEA 任せにしているので checkstyle ではチェックしないようにします。以下の部分をコメントアウトします。

        <!-- import 文の記述は IntelliJ IDEA 任せにしているのでチェックしない -->
        <!--<module name="AvoidStarImport"/>-->

名前に略語は '...' 以下にする必要があります ... [AbbreviationAsWordInName]

2種類の意味で出力されていました。

まず1種類目は 名前に略語は 'TEMPLATE_LOCATION_TEXTMAIL' 以下にする必要があります '1' 大文字を。 [AbbreviationAsWordInName] のように定数文字列で出力されているもので、これはソースの記述で private static final ... ではなく private final ... にしていたためでした。。。 ( 定数でないのでキャメルケースを使用しているのが NG と判断されています ) static を追加します。

2種類目は 名前に略語は 'BooklistCSVRecord' 以下にする必要があります '1' 大文字を。 [AbbreviationAsWordInName] のようにクラス名等で “CSV” のように大文字続きの名称にしていたためでした。CSVCsv にように全てスネークケースになるよう変更します。

この警告については checkstyle のルールは変更しません。

Member name '...' must match pattern '^[a-z][a-z0-9][a-zA-Z0-9]*$'. [MemberName]

これは上の 名前に略語は '...' 以下にする必要があります ... [AbbreviationAsWordInName] の警告を修正したら出なくなりましたので checkstyle のルールもソースも変更しません。

'}' 欄で ... はマルチブロック文を直接複数のブロックが含まれています ... [RightCurly]

これはソースのオートフォーマット忘れで、

        }
        else {

と書かれていたためでした。オートフォーマットするとこうなります。

        } else {

checkstyle のルールは変更しません。

変数 '...' の宣言と、その変数の使用開始位置までの距離が 7 です。許可された距離 は 3 です。... [VariableDeclarationUsageDistance]

変数が宣言された位置と実際に使用されている位置が 4 行以上離れているため出ている警告でした。ただし実際に指摘を受けた箇所を見てみたのですが、位置を修正したくなかったので以下のようにチェックされてる行数を少し拡大することにします ( 実際にはこのルール通り書けた方がよいと思うのですが、サンプルとして作っているソースでこのルールを厳密に適用しようとするとちょっと辛いかなと思ったので緩くします )。

        <module name="VariableDeclarationUsageDistance">
            <!-- allowedDistance のデフォルト値は 3 だが、少し短すぎるので 10 に変更する -->
            <property name="allowedDistance" value="10"/>
        </module>

再び build タスクを実行し警告もエラーも出なくなりました

  1. 再び clean タスク → Rebuild Project → build タスク の順に実行します。

    今度は1つも警告、エラーが出ずに “BUILD SUCCESSFUL” の文字が出力されました。

    f:id:ksby:20170219133342p:plain

    checkstyle も Error Prone 同様に修正した方がよいと思われる箇所を結構いろいろ指摘してくれるので気に入りました。こちらも今後は積極的に入れていきたいと思います。

build.gradle に findbugs を導入してみる

build.gradle を変更する

  1. build.gradle を リンク先のその2の内容 に変更します。

  2. 変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

build タスクを実行する

  1. clean タスク → Rebuild Project → build タスク の順に実行します。

    build タスクが実行されるといろいろダウンロードされます。

    f:id:ksby:20170219164640p:plain

    build タスク自体は “BUILD SUCCESSFUL” のメッセージが出て終了しましたが、FindBugs が何か検知して FindBugs rule violations were found. のメッセージも出力されていました。

    f:id:ksby:20170219164802p:plain

    デフォルトの設定では build/reports/findbugs ディレクトリにレポートの XML ファイルが生成されます。生成されたレポートファイル main.xml を開いてみたのですが、Error Prone や checkstyle のメッセージと比較するとすごく見にくいですね。findbugs を導入している人って毎回このレポートを見ているのでしょうか。。。?

    f:id:ksby:20170219155249p:plain

    さすがに毎回このレポートファイルを見るのはちょっとつらそうな気がする&絶対見やすくする方法があるはず、と思ったので調べてみます。

レポートの出力形式を xml ではなく html に変更する

古い記事ですが JavaのバグをFindBugsで見つける にレポートを XML 形式ではなく HTML 形式で出力できるという記述を見かけました。stackoverflow で gradle での設定方法を探したところ How to generate HTML output using Gradle FindBugs Plugin という QA を見つけましたので、これで試してみたいと思います。

  1. build.gradle を リンク先のその3の内容 に変更します。

  2. 変更後、Gradle Tool Window の左上にある「Refresh all Gradle projects」ボタンをクリックして更新します。

  3. clean タスク → Rebuild Project → build タスク の順に実行します。

    build/reports/findbugs ディレクトリの下に main.html が生成されました。

    f:id:ksby:20170219170247p:plain

    main.html を開くと警告が4件あることが分かります。html だと結果が分かりやすいです。

    f:id:ksby:20170219170546p:plain

    ただしこの HTML 形式のレポートファイルですが、meta タグで文字コードが出力されていないため Chrome で開くと文字化けしますね。上のは IE で開いています。自動で meta タグを追加する方法は探してみましたが見つからなかったので、IE で開くことにします。

    f:id:ksby:20170219172404p:plain

    出力された4件は以下の内容でした。種類としては2種類のようです。確認してみます。

    f:id:ksby:20170219174747p:plain

... は、static 内部クラスにすべきです。

メッセージ通り static の付け忘れでした。修正します。

  1. src/main/java/ksbysample/webapp/lending/web/booklist の下の RegisterBooklistForm.javaリンク先の内容 に変更します。

... への無効な代入です。

メッセージが出力されたのはデータロックのために実行している部分の処理で、確かに変数へ代入するだけで使用していません。ただし削除する訳にもいかないので、FindBugsフィルターファイル を作成してチェックの対象にならないようにします。

  1. config の下に findbugs ディレクトリを作成します。

  2. config/findbugs の下に findbugs-exclude.xml を作成し、リンク先の内容 の内容を記載します。

  3. build.gradle を リンク先のその4の内容 に変更します。

再び build タスクを実行し何も警告が出なくなりました

  1. 再び clean タスク → Rebuild Project → build タスク の順に実行します。

    今度は FindBugs rule violations were found. のメッセージが出ずに “BUILD SUCCESSFUL” の文字が出力されました。

    f:id:ksby:20170219184747p:plain

    findbugs もこのまま入れておくことにします。また XML 形式のレポートファイルについて調べてみたところ、Jenkins で実行する際に Plugin で警告数を取得する時には HTML 形式ではなく XML 形式で出力する必要があるようです。覚えておきます。

CheckStyle-IDEA Plugin を導入してみる

CheckStyle-IDEA Plugin をインストールする

  1. IntelliJ IDEA のメインメニューから「File」-「Settings…」を選択します。

  2. 「Settings」ダイアログが表示されます。画面左側のリストから「Plugins」を選択した後、画面中央下の「Browse repositories…」ボタンをクリックします。

  3. 「Browse Repositories」ダイアログが表示されます。画面左上の検索フィールドに “checkstyle” と入力すると「CheckStyle-IDEA」が表示されますので、選択して「Install」ボタンをクリックします。

    f:id:ksby:20170219190804p:plain

    プラグインがダウンロードされて「Install」ボタンが「Restart IntelliJ IDEA」ボタンに切り替わりますのでクリックします。

  4. 「Settings」ダイアログに戻りますので「OK」ボタンをクリックします。

    「Platform and Plugin Updates」ダイアログが表示されますので「Restart」ボタンをクリックします。

  5. IntelliJ IDEA が再起動します。再起動しただけではまだ設定が不足しているので設定します。

  6. 再度 IntelliJ IDEA のメインメニューから「File」-「Settings…」を選択します。

  7. 「Settings」ダイアログが表示されます。画面左側のリストから「Other Settings」-「Checkstyle」を選択した後、画面右側の「Configuration File」の「+」ボタンをクリックします。

    f:id:ksby:20170219193225p:plain

  8. 設定用のダイアログが表示されますので、以下の値を入力した後「Next」ボタンをクリックします。

    f:id:ksby:20170219194829p:plain

    • 「Description」に google_checks.xml と入力します。
    • 「Use a local Checkstyle file」の下の「File」に C:\project-springboot\ksbysample-webapp-lending\config\checkstyle\google_checks.xml と入力します。
    • 「Store relative to project location」をチェックします。

    次の画面が表示されたら「Finish」ボタンをクリックします。

    f:id:ksby:20170219193752p:plain

  9. 「Settings」ダイアログに戻ります。「Configuration File」に登録した google_checks.xml が表示されていますので、選択してから左側のチェックボックスをチェックします。チェック後「OK」ボタンをクリックしてダイアログを閉じます。

    f:id:ksby:20170219193913p:plain

    以上でインストール、設定は完了です。

Plugin から checkstyle を実行する

  1. CheckStyle-IDEA Plugin をインストールすると IntelliJ IDEA のメイン画面の左下に「CheckStyle」メニューが表示されます。

    f:id:ksby:20170219195529p:plain

    CheckStyle」メニューをクリックします。

  2. CheckStyle-IDEA Plugin の画面が表示されます。画面左側の「Check Project」ボタンをクリックします。

    f:id:ksby:20170219195809p:plain

    チェックが実行された後、結果が表示されます。今は gradle で checkstyle を実行して警告を取り除いているので何も引っかかりませんでした。

    f:id:ksby:20170219200030p:plain

  3. 以前 checkstyle で指摘を受けた箇所を元に戻して「Check Project」ボタンをクリックしてみます。

    以下のようにファイルとメッセージが表示されました。

    f:id:ksby:20170219200729p:plain

    使ってみた感想としては、

    • 表示されているメッセージをダブルクリックするとソースの該当箇所にジャンプします。gradle で checkstyle を実行した時には警告が出た箇所を表示するのにちょっと面倒だったので、これはかなり便利です。
    • 画面左側に緑の矢印が表示されていますが、これは「Check Current File」ボタンで現在表示しているファイルだけチェックできます。
    • 同じく画面左側の下矢印があるボタンですが、これは「Autoscroll to Source」ボタンでクリックした状態にしておけばメッセージを選択するとすぐにソースの該当箇所が表示されます。たぶんクリックしておいた方が便利だと思います。

    CheckStyle-IDEA Plugin の方がチェック&修正がやりやすいので、gradle の checkstyle は最終チェックとして実行することにして、通常は CheckStyle-IDEA Plugin を使った方が便利ですね。

FindBugs-IDEA Plugin を導入してみる

FindBugs-IDEA Plugin をインストールする

  1. IntelliJ IDEA のメインメニューから「File」-「Settings…」を選択します。

  2. 「Settings」ダイアログが表示されます。画面左側のリストから「Plugins」を選択した後、画面中央下の「Browse repositories…」ボタンをクリックします。

  3. 「Browse Repositories」ダイアログが表示されます。画面左上の検索フィールドに “findbugs” と入力すると「FindBugs-IDEA」が表示されますので、選択して「Install」ボタンをクリックします。

    f:id:ksby:20170219210909p:plain

    プラグインがダウンロードされて「Install」ボタンが「Restart IntelliJ IDEA」ボタンに切り替わりますのでクリックします。

  4. 「Settings」ダイアログに戻りますので「OK」ボタンをクリックします。

    「Platform and Plugin Updates」ダイアログが表示されますので「Restart」ボタンをクリックします。

  5. IntelliJ IDEA が再起動します。FindBugs-IDEA Plugin はこれだけでも使用可能ですが、gradle に findbugs を設定した時に作成した findbugs-exclude.xml を設定します。

  6. 再度 IntelliJ IDEA のメインメニューから「File」-「Settings…」を選択します。

  7. 「Settings」ダイアログが表示されます。画面左側のリストから「Other Settings」-「FindBugs-IDEA」を選択した後、画面右側で「Filter」タブをクリックして中央の「Exclude filter files」の「+」ボタンをクリックします。

    f:id:ksby:20170219212045p:plain

  8. 「Exclude Filter Files」ダイアログが表示されますので、C:\project-springboot\ksbysample-webapp-lending\config\findbugs\findbugs-exclude.xml を選択して「OK」ボタンをクリックします。

    f:id:ksby:20170219212357p:plain

  9. 「Settings」ダイアログに戻ります。「OK」ボタンをクリックしてダイアログを閉じます。

    以上でインストール、設定は完了です。

Plugin から FindBugs を実行する

  1. FindBugs-IDEA Plugin をインストールすると IntelliJ IDEA のメイン画面の左下に「FindBugs-IDEA」メニューが表示されます。

    f:id:ksby:20170219213007p:plain

    FindBugs-IDEA」メニューをクリックします。

  2. FindBugs-IDEA Plugin の画面が表示されます。画面左側の「Analyze Project Files」ボタンをクリックします。

    f:id:ksby:20170219222850p:plain

    「Test Sources」ダイアログが表示されます。テストは FindBugs の対象には入れないので「No」ボタンをクリックします。

    f:id:ksby:20170219223146p:plain

    チェックが実行された後、結果が表示されます。今は gradle で findbugs を実行して警告を取り除いているので何も引っかかりませんでした。

    f:id:ksby:20170219223348p:plain

  3. 以前 findbugs で指摘を受けた箇所を元に戻して「Analyze Project Files」ボタンをクリックしてみます。

    以下のようにファイルとメッセージが表示されました。

    f:id:ksby:20170219223822p:plain

    使ってみた感想としては、

    • 指摘を受けている部分、内容が分かりやすいです。gradle の findbugs が出力するレポートファイルと比較すると圧倒的にこちらの方がいいですね。
    • 画面左側の下矢印がある「Autoscroll to Source」ボタンが最初からクリックされている状態になっており、Plugin の画面に表示されているファイル名をクリックするとエディタで対象ファイルが開き該当箇所にジャンプします。
    • 画面左側の一番左上にある「Analyze Current File」ボタンを押せば CheckStyle-IDEA Plugin と同じく現在表示しているファイルだけチェックできます。

    こちらも CheckStyle-IDEA Plugin と同様に gradle の findbugs は最終チェックとして実行することにして、通常は FindBugs-IDEA Plugin を使った方が便利ですね。

次回は。。。

1.4 系ではこう書くべきという点があるか確認し、変更した方がよいところを修正します。

最後に。後からコードチェックツールを導入してたくさん指摘を受けると結構堪えます。出来れば最初から導入しましょう。今回本当にそう思いました。。。

ソースコード

build.gradle

■その1

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'de.undercouch.download'
apply plugin: 'groovy'
apply plugin: 'net.ltgt.errorprone'
apply plugin: 'checkstyle'

..........

configurations {
    // for Doma 2
    domaGenRuntime

    // for Error Prone ( http://errorprone.info/ )
    errorprone {
        resolutionStrategy.force 'com.google.errorprone:error_prone_core:2.0.15'
    }
}

checkstyle {
    configFile = file("${rootProject.projectDir}/config/checkstyle/google_checks.xml")
    toolVersion = '7.5.1'
    sourceSets = [project.sourceSets.main]
}

repositories {
    jcenter()
}
  • apply plugin: 'checkstyle' を追加します。
  • checkstyle { ... } を追加します。checkstyle によるチェックは main だけとし、test は対象外にします ( JUnit の日本語のメソッド名等で警告が出たり、Javadoc がないので警告が出たりしますが、出ても対応しないからです )。

■その2

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'de.undercouch.download'
apply plugin: 'groovy'
apply plugin: 'net.ltgt.errorprone'
apply plugin: 'checkstyle'
apply plugin: 'findbugs'

..........

findbugs {
    toolVersion = '3.0.1'
    sourceSets = [project.sourceSets.main]
    ignoreFailures = true
    effort = "max"
}

repositories {
    jcenter()
}
  • apply plugin: 'findbugs' を追加します。
  • findbugs { ... } を追加します。

■その3

findbugs {
    toolVersion = '3.0.1'
    sourceSets = [project.sourceSets.main]
    ignoreFailures = true
    effort = "max"
}

tasks.withType(FindBugs) {
    reports {
        xml.enabled = false
        html.enabled = true
    }
}

repositories {
    jcenter()
}
  • tasks.withType(FindBugs) { ... } を追加します。

■その4

findbugs {
    toolVersion = '3.0.1'
    sourceSets = [project.sourceSets.main]
    ignoreFailures = true
    effort = "max"
    excludeFilter = file("${rootProject.projectDir}/config/findbugs/findbugs-exclude.xml")
}
  • excludeFilter = file("${rootProject.projectDir}/config/findbugs/findbugs-exclude.xml") を追加します。

RegisterBooklistForm.java

public class RegisterBooklistForm {

    ..........

    @Data
    public static class RegisterBooklistRow {
  • public class RegisterBooklistRow {public static class RegisterBooklistRow { へ変更します。

findbugs-exclude.xml

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
    <Match>
        <Class name="ksbysample.webapp.lending.web.lendingapp.LendingappService"/>
        <Bug pattern="DLS_DEAD_LOCAL_STORE"/>
    </Match>
</FindBugsFilter>

履歴

2017/02/19
初版発行。
2017/03/23
* Plugin の名前を間違えていました。CheckStyle-IDE, FindBugs-IDECheckStyle-IDEA, FindBugs-IDEA へ修正しました。