第4章 FindBugs™ の実行

目次

1. クイック・スタート
2. FindBugs の起動
3. コマンドラインオプション

FindBugs には2つのユーザーインタフェースがあります。すなわち、グラフィカルユーザーインタフェース (GUI) および コマンドラインインタフェースです。この章では、それぞれのインタフェースの実行方法について説明します。

[警告]警告

この章は、現在書き直し中です。書き直しはまだ完了していません。

1. クイック・スタート

Windows システムで FindBugs を起動する場合は、 %FINDBUGS_HOME%\lib\findbugs.jar ファイルをダブルクリックしてください。 FindBugs GUI が起動します。

Unix 、 Linux または Mac OS X システムの場合は、$FINDBUGS_HOME/bin/findbugs スクリプトを実行するか、以下のコマンドを実行します。

java -jar $FINDBUGS_HOME/lib/findbugs.jar

これで、 FindBugs GUI が起動します。

GUI の使用方法については、 5章FindBugs GUI の使用方法 を参照してください。

2. FindBugs の起動

このセクションでは、 FindBugs の起動方法を説明します。FindBugs を起動するには2つの方法があります。すなわち、直接起動する方法、および、ラップしているスクリプトを使用する方法です。

2.1. FindBugs の直接起動

最初に述べる FindBugs の起動方法は、 $FINDBUGS_HOME/lib/findbugs.jar を直接実行する方法です。JVM (java) 実行プログラムの -jar コマンドラインスイッチを使用します。(FindBugsのバージョンが 1.3.5 より前の場合は、ラップしているスクリプトを使用する必要があります。)

FindBugs を直接起動するための、一般的な構文は以下のようになります。

    java [JVM 引数] -jar $FINDBUGS_HOME/lib/findbugs.jar オプション…

2.1.1. ユーザーインタフェースの選択

1 番目のコマンドラインオプションは、起動する FindBugs ユーザーインタフェースを選択するためのものです。指定可能な値は次の通りです:

  • -gui: グラフィカルユーザーインタフェース (GUI) を起動します。

  • -textui: コマンドラインインタフェースを起動します。

  • -version: FindBugs のバージョン番号を表示します。

  • -help: FindBugs コマンドラインインタフェースのヘルプ情報を表示します。

  • -gui1: 最初に作成された FindBugs グラフィカルユーザーインタフェース(すでに廃止されサポートされていない)を起動します。

2.1.2. Java 仮想マシン (JVM) 引数

FindBugs を起動する際に有用な Java 仮想マシン 引数をいくつか紹介します。

-XmxNNm

Java ヒープサイズの最大値を NN メガバイトに設定します。FindBugs は一般的に大容量のメモリサイズを必要とします。大きなプロジェクトでは、 1500 メガバイトを使用することも珍しくありません。

-Dname=value

Java システムプロパティーを設定します。例えば、引数 -Duser.language=ja を使用すると GUI 文言が日本語で表示されます。

2.2. ラップしているスクリプトを使用した FindBugs の起動

FindBugs を起動するもうひとつの方法は、ラップしているスクリプトを使用する方法です。

Unix 系のシステムにおいては、次のようなコマンドでラップしているスクリプトを起動します :

$ $FINDBUGS_HOME/bin/findbugs オプション…

Windows システムにおいては、ラップしているスクリプトを起動するコマンドは次のようになります。

C:\My Directory>%FINDBUGS_HOME%\bin\findbugs.bat オプション…

Unix 系システム および Windows システムのどちらにおいても、ディレクトリー $FINDBUGS_HOME/bin を環境変数 PATH に追加するだけで、 findbugs コマンドを使用して FindBugs を起動することができます。

2.2.1. ラップしているスクリプトのコマンドラインオプション

FindBugs のラップしているスクリプトは、次のようなコマンドラインオプションをサポートしています。これらのコマンドラインオプションは FindBugs プログラム 自体が操作するのではなく、どちらかといえば、ラップしているスクリプトの方が処理を行います。

-jvmArgs 引数

JVM に受け渡される引数を指定します。例えば、次のような JVM プロパティが設定できます:

$ findbugs -textui -jvmArgs "-Duser.language=ja" myApp.jar

-javahome ディレクトリー

FindBugs の実行に使用する JRE (Java ランタイム環境) がインストールされているディレクトリーを指定します。

-maxHeap サイズ

Java ヒープサイズの最大値をメガバイト単位で指定します。デフォルトは、 256 です。巨大なプログラムやライブラリを分析するには、もっと大きなメモリー容量が必要になる可能性があります。

-debug

ディテクタ実行およびクラス分析のトレース情報が標準出力に出力されます。分析が予期せず失敗した際の、トラブルシューティングに有用です。

-property name=value

このオプションを使用してシステムプロパティーを設定することができます。 FindBugs はシステムプロパティーを使用して分析特性の設定を行います。9章分析プロパティー を参照してください。このオプションを複数指定して、複数のシステムプロパティを設定することが可能です。注: Windows の多くのバージョンでは、 name=value 文字列を引用符で囲む必要があります。

3. コマンドラインオプション

このセクションでは、 FindBugs がサポートするコマンドラインオプションについて説明します。ここで示すコマンドラインオプションは、 FindBugs 直接起動、または、ラップしているスクリプトによる起動で使用できます。

3.1. 共通のコマンドラインオプション

ここで示すオプションは、 GUI および コマンドラインインタフェースの両方で使用できます。

-effort:min

このオプションを指定すると、精度を上げるために大量のメモリーを消費する分析が無効になります。FindBugs の実行時にメモリー不足になったり、分析を完了するまでに異常に長い時間がかかる場合に試してみてください。

-effort:max

