概要

AntからFindBugsを実行します。

サンプルターゲット

<property environment="env" />
<condition property="have.findbugs">
  <and>
    <available classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />
    <available file="${env.FINDBUGS_HOME}" />
  </and>
</condition>
<target name="findbugs" depends="compile" if="have.findbugs">
  <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" />
  <mkdir dir="${build.reports}" />
  <findbugs home="${env.FINDBUGS_HOME}" effort="max"
          output="xml" outputFile="${build.reports}/findbugs.xml" >
    <auxClasspath refid="project.class.path" />
    <sourcePath path="${src.dir}" />
    <class location="${build.dest}" />
  </findbugs>
</target>

解説

Windows 7

  1. FindBugs Downloadsからダウンロードしたfindbugs-x.x.x.zipを適当な場所に展開し、環境変数FINDBUGS_HOMEに設定
    • 変数名: FINDBUGS_HOME
    • 変数値: C:\Applications\findbugs-2.0.2
  2. %FINDBUGS_HOME%\lib\findbugs-ant.jarを、%ANT_HOME%\libにコピー(シンボリックリンクでも可)
  3. ant findbugsで、findbugs.xmlを生成し、jenkinsFindBugsプラグインや、%FINDBUGS_HOME%\bin\findbugs.batGUIに読み込む

Ubuntu 12.10

  1. FindBugs Downloadsから、findbugs-x.x.x.tar.gzをダウンロード
  2. 適当な場所に展開して、$ANT_HOME/lib以下に、findbugs-ant.jarをリンク
    sudo tar zxvf findbugs-2.0.2.tar.gz -C /usr/share/
    sudo ln -f -s /usr/share/findbugs-2.0.2/lib/findbugs-ant.jar /usr/share/ant/lib/
  3. .bashrcなどに、環境変数FINDBUGS_HOMEを記述
    export FINDBUGS_HOME=/usr/share/findbugs-2.0.2

除外フィルタ

検査したくないエラーパターンを作成して、excludeFilterで指定することもできます。

  • excludefilter.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <FindBugsFilter>
      <Match>
        <Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON" />
      </Match>
    </FindBugsFilter>
    
<findbugs home="${env.FINDBUGS_HOME}" effort="max" reportLevel="low"
        excludeFilter="${user.dir}/excludefilter.xml"
        output="xml:withMessages" outputFile="${build.reports}/findbugs.xml" >

FindBugs2.0でParseException: Unparseable date

  • FindBugs2.0で、以下のようなjava.text.ParseException: Unparseable date: "12/20/2011 09:17 PM EST"が発生する場合
    • Windows 7の日本語環境?
      [findbugs] Executing findbugs from ant task
      [findbugs] Running FindBugs...
      [findbugs] java.text.ParseException: Unparseable date: "12/20/2011 09:17 PM EST"
      [findbugs]     at java.text.DateFormat.parse(DateFormat.java:357)
      [findbugs]     at edu.umd.cs.findbugs.Version.<clinit>(Version.java:175)
      [findbugs]     at edu.umd.cs.findbugs.PluginLoader.init(PluginLoader.java:595)
      [findbugs]     at edu.umd.cs.findbugs.PluginLoader.<init>(PluginLoader.java:280)
      ...
  • FindBugs™ - Find Bugs in Java Programsからfindbugs-2.0.0-source.zipをダウンロードして展開
  • findbugs-2.0.0\src\java\edu\umd\cs\findbugs\updates\UpdateChecker.javaを変更
    public class UpdateChecker {
    
        //public static final String PLUGIN_RELEASE_DATE = "MM/dd/yyyy hh:mm aa z";
        public static final String PLUGIN_RELEASE_DATE = "MM/dd/yyyy HH:mm z";
    
  • もしくは、findbugs-2.0.0\src\java\edu\umd\cs\findbugs\Version.java173行目付近を以下のように変更
    //SimpleDateFormat releaseDateFormat = new SimpleDateFormat(UpdateChecker.PLUGIN_RELEASE_DATE);
    SimpleDateFormat releaseDateFormat = new SimpleDateFormat(UpdateChecker.PLUGIN_RELEASE_DATE, Locale.ENGLISH);
    
  • JDK 1.6.0_30などでコンパイル
    > cd findbugs-2.0.0
    > set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_30
    > ant.bat
  • findbugs-2.0.0\libに生成された以下のjarファイルを%FINDBUGS_HOME%\lib\に上書きコピー
    • annotations.jar
    • findbugs.jar
    • findbugs-ant.jar

  • 以下、再現テストコード
    import java.text.*;
    import java.util.*;
    public class UnparseableDateTest {
      public static final String PLUGIN_RELEASE_DATE = "MM/dd/yyyy hh:mm aa z";
      public static void main(String[] args) throws Exception {
        SimpleDateFormat enDateFormat = new SimpleDateFormat(PLUGIN_RELEASE_DATE, Locale.ENGLISH);
        System.out.println("1: "+enDateFormat.parse("12/20/2011 09:17 PM EST"));
    
        SimpleDateFormat jaDateFormat = new SimpleDateFormat(PLUGIN_RELEASE_DATE, Locale.JAPANESE);
        System.out.println("2: "+jaDateFormat.parse("12/20/2011 09:17 午後 EST"));
    
        SimpleDateFormat releaseDateFormat = new SimpleDateFormat(PLUGIN_RELEASE_DATE);
        System.out.println("3: "+releaseDateFormat.parse("12/20/2011 09:17 PM EST"));
      }
    }
    
  • Windows 7, cygwin, mintty, JDK 1.6.0_30で実行
    $ export JAVA_HOME="/cygdrive/c/Program Files/Java/jdk1.6.0_30"
    
    $ echo $JAVA_HOME
    /cygdrive/c/Program Files/Java/jdk1.6.0_30
    
    $ "$JAVA_HOME/bin/javac.exe" UnparseableDateTest.java
    
    $ "$JAVA_HOME/bin/java.exe" -Duser.language=ja UnparseableDateTest
    1: Wed Dec 21 11:17:00 JST 2011
    2: Wed Dec 21 11:17:00 JST 2011
    Exception in thread "main" java.text.ParseException: Unparseable date: "12/20/2011 09:17 PM EST"
        at java.text.DateFormat.parse(DateFormat.java:357)
        at UnparseableDateTest.main(UnparseableDateTest.java:13)
    
    $ "$JAVA_HOME/bin/java.exe" -Duser.language=en UnparseableDateTest
    1: Wed Dec 21 11:17:00 JST 2011
    2: Wed Dec 21 11:17:00 JST 2011
    3: Wed Dec 21 11:17:00 JST 2011

参考リンク

コメント

  • MacOSXでも同じ症状が出ました(MacOSX 10.6.8, Java 1.6.0_29, FindBugs 2.0.0)。UpdateChecker.javaの修正の方が楽かもです。 -- norachlo
    • 情報ありがとうございます。特に実害はないようなのですが、気になるので早く修正されるといいですね。 -- aterai
    • Bug TrackerではすでにResolution: Fixedになっているので、次版ではParseExceptionは発生しなくなりそうです。 -- aterai
    • 修正済みの2.0.1がダウンロード可能になっているようです。 -- aterai