FindbugsをEclipseとMavenで実行する

Findbugsはみなさんご存知の通り、クラスやJARファイルを解析して潜在的な問題を探し出してくれる静的解析ツールです。

今のプロジェクトではこのFindbugsを2つのタイミングで実施しています。

  1. EclipseFindbugs Pluginをインストールし、ビルドと同時にFindbugsを実行
  2. CIのタイミングでMavenFindbugsを実行

基本的には開発者は前者だけを意識して、後者は開発リーダなんかがプロジェクトの全体状況を把握しているのに使用しています。

ここでEclipseMaven2の2箇所でFindbugsを実行しているわけですが、この2箇所で同様の設定(同じFindbugsのルールセット)で実行されるようにしておく必要あります。この設定の方法が色々めんどくさい。というかEclipseFindbugsがあまりいけていない。

Maven2EclipseFindbugsの設定の違い

Findbugs自身はルールのフィルターという仕組みを使って、includeするバグパターンや、excludeするバグパターンを指定することができます。
http://findbugs.sourceforge.net/manual/filter.html

maven2上で実行する場合もこの仕組を使えます。

  ...
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>findbugs-maven-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <excludeFilterFile>findbugs-exclude.xml</excludeFilterFile>
          <includeFilterFile>findbugs-include.xml</includeFilterFile>
        </configuration>
      </plugin>
    </plugins>
  </reporting>
  ...

一方、EclipseFindbugsは .fbprefs というEclipse独自の怪しい設定ファイルのでバグパターンが管理されています。

..
detectorUseObjectEquals=UseObjectEquals|false
detectorUselessSubclassMethod=UselessSubclassMethod|false
detectorVarArgsProblems=VarArgsProblems|false
detectorVolatileUsage=VolatileUsage|false
..

これは例えばプロジェクトの[properties]-[Findbugs]でdetectorのon/offを切り替えると .fbprefs に反映されるという仕組みなっています。
f:id:yamkazu:20091215023454j:image

EclipseがFilterファイルを生成して管理してくれれば嬉しいのに。。。

EclipseFindbugsでもフィルターファイルは使える

プロジェクトの[properties]-[Findbugs]を選択して、[Filter files]のタブからフィルターファイルが設定出来ます。
ただしちょっと注意が必要です。EclipseFindbugsでは先程の .fbprefs で有効になっているdetectorを元にinclude filter、exclude filterが適用されているということです。

例えばAというバグパターンがあったとします。.fbprefsでAが有効になっていて、include filterでAを使用するという設定を記述。この場合はEclipse上のFindbugsでAというバグパターンが有効になります。
次に、.fbprefsでAが有効になっていて、include filterでAを使用するという設定がない場合、これはEclipse上のFindbugsでAというバグパターンが有効になりません。
今度は、.fbprefsでAが無効になっていて、include filterでAを使用するという設定がある場合、これもEclipse上のFindbugsでAというバグパターンが有効になりません。

という感じで少しややこしいので注意して使う必要があります。

exclude filterを利用してMaven2EclipseFindbugsを実行する

やや長ったらしくなりましたが、ここが本題。

EclipseFindbugsでもfilterが使えるので以下の方針で実行すると設定が同じにできます。include filterにするか、exclude filterにするか、または両方使うかがありますが大概exclude filterだけ使えば十分だと思います。あとでクラス個別で外したいとかも便利ですし。

準備は設定は除外したいものをexclude filterに記述しておきます。例えばURF_UNREAD_FIELDを除外するにはこんな感じになります。

<FindBugsFilter>
	<Bug pattern="URF_UNREAD_FIELD" />
</FindBugsFilter>

Maven2findbugsでは特に指定しないとすべてのバグパターンが実行されるため、exclude filterに先程のファイルを指定します。
Eclipseでは、まずすべてのdetectorをon(true)にします。いちいちチェック入れるのが面倒臭かったら .fbprefs を直接開いて true で置換するのが楽だと思います。その上でEclipseFindbugsの設定でexclude filterに先程のファイルを指定します。

これでEclipseMaven2の2箇所でFindbugsを同じ設定で実行できます。

あとは運用で追加、削除といったことがあったらexclude filterに設定したファイルだけをメンテするようにします。

参考
http://d.hatena.ne.jp/ykhr-kokko/20080713#1215937357

地豆だった!
これ知らなくてExcelでバグをマッピングして、オレごりごりやってたんだぜ。。。