精度が高く、より多くのバグを検出する分析を有効にします。ただし、多くのメモリー容量を必要とし、また、完了までの時間が多くかかる可能性があります。

-project project

分析するプロジェクトを指定します。指定するプロジェクトファイルには、 GUI を使って作成したものを使用してください。ファイルの拡張子は、一般的には .fb または .fbp です。

3.2. GUI オプション

ここで示すオプションは、グラフィカルユーザーインタフェースでのみ使用できます。

-look:plastic|gtk|native

Swing のルック・アンド・フィールを設定します。

3.3. テキストユーザーインタフェースオプション

ここで示すオプションは、テキストユーザーインタフェースでのみ使用できます。

-sortByClass

報告されるバグ検索結果をクラス名でソートします。

-include filterFile.xml

filterFile.xml で指定したフィルターに一致したバグ検索結果のみ報告されます。8章フィルターファイル を参照してください。

-exclude filterFile.xml

filterFile.xml で指定したフィルターに一致したバグ検索結果は報告されません。8章フィルターファイル を参照してください。

-onlyAnalyze com.foobar.MyClass,com.foobar.mypkg.*

コンマ区切りで指定したクラスおよびパッケージのみに限定して、バグ検出の分析を行うようにします。フィルターと違って、このオプションを使うと一致しないクラスおよびパッケージに対する分析の実行を回避することができます。大きなプロジェクトにおいて、このオプションを活用すると分析にかかる時間を大きく削減することができる可能性があります。(しかしながら、アプリケーションの全体で実行していないために不正確な結果を出してしまうディテクタがある可能性もあります。) クラスはパッケージも含んだ完全な名前を指定する必要があります。また、パッケージは、 Java の import 文でパッケージ下のすべてのクラスをインポートするときと同じ方法で指定します。 (すなわち、パッケージの完全な名前に .* を付け加えた形です。).* の代わりに .- を指定すると、サブパッケージも含めてすべてが分析されます。

-low

すべてのバグが報告されます。

-medium

優先度 (中) および優先度 (高) のバグが報告されます。これは、デフォルトの設定値です。

-high

優先度 (高) のバグのみが報告されます。

-relaxed

手抜き報告モードです。このオプションを指定すると、多くのディテクタにおいて 誤検出を回避するためのヒューリスティック機能が抑止されます。

-xml

バグ報告が XML で作成されます。作成された XML データは 、後で GUI で見ることができます。このオプションは -xml:withMessages と指定することもできます。こうすると 出力 XML には 各バグに関して人間に読むことができるメッセージが含まれるようになります。このオプションで作成された XML ファイルは 報告書に変換するのが簡単です。

-html

HTML 出力が生成されます。デフォルトでは FindBugsdefault.xsl XSLT スタイルシートを使用して HTML 出力を生成します: このファイルは、 findbugs.jar の中、または、 FindBugs のソース配布物もしくはバイナリ配布物の中にあります。このオプションには、次のようなバリエーションも存在します。すなわち、 -html:plain.xsl-html:fancy.xsl および -html:fancy-hist.xsl です。plain.xsl スタイルシートは Javascript や DOM を利用しません。したがって、古いWeb ブラウザ使用時や印刷時にも比較的うまく表示されるでしょう。fancy.xsl スタイルシートは DOM と Javascript を利用してナビゲーションを行います。また、ビジュアル表示に CSS を使用します。fancy-hist.xslfancy.xsl スタイルシートを更に進化させたものです。DOM や Javascript をふんだんに駆使して、バグの一覧を動的にフィルタリングします。

ユーザー自身の XSLT スタイルシートを用いて HTML への変換を行いたい場合は、 -html:myStylesheet.xsl のように指定してください。ここで、 myStylesheet.xsl はユーザーが使用したいスタイルシートのファイル名です。

-emacs

バグ報告が Emacs 形式で作成されます。

-xdocs

バグ報告が xdoc XML 形式で作成されます。Apache Mavenで使用できます。

-output ファイル名

指定したファイルに出力結果が作成されます。

-outputFile ファイル名

この引数は、使用すべきではありません。代わりに、 -output を使用してください。

-nested[:true|false]

このオプションは、ファイルやディレクトリーの中で入れ子になった jar および zip ファイルを分析するかどうかを指定します。デフォルトでは、入れ子になった jar および zip ファイルも分析します。入れ子になった jar および zip ファイルの分析するを無効にする場合は、 -nested:false をコマンドライン引数に追加してください。

-auxclasspath クラスパス

分析時に使用する補助クラスパスを設定します。分析するプログラムで使用するjarファイルやクラスディレクトリーをすべて指定してください。補助クラスパスに指定したクラスは分析の対象にはなりません。

-auxclasspathFromInput

分析時に使用する補助クラスパスを標準入力から読み込みます。標準入力の各行が分析時に使用する補助クラスパスに追加されます。

-auxclasspathFromFile ファイルパス

分析時に使用する補助クラスパスをファイルから読み込みます。ファイルの各行が分析時に使用する補助クラスパスに追加されます。

-analyzeFromFile ファイルパス

分析対象ファイルをファイルから読み込みます。ファイルの各行が分析対象クラスパスに追加されます。

-userPrefs edu.umd.cs.findbugs.core.prefs

ユーザー設定ファイルのパスを設定します。ユーザー設定ファイルの内容で、他のオプションの一部を上書きすることができます。 userPrefs を一番目の引数に指定した場合は、後続のオプションの方がユーザー設定ファイルの内容に優先します。 userPrefs を最後の引数に指定した場合は、ユーザー設定ファイルの内容の方が前に指定したオプションに優先します。 このオプションを設けた背景・理由は、 Eclipse プロジェクトの FindBugs の設定をコマンドライン実行で再利用するためです。