FindbugsをEclipseとMavenで実行する
Findbugsはみなさんご存知の通り、クラスやJARファイルを解析して潜在的な問題を探し出してくれる静的解析ツールです。
今のプロジェクトではこのFindbugsを2つのタイミングで実施しています。
基本的には開発者は前者だけを意識して、後者は開発リーダなんかがプロジェクトの全体状況を把握しているのに使用しています。
ここでEclipseとMaven2の2箇所でFindbugsを実行しているわけですが、この2箇所で同様の設定(同じFindbugsのルールセット)で実行されるようにしておく必要あります。この設定の方法が色々めんどくさい。というかEclipseのFindbugsがあまりいけていない。
Maven2とEclipseのFindbugsの設定の違い
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> ...
一方、EclipseのFindbugsは .fbprefs というEclipse独自の怪しい設定ファイルのでバグパターンが管理されています。
.. detectorUseObjectEquals=UseObjectEquals|false detectorUselessSubclassMethod=UselessSubclassMethod|false detectorVarArgsProblems=VarArgsProblems|false detectorVolatileUsage=VolatileUsage|false ..
これは例えばプロジェクトの[properties]-[Findbugs]でdetectorのon/offを切り替えると .fbprefs に反映されるという仕組みなっています。
EclipseがFilterファイルを生成して管理してくれれば嬉しいのに。。。
EclipseのFindbugsでもフィルターファイルは使える
プロジェクトの[properties]-[Findbugs]を選択して、[Filter files]のタブからフィルターファイルが設定出来ます。
ただしちょっと注意が必要です。EclipseのFindbugsでは先程の .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を利用してMaven2とEclipseでFindbugsを実行する
やや長ったらしくなりましたが、ここが本題。
EclipseのFindbugsでもfilterが使えるので以下の方針で実行すると設定が同じにできます。include filterにするか、exclude filterにするか、または両方使うかがありますが大概exclude filterだけ使えば十分だと思います。あとでクラス個別で外したいとかも便利ですし。
準備は設定は除外したいものをexclude filterに記述しておきます。例えばURF_UNREAD_FIELDを除外するにはこんな感じになります。
<FindBugsFilter> <Bug pattern="URF_UNREAD_FIELD" /> </FindBugsFilter>
Maven2のfindbugsでは特に指定しないとすべてのバグパターンが実行されるため、exclude filterに先程のファイルを指定します。
Eclipseでは、まずすべてのdetectorをon(true)にします。いちいちチェック入れるのが面倒臭かったら .fbprefs を直接開いて true で置換するのが楽だと思います。その上でEclipseのFindbugsの設定でexclude filterに先程のファイルを指定します。
これでEclipseとMaven2の2箇所でFindbugsを同じ設定で実行できます。
あとは運用で追加、削除といったことがあったらexclude filterに設定したファイルだけをメンテするようにします。
地豆だった!
これ知らなくてExcelでバグをマッピングして、オレごりごりやってたんだぜ。。。