1<html><head> 2 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 3 <title>第12章 FindBugs™ によるデータ・マイニング</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1"><link rel="home" href="index.html" title="FindBugs™ マニュアル"><link rel="up" href="index.html" title="FindBugs™ マニュアル"><link rel="prev" href="rejarForAnalysis.html" title="第11章 rejarForAnalysis の使用方法"><link rel="next" href="license.html" title="第13章 ライセンス"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">第12章 <span class="application">FindBugs</span>™ によるデータ・マイニング</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="rejarForAnalysis.html">戻る</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="license.html">次へ</a></td></tr></table><hr></div><div class="chapter" title="第12章 FindBugs™ によるデータ・マイニング"><div class="titlepage"><div><div><h2 class="title"><a name="datamining"></a>第12章 <span class="application">FindBugs</span>™ によるデータ・マイニング</h2></div></div></div><div class="toc"><p><b>目次</b></p><dl><dt><span class="sect1"><a href="datamining.html#commands">1. コマンド</a></span></dt><dt><span class="sect1"><a href="datamining.html#examples">2. 例</a></span></dt><dt><span class="sect1"><a href="datamining.html#antexample">3. Ant の例</a></span></dt></dl></div><p>バグデータベースへの高機能の問い合わせ機能、および、調査対象のコードの複数のバージョンにわたる警告の追跡記録機能を、 FindBugs は内蔵しています。これらを使って次のようなことができます。すなわち、いつバグが最初持ち込まれたかを捜し出すこと、最終リリース以後持ち込まれた警告の分析を行うこと、または、無限再起ループの数を時間軸でグラフにすることです。</p><p>これらの技術は、 FindBugs が警告の保存に使う XML 書式を使用します。これらの XML ファイルは、通常、特定の 1 分析に対する警告が入れられています。しかしそれらには、一連のソフトウェアのビルドやバージョンに対する分析結果を格納することもできます。</p><p>すべての FindBugs XML バグデータベースには、バージョン名とタイム・スタンプ が入れられています。FindBugs は分析が行われるファイルの更新時刻からタイム・スタンプを計算します (例えば、タイム・スタンプはクラスファイルの生成時刻になるようになっています。分析が行われた時刻ではありません) 。各々のバグデータベースには、バージョン名も入れられています。バージョン名とタイム・スタンプは、 <span class="command"><strong>setBugDatabaseInfo</strong></span> (<a class="xref" href="datamining.html#setBugDatabaseInfo" title="1.7. setBugDatabaseInfo">「setBugDatabaseInfo」</a>) コマンドを使用して手動で設定することもできます。</p><p>複数バージョンを格納するバグデータベースにおいては、分析されるコードの各バージョンごとにシーケンス番号が割り当てられます。これらのシーケンス番号は単に 0 から始まる連続する整数値です (例えば、 4 つのコードバージョンを格納するバグデータベースには、バージョン 0~3 が入れられます) 。バグデータベースにはまた、各バージョンの名前とタイム・スタンプがそれぞれ記録されます。<span class="command"><strong>filterBugs</strong></span> コマンドを使用すると、シーケンス番号、バージョン名またはタイム・スタンプからバージョンを参照することができます。</p><p>1 バージョンを格納するバグデータベースの集合から、 1 個の複数バージョンバグデータベースを作成することができます。また、複数バージョンバグデータベースに対して、それ以後に作成された 1 バージョンのバグデータベースを結合することができます。</p><p>これらのコマンドのいくつかは、 ant タスクとして実行することができます。コマンドの実行方法および属性・引数の詳細は、以下を参照してください。以下のすべての例においては、 <code class="literal">findbugs.lib</code> <code class="literal">refid</code> が正しく設定されていることを前提としています。設定方法の一例を次に示します :</p><pre class="programlisting"> 4 5 <!-- findbugs タスク定義 --> 6 <property name="findbugs.home" value="/your/path/to/findbugs" /> 7 <path id="findbugs.lib"> 8 <fileset dir="${findbugs.home}/lib"> 9 <include name="findbugs-ant.jar"/> 10 </fileset> 11 </path> 12 13</pre><div class="sect1" title="1. コマンド"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="commands"></a>1. コマンド</h2></div></div></div><p>FindBugs データ・マイニング ツールはすべてコマンドラインから実行することができます。また、いくつかのより有用なコマンドは、 ant ビルドファイルから実行することができます。</p><p>コマンドラインツールについて簡単に説明します :</p><div class="variablelist"><dl><dt><span class="term"><span class="command"><strong><a class="link" href="datamining.html#unionBugs" title="1.1. unionBugs">unionBugs</a></strong></span></span></dt><dd><p>別のクラスに対する別個の分析結果を結合します。</p></dd><dt><span class="term"><span class="command"><strong><a class="link" href="datamining.html#computeBugHistory" title="1.2. computeBugHistory">computeBugHistory</a></strong></span></span></dt><dd><p>複数バージョンから得られた複数のバグ警告を、マージして 1 個の複数バージョンバグデータベースにします。これを使って、既存の複数バージョンバグデータベースに更にバージョンを追加したり、 1 バージョンを格納するバグデータベースの集合から 1 個の複数バージョンバグデータベースを作成したり、できます。</p></dd><dt><span class="term"><span class="command"><strong><a class="link" href="datamining.html#setBugDatabaseInfo" title="1.7. setBugDatabaseInfo">setBugDatabaseInfo</a></strong></span></span></dt><dd><p>リビジョン名やタイム・スタンプなどの情報を XML データベースに設定します。</p></dd><dt><span class="term"><span class="command"><strong><a class="link" href="datamining.html#listBugDatabaseInfo" title="1.8. listBugDatabaseInfo">listBugDatabaseInfo</a></strong></span></span></dt><dd><p>XML データベースにあるリビジョン名やタイム・スタンプなどの情報を一覧表示します。</p></dd><dt><span class="term"><span class="command"><strong><a class="link" href="datamining.html#filterBugs" title="1.3. filterBugs">filterBugs</a></strong></span></span></dt><dd><p>バグデータベースの部分集合を選択します。</p></dd><dt><span class="term"><span class="command"><strong><a class="link" href="datamining.html#mineBugHistory" title="1.4. mineBugHistory">mineBugHistory</a></strong></span></span></dt><dd><p>複数バージョンバグデータベースの各バージョン毎の警告数を一覧にした表を作成します。</p></dd><dt><span class="term"><span class="command"><strong><a class="link" href="datamining.html#defectDensity" title="1.5. defectDensity">defectDensity</a></strong></span></span></dt><dd><p>プロジェクト全体およびクラス毎・パッケージ毎の不良密度 (1000 NCSS 毎の警告数) に関する情報を一覧表示します。</p></dd><dt><span class="term"><span class="command"><strong><a class="link" href="datamining.html#convertXmlToText" title="1.6. convertXmlToText">convertXmlToText</a></strong></span></span></dt><dd><p>XML 形式のバグ警告を、 1 行 1 バグのテキスト形式、または、HTML形式に変換します。</p></dd></dl></div><div class="sect2" title="1.1. unionBugs"><div class="titlepage"><div><div><h3 class="title"><a name="unionBugs"></a>1.1. unionBugs</h3></div></div></div><p>分析するのにアプリケーションの jar ファイルを分割している場合、このコマンドを使用することで、別個に生成された XML バグ警告ファイルをすべての警告を含んでいる 1 つの ファイルにすることができます。</p><p>同じファイルの異なるバージョンを分析した結果を結合する場合は、このコマンドを<span class="emphasis"><em>使用しないでください</em></span>。代わりに <span class="command"><strong>computeBugHistory</strong></span> を使用してください。</p><p>XML ファイルは、コマンドラインで指定してください。結果は、標準出力に送られます。</p></div><div class="sect2" title="1.2. computeBugHistory"><div class="titlepage"><div><div><h3 class="title"><a name="computeBugHistory"></a>1.2. computeBugHistory</h3></div></div></div><p>このコマンドを使用することで、分析するソフトウェアの異なるビルドまたはバージョンの情報を含むバグデータベースを生成することができます入力として提供したファイルの 1 番目のファイルから履歴が取得されます。後に続くファイルは 1 バージョンのバグデータベースであるようにしてください (もし、履歴を持っていたとしても無視されます) 。</p><p>デフォルトでは、結果は標準出力に送られます。</p><p>この機能は、 ant からも使用することができます。まず次に示すように、ビルドファイルに <span class="command"><strong>computeBugHistory</strong></span> を taskdef で定義します :</p><pre class="programlisting"> 14 15<taskdef name="computeBugHistory" classname="edu.umd.cs.findbugs.anttask.ComputeBugHistoryTask"> 16 <classpath refid="findbugs.lib" /> 17</taskdef> 18 19</pre><p>この ant タスクに指定できる属性を、下表に一覧で示します。入力ファイルを指定するには、 <code class="literal"><datafile></code> 要素を入れ子にして入れてください。次に、例を示します:</p><pre class="programlisting"> 20 21<computeBugHistory home="${findbugs.home}" ...> 22 <datafile name="analyze1.xml"/> 23 <datafile name="analyze2.xml"/> 24</computeBugHistory> 25 26</pre><div class="table"><a name="computeBugHistoryTable"></a><p class="title"><b>表12.1 computeBugHistory コマンドのオプション一覧</b></p><div class="table-contents"><table summary="computeBugHistory コマンドのオプション一覧" border="1"><colgroup><col><col><col></colgroup><thead><tr><th align="left">コマンドラインオプション</th><th align="left">Ant 属性</th><th align="left">目的</th></tr></thead><tbody><tr><td align="left">-output <file></td><td align="left">output="<file>"</td><td align="left">出力結果を保存するファイル名を指定します。 (同時に入力ファイルにもなりえます)</td></tr><tr><td align="left">-overrideRevisionNames[:truth]</td><td align="left">overrideRevisionNames="[true|false]"</td><td align="left">ファイル名から算出されるそれぞれのバージョン名を指定変更します。</td></tr><tr><td align="left">-noPackageMoves[:truth]</td><td align="left">noPackageMoves="[true|false]"</td><td align="left">パッケージを移動したクラスがある場合、当該クラスの警告は別の存在として扱われます。</td></tr><tr><td align="left">-preciseMatch[:truth]</td><td align="left">preciseMatch="[true|false]"</td><td align="left">バグパターンが正確に一致することを要求します。</td></tr><tr><td align="left">-precisePriorityMatch[:truth]</td><td align="left">precisePriorityMatch="[true|false]"</td><td align="left">優先度が正確に一致した場合のみ警告が同一であると判断されます。</td></tr><tr><td align="left">-quiet[:truth]</td><td align="left">quiet="[true|false]"</td><td align="left">エラーが発生しない限り、標準出力には何も表示されません。</td></tr><tr><td align="left">-withMessages[:truth]</td><td align="left">withMessages="[true|false]"</td><td align="left">出力 XML に人間が読むことができるバグメッセージが含まれます。</td></tr></tbody></table></div></div><br class="table-break"></div><div class="sect2" title="1.3. filterBugs"><div class="titlepage"><div><div><h3 class="title"><a name="filterBugs"></a>1.3. filterBugs</h3></div></div></div><p>このコマンドを使用することで、 FindBugs XML 警告ファイルから一部分を選び出して新規 FindBugs 警告ファイルに選択された部分を書き込むことができます。</p><p>このコマンドには、オプション群に続いて 0 個から 2 個の findbugs xml バグファイルを指定することができます。</p><p>ファイル名をひとつも指定しない場合は、標準入力から読んで標準出力に出力されます。ファイル名を 1 個 指定した場合は、指定したファイルから読んで標準出力に出力されます。ファイル名を 2 個 指定した場合は、 1 番目に指定したファイルから読んで 2 番目に指定したファイルに出力されます。</p><p>この機能は、 ant からも使用することができます。まず次に示すように、ビルドファイルに <span class="command"><strong>filterBugs</strong></span> を taskdef で定義します :</p><pre class="programlisting"> 27 28<taskdef name="filterBugs" classname="edu.umd.cs.findbugs.anttask.FilterBugsTask"> 29 <classpath refid="findbugs.lib" /> 30</taskdef> 31 32</pre><p>この ant タスクに指定できる属性を、下表に一覧で示します。入力ファイルを指定するには、 <code class="literal">input</code> 属性を使用するか、 <code class="literal"><datafile></code> 要素を入れ子にして入れてください。次に、例を示します:</p><pre class="programlisting"> 33 34<filterBugs home="${findbugs.home}" ...> 35 <datafile name="analyze.xml"/> 36</filterBugs> 37 38</pre><div class="table"><a name="filterOptionsTable"></a><p class="title"><b>表12.2 filterBugs コマンドのオプション一覧</b></p><div class="table-contents"><table summary="filterBugs コマンドのオプション一覧" border="1"><colgroup><col><col><col></colgroup><thead><tr><th align="left">コマンドラインオプション</th><th align="left">Ant 属性</th><th align="left">目的</th></tr></thead><tbody><tr><td align="left"> </td><td align="left">input="<file>"</td><td align="left">入力ファイルを指定します。</td></tr><tr><td align="left"> </td><td align="left">output="<file>"</td><td align="left">出力ファイルを指定します。</td></tr><tr><td align="left">-not</td><td align="left">not="[true|false]"</td><td align="left">フィルターのスイッチを反転します。</td></tr><tr><td align="left">-withSource[:truth]</td><td align="left">withSource="[true|false]"</td><td align="left">ソースが入手可能な警告のみ出力されます。</td></tr><tr><td align="left">-exclude <filter file></td><td align="left">exclude="<filter file>"</td><td align="left">フィルターに一致するバグが除外されます。</td></tr><tr><td align="left">-include <filter file></td><td align="left">include="<filter file>"</td><td align="left">フィルターに一致するバグのみを含まれます。</td></tr><tr><td align="left">-annotation <text></td><td align="left">annotation="<text>"</td><td align="left">手で入力した注釈に指定した文言を含む警告のみ出力されます。</td></tr><tr><td align="left">-after <when></td><td align="left">after="<when>"</td><td align="left">指定したバージョンより後に初めて出現した警告のみ出力されます。</td></tr><tr><td align="left">-before <when></td><td align="left">before="<when>"</td><td align="left">指定したバージョンより前に初めて出現した警告のみ出力されます。</td></tr><tr><td align="left">-first <when></td><td align="left">first="<when>"</td><td align="left">指定したバージョンに初めて出現した警告のみ出力されます。</td></tr><tr><td align="left">-last <when></td><td align="left">last="<when>"</td><td align="left">指定したバージョンが出現した最後である警告のみ出力されます。</td></tr><tr><td align="left">-fixed <when></td><td align="left">fixed="<when>"</td><td align="left">指定したバージョンの前回のバージョンが出現した最後である警告のみ出力されます。 (<code class="option">-last</code> に優先します)。</td></tr><tr><td align="left">-present <when></td><td align="left">present="<when>"</td><td align="left">指定したバージョンに存在する警告のみ出力されます。</td></tr><tr><td align="left">-absent <when></td><td align="left">absent="<when>"</td><td align="left">指定したバージョンに存在しない警告のみ出力されます。</td></tr><tr><td align="left">-active[:truth]</td><td align="left">active="[true|false]"</td><td align="left">最終通番に存在する警告のみ出力されます。</td></tr><tr><td align="left">-introducedByChange[:truth]</td><td align="left">introducedByChange="[true|false]"</td><td align="left">存在するクラスの変更によってもたらされた警告のみ出力されます。</td></tr><tr><td align="left">-removedByChange[:truth]</td><td align="left">removedByChange="[true|false]"</td><td align="left">存在するクラスの変更によって除去された警告のみ出力されます。</td></tr><tr><td align="left">-newCode[:truth]</td><td align="left">newCode="[true|false]"</td><td align="left">新クラスの追加によってもたらされた警告のみ出力されます。</td></tr><tr><td align="left">-removedCode[:truth]</td><td align="left">removedCode="[true|false]"</td><td align="left">クラスの削除によって除去された警告のみ出力されます。</td></tr><tr><td align="left">-priority <level></td><td align="left">priority="<level>"</td><td align="left">指定した優先度以上の優先度をもつ警告のみ出力されます。</td></tr><tr><td align="left">-class <pattern></td><td align="left">class="<class>"</td><td align="left">指定したパターンに一致する主クラスをもつ警告のみ出力されます。</td></tr><tr><td align="left">-bugPattern <pattern></td><td align="left">bugPattern="<pattern>"</td><td align="left">指定したパターンに一致するバグ種別をもつ警告のみ出力されます。</td></tr><tr><td align="left">-category <category></td><td align="left">category="<category>"</td><td align="left">指定した文字列で始まるカテゴリーの警告のみ出力されます。</td></tr><tr><td align="left">-designation <designation></td><td align="left">designation="<designation>"</td><td align="left">指定したバグ分類指定をもつ警告のみ出力されます。 (例、 -designation SHOULD_FIX)</td></tr><tr><td align="left">-withMessages[:truth] </td><td align="left">withMessages="[true|false]"</td><td align="left">テキストメッセージを含んだ XML が生成されます。</td></tr></tbody></table></div></div><br class="table-break"></div><div class="sect2" title="1.4. mineBugHistory"><div class="titlepage"><div><div><h3 class="title"><a name="mineBugHistory"></a>1.4. mineBugHistory</h3></div></div></div><p>このコマンドを使用することで、複数バージョンバグデータベースの各バージョン毎の警告数を一覧にした表を作成することができます。</p><p>この機能は、 ant からも使用することができます。まず次に示すように、ビルドファイルに <span class="command"><strong>mineBugHistory</strong></span> を taskdef で定義します :</p><pre class="programlisting"> 39 40<taskdef name="mineBugHistory" classname="edu.umd.cs.findbugs.anttask.MineBugHistoryTask"> 41 <classpath refid="findbugs.lib" /> 42</taskdef> 43 44</pre><p>この ant タスクに指定できる属性を、下表に一覧で示します。入力ファイルを指定するには、 <code class="literal">input</code> 属性を使用するか、 <code class="literal"><datafile></code> 要素を入れ子にして入れてください。次に、例を示します:</p><pre class="programlisting"> 45 46<mineBugHistory home="${findbugs.home}" ...> 47 <datafile name="analyze.xml"/> 48</mineBugHistory> 49 50</pre><div class="table"><a name="mineBugHistoryOptionsTable"></a><p class="title"><b>表12.3 mineBugHistory コマンドのオプション一覧</b></p><div class="table-contents"><table summary="mineBugHistory コマンドのオプション一覧" border="1"><colgroup><col><col><col></colgroup><thead><tr><th align="left">コマンドラインオプション</th><th align="left">Ant 属性</th><th align="left">目的</th></tr></thead><tbody><tr><td align="left"> </td><td align="left">input="<file>"</td><td align="left">入力ファイルを指定します。</td></tr><tr><td align="left"> </td><td align="left">output="<file>"</td><td align="left">出力ファイルを指定します。</td></tr><tr><td align="left">-formatDates</td><td align="left">formatDates="[true|false]"</td><td align="left">データがテキスト形式で描画されます。</td></tr><tr><td align="left">-noTabs</td><td align="left">noTabs="[true|false]"</td><td align="left">タブの代わりに複数スペースでカラムが区切られます (下記参照)。</td></tr><tr><td align="left">-summary</td><td align="left">summary="[true|false]"</td><td align="left">最新 10 件の変更の要約が出力されます。</td></tr></tbody></table></div></div><br class="table-break"><p><code class="option">-noTabs</code> 出力を使うことで、固定幅フォントのシェルで読み易くなります。数値カラムは右寄せされるので、スペースがカラム値の前に挿入されます。また、このオプションを使用した場合、 <code class="option">-formatDates</code> を指定したときに要約の日付を描画するのに空白が埋め込まれなくなります。</p><p>出力される表は、 (<code class="option">-noTabs</code> が無ければ) タブ区切りで次に示すカラムから成ります :</p><div class="table"><a name="mineBugHistoryColumns"></a><p class="title"><b>表12.4 mineBugHistory 出力のカラム一覧</b></p><div class="table-contents"><table summary="mineBugHistory 出力のカラム一覧" border="1"><colgroup><col><col></colgroup><thead><tr><th align="left">表題</th><th align="left">目的</th></tr></thead><tbody><tr><td align="left">seq</td><td align="left">シーケンス番号 (0 始まりの連続した整数値)</td></tr><tr><td align="left">version</td><td align="left">バージョン名</td></tr><tr><td align="left">time</td><td align="left">リリースされた日時</td></tr><tr><td align="left">classes</td><td align="left">分析されたクラス数</td></tr><tr><td align="left">NCSS</td><td align="left">コメント文を除いた命令数 (Non Commenting Source Statements)</td></tr><tr><td align="left">added</td><td align="left">前回のバージョンに存在したクラスにおける新規警告数</td></tr><tr><td align="left">newCode</td><td align="left">前回のバージョンに存在しなかったクラスにおける新規警告数</td></tr><tr><td align="left">fixed</td><td align="left">現在のバージョンに存在するクラスにおける除去された警告数</td></tr><tr><td align="left">removed</td><td align="left">現在のバージョンに存在しないクラスの前回のバージョンにおける警告数</td></tr><tr><td align="left">retained</td><td align="left">現在のバージョンと前回のバージョンの両方に存在する警告の数</td></tr><tr><td align="left">dead</td><td align="left">以前のバージョンに存在したが現在のバージョンにも直前のバージョンにも存在しない警告の数</td></tr><tr><td align="left">active</td><td align="left">現在のバージョンに存在する警告総数</td></tr></tbody></table></div></div><br class="table-break"></div><div class="sect2" title="1.5. defectDensity"><div class="titlepage"><div><div><h3 class="title"><a name="defectDensity"></a>1.5. defectDensity</h3></div></div></div><p>このコマンドを使用することで、プロジェクト全体およびクラス毎・パッケージ毎の不良密度 (1000 NCSS 毎の警告数) に関する情報を一覧表示できます。標準入力から読み込む場合はファイル指定なしで、そうでなければ、コマンドラインでファイルを指定して、このコマンドを実行します。</p><p>出力される表は、次に示すカラムから成ります。また、プロジェクト全体情報の行、および、4 個以上の警告を含んでいる各パッケージ情報または各クラス情報の行も出力されます。</p><div class="table"><a name="defectDensityColumns"></a><p class="title"><b>表12.5 defectDensity 出力のカラム一覧</b></p><div class="table-contents"><table summary="defectDensity 出力のカラム一覧" border="1"><colgroup><col><col></colgroup><thead><tr><th align="left">表題</th><th align="left">目的</th></tr></thead><tbody><tr><td align="left">kind</td><td align="left">プロジェクト (project)、パッケージ (package) またはクラス (class)</td></tr><tr><td align="left">name</td><td align="left">プロジェクト、パッケージまたはクラスの名前</td></tr><tr><td align="left">density</td><td align="left"> 1000 NCSS 毎の警告数</td></tr><tr><td align="left">bugs</td><td align="left">警告数</td></tr><tr><td align="left">NCSS</td><td align="left">コメント文を除いた命令数 (Non Commenting Source Statements) </td></tr></tbody></table></div></div><br class="table-break"></div><div class="sect2" title="1.6. convertXmlToText"><div class="titlepage"><div><div><h3 class="title"><a name="convertXmlToText"></a>1.6. convertXmlToText</h3></div></div></div><p>このコマンドを使用することで、XML 形式のバグ警告を、 1 行 1 バグのテキスト形式、または、HTML形式に変換することができます。</p><p>この機能は、 ant からも使用することができます。まず次に示すように、ビルドファイルに <span class="command"><strong>convertXmlToText</strong></span> を taskdef で定義します :</p><pre class="programlisting"> 51 52<taskdef name="convertXmlToText" classname="edu.umd.cs.findbugs.anttask.ConvertXmlToTextTask"> 53 <classpath refid="findbugs.lib" /> 54</taskdef> 55 56</pre><p>この ant タスクに指定できる属性を、下表に一覧で示します。</p><div class="table"><a name="convertXmlToTextTable"></a><p class="title"><b>表12.6 convertXmlToText コマンドのオプション一覧</b></p><div class="table-contents"><table summary="convertXmlToText コマンドのオプション一覧" border="1"><colgroup><col><col><col></colgroup><thead><tr><th align="left">コマンドラインオプション</th><th align="left">Ant 属性</th><th align="left">目的</th></tr></thead><tbody><tr><td align="left"> </td><td align="left">input="<filename>"</td><td align="left">入力ファイルを指定します。</td></tr><tr><td align="left"> </td><td align="left">output="<filename>"</td><td align="left">出力ファイルを指定します。</td></tr><tr><td align="left">-longBugCodes</td><td align="left">longBugCodes="[true|false]"</td><td align="left">2 文字のバグ略称の代わりに、省略なしのバグパターンコードを使用します。</td></tr><tr><td align="left"> </td><td align="left">format="text"</td><td align="left">プレーンテキストの出力が作成されます。1 行につき 1 つのバグが出力されます。コマンドライン時のデフォルトです。</td></tr><tr><td align="left">-html[:stylesheet]</td><td align="left">format="html:<stylesheet>"</td><td align="left">指定されたスタイルシートを使用して出力が作成されます (下記参照) 。省略した場合は、 default.xsl が使用されます。</td></tr></tbody></table></div></div><br class="table-break"><p>-html/format オプションには、plain.xsl 、 default.xsl 、 fancy.xsl 、 fancy-hist.xsl または ユーザ自身が作成した XSL スタイルシートのいずれかを指定することができます。オプション名をよそに、 html 以外の形式を出力するスタイルシートを指定することもできます。FindBugs に含まれているスタイルシート(上述)以外のスタイルシートを使用する場合は、オプション -html/format で当該スタイルシートへのパスまたは URL を指定してください。</p></div><div class="sect2" title="1.7. setBugDatabaseInfo"><div class="titlepage"><div><div><h3 class="title"><a name="setBugDatabaseInfo"></a>1.7. setBugDatabaseInfo</h3></div></div></div><p>このコマンドを使用することで、指定したバグ警告にメタ情報を設定することができます。このコマンドには次に示すオプションがあります:</p><p>この機能は、 ant からも使用することができます。まず次に示すように、ビルドファイルに <span class="command"><strong>setBugDatabaseInfo</strong></span> を taskdef で定義します :</p><pre class="programlisting"> 57 58<taskdef name="setBugDatabaseInfo" classname="edu.umd.cs.findbugs.anttask.SetBugDatabaseInfoTask"> 59 <classpath refid="findbugs.lib" /> 60</taskdef> 61 62</pre><p>この ant タスクに指定できる属性を、下表に一覧で示します。入力ファイルを指定するには、 <code class="literal">input</code> 属性を使用するか、 <code class="literal"><datafile></code> 要素を入れ子にして入れてください。次に、例を示します:</p><pre class="programlisting"> 63 64<setBugDatabaseInfo home="${findbugs.home}" ...> 65 <datafile name="analyze.xml"/> 66</setBugDatabaseInfo> 67 68</pre><div class="table"><a name="setBugDatabaseInfoOptions"></a><p class="title"><b>表12.7 setBugDatabaseInfo オプション一覧</b></p><div class="table-contents"><table summary="setBugDatabaseInfo オプション一覧" border="1"><colgroup><col><col><col></colgroup><thead><tr><th align="left">コマンドラインオプション</th><th align="left">Ant 属性</th><th align="left">目的</th></tr></thead><tbody><tr><td align="left"> </td><td align="left">input="<file>"</td><td align="left">入力ファイルを指定します。</td></tr><tr><td align="left"> </td><td align="left">output="<file>"</td><td align="left">出力ファイルを指定します。</td></tr><tr><td align="left">-name <name></td><td align="left">name="<name>"</td><td align="left">最新リビジョンの名前を設定します。</td></tr><tr><td align="left">-timestamp <when></td><td align="left">timestamp="<when>"</td><td align="left">最新リビジョンのタイム・スタンプを設定します。</td></tr><tr><td align="left">-source <directory></td><td align="left">source="<directory>"</td><td align="left">ソースを検索するディレクトリーを追加指定します。</td></tr><tr><td align="left">-findSource <directory></td><td align="left">findSource="<directory>"</td><td align="left">指定したディレクトリー内を検索して関連するソースの場所を追加します。</td></tr><tr><td align="left">-suppress <filter file></td><td align="left">suppress="<filter file>"</td><td align="left">指定したファイルに一致する警告を抑止します (以前に指定した抑止設定は置き換えられます)。</td></tr><tr><td align="left">-withMessages</td><td align="left">withMessages="[true|false]"</td><td align="left">XMLにテキストメッセージを追加します。</td></tr><tr><td align="left">-resetSource</td><td align="left">resetSource="[true|false]"</td><td align="left">ソース検索パスをすべて削除します。</td></tr></tbody></table></div></div><br class="table-break"></div><div class="sect2" title="1.8. listBugDatabaseInfo"><div class="titlepage"><div><div><h3 class="title"><a name="listBugDatabaseInfo"></a>1.8. listBugDatabaseInfo</h3></div></div></div><p>このコマンドの実行においては、コマンドラインで 0 個以上の xml バグデータベースファイル名を指定します。ファイル名を1つも指定しなければ、標準出力から読み込みを行いテーブルのヘッダーは生成されません。</p><p>このコマンドには 1 つだけオプションがあります : <code class="option">-formatDates</code> を指定するとテキスト形式でデータが描画されます。</p><p>出力される表は、各バグデータベースごとに行を持ち、次に示すカラムから成ります :</p><div class="table"><a name="listBugDatabaseInfoColumns"></a><p class="title"><b>表12.8 listBugDatabaseInfo カラム一覧</b></p><div class="table-contents"><table summary="listBugDatabaseInfo カラム一覧" border="1"><colgroup><col><col></colgroup><thead><tr><th align="left">カラム</th><th align="left">目的</th></tr></thead><tbody><tr><td align="left">version</td><td align="left">バージョン名</td></tr><tr><td align="left">time</td><td align="left">リリースされた日時</td></tr><tr><td align="left">classes</td><td align="left">分析されたクラス数</td></tr><tr><td align="left">NCSS</td><td align="left">コメント文を除いた命令数 (Non Commenting Source Statements)</td></tr><tr><td align="left">total</td><td align="left">全警告数</td></tr><tr><td align="left">high</td><td align="left">優先度(高)の警告の総数</td></tr><tr><td align="left">medium</td><td align="left">優先度(中)の警告の総数</td></tr><tr><td align="left">low</td><td align="left">優先度(低)の警告の総数</td></tr><tr><td align="left">filename</td><td align="left">データベースのファイル名</td></tr></tbody></table></div></div><br class="table-break"></div></div><div class="sect1" title="2. 例"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="examples"></a>2. 例</h2></div></div></div><div class="sect2" title="2.1. 提供されたシェル・スクリプトを使用しての履歴マイニング"><div class="titlepage"><div><div><h3 class="title"><a name="unixscriptsexamples"></a>2.1. 提供されたシェル・スクリプトを使用しての履歴マイニング</h3></div></div></div><p>以下はすべて、 jdk1.6.0-b12, jdk1.6.0-b13, ..., jdk1.6.0-b60 のディレクトリに対してコマンドを実行しています。</p><p>以下のコマンドを実行してみます :</p><pre class="screen"> 69computeBugHistory jdk1.6.0-b* | filterBugs -bugPattern IL_ | mineBugHistory -formatDates 70</pre><p>すると、次のような出力が行われます :</p><pre class="screen"> 71seq version time classes NCSS added newCode fixed removed retained dead active 720 jdk1.6.0-b12 "Thu Nov 11 09:07:20 EST 2004" 13128 811569 0 4 0 0 0 0 4 731 jdk1.6.0-b13 "Thu Nov 18 06:02:06 EST 2004" 13128 811570 0 0 0 0 4 0 4 742 jdk1.6.0-b14 "Thu Dec 02 06:12:26 EST 2004" 13145 811786 0 0 2 0 2 0 2 753 jdk1.6.0-b15 "Thu Dec 09 06:07:04 EST 2004" 13174 811693 0 0 1 0 1 2 1 764 jdk1.6.0-b16 "Thu Dec 16 06:21:28 EST 2004" 13175 811715 0 0 0 0 1 3 1 775 jdk1.6.0-b17 "Thu Dec 23 06:27:22 EST 2004" 13176 811974 0 0 0 0 1 3 1 786 jdk1.6.0-b19 "Thu Jan 13 06:41:16 EST 2005" 13176 812011 0 0 0 0 1 3 1 797 jdk1.6.0-b21 "Thu Jan 27 05:57:52 EST 2005" 13177 812173 0 0 0 0 1 3 1 808 jdk1.6.0-b23 "Thu Feb 10 05:44:36 EST 2005" 13179 812188 0 0 0 0 1 3 1 819 jdk1.6.0-b26 "Thu Mar 03 06:04:02 EST 2005" 13199 811770 0 0 0 0 1 3 1 8210 jdk1.6.0-b27 "Thu Mar 10 04:48:38 EST 2005" 13189 812440 0 0 0 0 1 3 1 8311 jdk1.6.0-b28 "Thu Mar 17 02:54:22 EST 2005" 13185 812056 0 0 0 0 1 3 1 8412 jdk1.6.0-b29 "Thu Mar 24 03:09:20 EST 2005" 13117 809468 0 0 0 0 1 3 1 8513 jdk1.6.0-b30 "Thu Mar 31 02:53:32 EST 2005" 13118 809501 0 0 0 0 1 3 1 8614 jdk1.6.0-b31 "Thu Apr 07 03:00:14 EDT 2005" 13117 809572 0 0 0 0 1 3 1 8715 jdk1.6.0-b32 "Thu Apr 14 02:56:56 EDT 2005" 13169 811096 0 0 0 0 1 3 1 8816 jdk1.6.0-b33 "Thu Apr 21 02:46:22 EDT 2005" 13187 811942 0 0 0 0 1 3 1 8917 jdk1.6.0-b34 "Thu Apr 28 02:49:00 EDT 2005" 13195 813488 0 1 0 0 1 3 2 9018 jdk1.6.0-b35 "Thu May 05 02:49:04 EDT 2005" 13457 829837 0 0 0 0 2 3 2 9119 jdk1.6.0-b36 "Thu May 12 02:59:46 EDT 2005" 13462 831278 0 0 0 0 2 3 2 9220 jdk1.6.0-b37 "Thu May 19 02:55:08 EDT 2005" 13464 831971 0 0 0 0 2 3 2 9321 jdk1.6.0-b38 "Thu May 26 03:08:16 EDT 2005" 13564 836565 0 0 0 0 2 3 2 9422 jdk1.6.0-b39 "Fri Jun 03 03:10:48 EDT 2005" 13856 849992 0 1 0 0 2 3 3 9523 jdk1.6.0-b40 "Thu Jun 09 03:30:28 EDT 2005" 15972 959619 0 2 0 0 3 3 5 9624 jdk1.6.0-b41 "Thu Jun 16 03:19:22 EDT 2005" 15972 959619 0 0 0 0 5 3 5 9725 jdk1.6.0-b42 "Fri Jun 24 03:38:54 EDT 2005" 15966 958581 0 0 0 0 5 3 5 9826 jdk1.6.0-b43 "Thu Jul 14 03:09:34 EDT 2005" 16041 960544 0 0 0 0 5 3 5 9927 jdk1.6.0-b44 "Thu Jul 21 03:05:54 EDT 2005" 16041 960547 0 0 0 0 5 3 5 10028 jdk1.6.0-b45 "Thu Jul 28 03:26:10 EDT 2005" 16037 960606 0 0 1 0 4 3 4 10129 jdk1.6.0-b46 "Thu Aug 04 03:02:48 EDT 2005" 15936 951355 0 0 0 0 4 4 4 10230 jdk1.6.0-b47 "Thu Aug 11 03:18:56 EDT 2005" 15964 952387 0 0 1 0 3 4 3 10331 jdk1.6.0-b48 "Thu Aug 18 08:10:40 EDT 2005" 15970 953421 0 0 0 0 3 5 3 10432 jdk1.6.0-b49 "Thu Aug 25 03:24:38 EDT 2005" 16048 958940 0 0 0 0 3 5 3 10533 jdk1.6.0-b50 "Thu Sep 01 01:52:40 EDT 2005" 16287 974937 1 0 0 0 3 5 4 10634 jdk1.6.0-b51 "Thu Sep 08 01:55:36 EDT 2005" 16362 979377 0 0 0 0 4 5 4 10735 jdk1.6.0-b52 "Thu Sep 15 02:04:08 EDT 2005" 16477 979399 0 0 0 0 4 5 4 10836 jdk1.6.0-b53 "Thu Sep 22 02:00:28 EDT 2005" 16019 957900 0 0 1 0 3 5 3 10937 jdk1.6.0-b54 "Thu Sep 29 01:54:34 EDT 2005" 16019 957900 0 0 0 0 3 6 3 11038 jdk1.6.0-b55 "Thu Oct 06 01:54:14 EDT 2005" 16051 959014 0 0 0 0 3 6 3 11139 jdk1.6.0-b56 "Thu Oct 13 01:54:12 EDT 2005" 16211 970835 0 0 0 0 3 6 3 11240 jdk1.6.0-b57 "Thu Oct 20 01:55:26 EDT 2005" 16279 971627 0 0 0 0 3 6 3 11341 jdk1.6.0-b58 "Thu Oct 27 01:56:30 EDT 2005" 16283 971945 0 0 0 0 3 6 3 11442 jdk1.6.0-b59 "Thu Nov 03 01:56:58 EST 2005" 16232 972193 0 0 0 0 3 6 3 11543 jdk1.6.0-b60 "Thu Nov 10 01:54:18 EST 2005" 16235 972346 0 0 0 0 3 6 3 116</pre><p>次に示すコマンドを実行すると、db.xml 中間ファイルを生成することなく直接同じ情報を作成できます。</p><pre class="screen"> 117computeBugHistory jdk1.6.0-b*/jre/lib/rt.xml | filterBugs -bugPattern IL_ db.xml | mineBugHistory -formatDates 118</pre><p>この情報を使って、 Sun JDK1.6.0 の各ビルドにおいて FindBugs によって発見された無限再起ループの数を表すグラフを表示します。青色の領域は、当該ビルドにおける無限再起ループの数を表しています。その上に描かれている赤色の領域は、以前のバージョンには存在したが当該バージョンでは除去された無限再起ループの数を表しています。 (したがって、赤色の領域と青色の領域を足し合わせた高さは決して減少しないことが保証されています。そして、新たに無限再起ループのバグが持ち込まれた時点で増加します) 。赤色の領域の高さは、当該バージョンにおいて修正または削除されたバグ数の合計で算出されます。バージョン 13 および 14 において見られる減少は、 FindBugs を使用して見つかった JDK のバグの報告を Sun が受け取ったことによるものです。</p><div class="mediaobject"><img src="infiniteRecursiveLoops.png"></div><p>db.xml ファイルは、 jdk1.6.0 のすべてのビルドに対する検索結果を保持しています。したがって、次に示すコマンドを実行することで、優先度(高)または優先度(低)の正確性に関する警告の履歴が表示されます :</p><pre class="screen"> 119filterBugs -priority M -category C db.xml | mineBugHistory -formatDates 120</pre><p>作成される表の例 :</p><pre class="screen"> 121seq version time classes NCSS added newCode fixed removed retained dead active 1220 jdk1.6.0-b12 "Thu Nov 11 09:07:20 EST 2004" 13128 811569 0 1075 0 0 0 0 1075 1231 jdk1.6.0-b13 "Thu Nov 18 06:02:06 EST 2004" 13128 811570 0 0 0 0 1075 0 1075 1242 jdk1.6.0-b14 "Thu Dec 02 06:12:26 EST 2004" 13145 811786 3 0 6 0 1069 0 1072 1253 jdk1.6.0-b15 "Thu Dec 09 06:07:04 EST 2004" 13174 811693 2 1 3 0 1069 6 1072 1264 jdk1.6.0-b16 "Thu Dec 16 06:21:28 EST 2004" 13175 811715 0 0 1 0 1071 9 1071 1275 jdk1.6.0-b17 "Thu Dec 23 06:27:22 EST 2004" 13176 811974 0 0 1 0 1070 10 1070 1286 jdk1.6.0-b19 "Thu Jan 13 06:41:16 EST 2005" 13176 812011 0 0 0 0 1070 11 1070 1297 jdk1.6.0-b21 "Thu Jan 27 05:57:52 EST 2005" 13177 812173 0 0 1 0 1069 11 1069 1308 jdk1.6.0-b23 "Thu Feb 10 05:44:36 EST 2005" 13179 812188 0 0 0 0 1069 12 1069 1319 jdk1.6.0-b26 "Thu Mar 03 06:04:02 EST 2005" 13199 811770 0 0 2 1 1066 12 1066 13210 jdk1.6.0-b27 "Thu Mar 10 04:48:38 EST 2005" 13189 812440 1 0 1 1 1064 15 1065 13311 jdk1.6.0-b28 "Thu Mar 17 02:54:22 EST 2005" 13185 812056 0 0 0 0 1065 17 1065 13412 jdk1.6.0-b29 "Thu Mar 24 03:09:20 EST 2005" 13117 809468 3 0 8 26 1031 17 1034 13513 jdk1.6.0-b30 "Thu Mar 31 02:53:32 EST 2005" 13118 809501 0 0 0 0 1034 51 1034 13614 jdk1.6.0-b31 "Thu Apr 07 03:00:14 EDT 2005" 13117 809572 0 0 0 0 1034 51 1034 13715 jdk1.6.0-b32 "Thu Apr 14 02:56:56 EDT 2005" 13169 811096 1 1 0 1 1033 51 1035 13816 jdk1.6.0-b33 "Thu Apr 21 02:46:22 EDT 2005" 13187 811942 3 0 2 1 1032 52 1035 13917 jdk1.6.0-b34 "Thu Apr 28 02:49:00 EDT 2005" 13195 813488 0 1 0 0 1035 55 1036 14018 jdk1.6.0-b35 "Thu May 05 02:49:04 EDT 2005" 13457 829837 0 36 2 0 1034 55 1070 14119 jdk1.6.0-b36 "Thu May 12 02:59:46 EDT 2005" 13462 831278 0 0 0 0 1070 57 1070 14220 jdk1.6.0-b37 "Thu May 19 02:55:08 EDT 2005" 13464 831971 0 1 1 0 1069 57 1070 14321 jdk1.6.0-b38 "Thu May 26 03:08:16 EDT 2005" 13564 836565 1 7 2 6 1062 58 1070 14422 jdk1.6.0-b39 "Fri Jun 03 03:10:48 EDT 2005" 13856 849992 6 39 5 0 1065 66 1110 14523 jdk1.6.0-b40 "Thu Jun 09 03:30:28 EDT 2005" 15972 959619 7 147 11 0 1099 71 1253 14624 jdk1.6.0-b41 "Thu Jun 16 03:19:22 EDT 2005" 15972 959619 0 0 0 0 1253 82 1253 14725 jdk1.6.0-b42 "Fri Jun 24 03:38:54 EDT 2005" 15966 958581 3 0 1 2 1250 82 1253 14826 jdk1.6.0-b43 "Thu Jul 14 03:09:34 EDT 2005" 16041 960544 5 11 15 8 1230 85 1246 14927 jdk1.6.0-b44 "Thu Jul 21 03:05:54 EDT 2005" 16041 960547 0 0 0 0 1246 108 1246 15028 jdk1.6.0-b45 "Thu Jul 28 03:26:10 EDT 2005" 16037 960606 19 0 2 0 1244 108 1263 15129 jdk1.6.0-b46 "Thu Aug 04 03:02:48 EDT 2005" 15936 951355 13 1 1 32 1230 110 1244 15230 jdk1.6.0-b47 "Thu Aug 11 03:18:56 EDT 2005" 15964 952387 163 8 7 20 1217 143 1388 15331 jdk1.6.0-b48 "Thu Aug 18 08:10:40 EDT 2005" 15970 953421 0 0 0 0 1388 170 1388 15432 jdk1.6.0-b49 "Thu Aug 25 03:24:38 EDT 2005" 16048 958940 1 11 1 0 1387 170 1399 15533 jdk1.6.0-b50 "Thu Sep 01 01:52:40 EDT 2005" 16287 974937 19 27 16 7 1376 171 1422 15634 jdk1.6.0-b51 "Thu Sep 08 01:55:36 EDT 2005" 16362 979377 1 15 3 0 1419 194 1435 15735 jdk1.6.0-b52 "Thu Sep 15 02:04:08 EDT 2005" 16477 979399 0 0 1 1 1433 197 1433 15836 jdk1.6.0-b53 "Thu Sep 22 02:00:28 EDT 2005" 16019 957900 13 12 16 20 1397 199 1422 15937 jdk1.6.0-b54 "Thu Sep 29 01:54:34 EDT 2005" 16019 957900 0 0 0 0 1422 235 1422 16038 jdk1.6.0-b55 "Thu Oct 06 01:54:14 EDT 2005" 16051 959014 1 4 7 0 1415 235 1420 16139 jdk1.6.0-b56 "Thu Oct 13 01:54:12 EDT 2005" 16211 970835 6 8 37 0 1383 242 1397 16240 jdk1.6.0-b57 "Thu Oct 20 01:55:26 EDT 2005" 16279 971627 0 0 0 0 1397 279 1397 16341 jdk1.6.0-b58 "Thu Oct 27 01:56:30 EDT 2005" 16283 971945 0 1 1 0 1396 279 1397 16442 jdk1.6.0-b59 "Thu Nov 03 01:56:58 EST 2005" 16232 972193 6 0 5 0 1392 280 1398 16543 jdk1.6.0-b60 "Thu Nov 10 01:54:18 EST 2005" 16235 972346 0 0 0 0 1398 285 1398 16644 jdk1.6.0-b61 "Thu Nov 17 01:58:42 EST 2005" 16202 971134 2 0 4 0 1394 285 1396 167</pre></div><div class="sect2" title="2.2. 増分履歴メンテナンス"><div class="titlepage"><div><div><h3 class="title"><a name="incrementalhistory"></a>2.2. 増分履歴メンテナンス</h3></div></div></div><p>仮に、 db.xml がビルド b12 - b60 に対する findbugs 実行結果を保持している場合、次に示すコマンドを実行することで、 db.xml に b61 に対する実行結果を追加することができます :</p><pre class="screen"> 168computeBugHistory -output db.xml db.xml jdk1.6.0-b61/jre/lib/rt.xml 169</pre></div></div><div class="sect1" title="3. Ant の例"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="antexample"></a>3. Ant の例</h2></div></div></div><p>findbugs の実行とその後のデータ・マイニングツールの活用の両方を実行している ant スクリプトの完全な例を以下に示します :</p><pre class="screen"> 170 171<project name="analyze_asm_util" default="findbugs"> 172 <!-- findbugs タスク定義 --> 173 <property name="findbugs.home" value="/Users/ben/Documents/workspace/findbugs/findbugs" /> 174 <property name="jvmargs" value="-server -Xss1m -Xmx800m -Duser.language=en -Duser.region=EN -Dfindbugs.home=${findbugs.home}" /> 175 176 <path id="findbugs.lib"> 177 <fileset dir="${findbugs.home}/lib"> 178 <include name="findbugs-ant.jar"/> 179 </fileset> 180 </path> 181 182 <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"> 183 <classpath refid="findbugs.lib" /> 184 </taskdef> 185 186 <taskdef name="computeBugHistory" classname="edu.umd.cs.findbugs.anttask.ComputeBugHistoryTask"> 187 <classpath refid="findbugs.lib" /> 188 </taskdef> 189 190 <taskdef name="setBugDatabaseInfo" classname="edu.umd.cs.findbugs.anttask.SetBugDatabaseInfoTask"> 191 <classpath refid="findbugs.lib" /> 192 </taskdef> 193 194 <taskdef name="mineBugHistory" classname="edu.umd.cs.findbugs.anttask.MineBugHistoryTask"> 195 <classpath refid="findbugs.lib" /> 196 </taskdef> 197 198 <!-- findbugs タスク定義 --> 199 <target name="findbugs"> 200 <antcall target="analyze" /> 201 <antcall target="mine" /> 202 </target> 203 204 <!-- 分析を行うタスク--> 205 <target name="analyze"> 206 <!-- asm-util に対して findbugs を実行する --> 207 <findbugs home="${findbugs.home}" 208 output="xml:withMessages" 209 timeout="90000000" 210 reportLevel="experimental" 211 workHard="true" 212 effort="max" 213 adjustExperimental="true" 214 jvmargs="${jvmargs}" 215 failOnError="true" 216 outputFile="out.xml" 217 projectName="Findbugs" 218 debug="false"> 219 <class location="asm-util-3.0.jar" /> 220 </findbugs> 221 </target> 222 223 <target name="mine"> 224 225 <!-- 最新の分析結果に情報を設定する --> 226 <setBugDatabaseInfo home="${findbugs.home}" 227 withMessages="true" 228 name="asm-util-3.0.jar" 229 input="out.xml" 230 output="out-rel.xml"/> 231 232 <!-- 履歴ファイル (out-hist.xml) が既に存在するかどうかを確認する --> 233 <condition property="mining.historyfile.available"> 234 <available file="out-hist.xml"/> 235 </condition> 236 <condition property="mining.historyfile.notavailable"> 237 <not> 238 <available file="out-hist.xml"/> 239 </not> 240 </condition> 241 242 <!-- このターゲットは、履歴ファイルが存在しないとき (初回) だけ実行されます --> 243 <antcall target="history-init"> 244 <param name="data.file" value="out-rel.xml" /> 245 <param name="hist.file" value="out-hist.xml" /> 246 </antcall> 247 <!-- 上記以外の場合に実行されます --> 248 <antcall target="history"> 249 <param name="data.file" value="out-rel.xml" /> 250 <param name="hist.file" value="out-hist.xml" /> 251 <param name="hist.summary.file" value="out-hist.txt" /> 252 </antcall> 253 </target> 254 255 <!-- 履歴ファイルを初期化します --> 256 <target name="history-init" if="mining.historyfile.notavailable"> 257 <copy file="${data.file}" tofile="${hist.file}" /> 258 </target> 259 260 <!-- バグ履歴を算出します --> 261 <target name="history" if="mining.historyfile.available"> 262 <!-- ${data.file} を ${hist.file} にマージします --> 263 <computeBugHistory home="${findbugs.home}" 264 withMessages="true" 265 output="${hist.file}"> 266 <dataFile name="${hist.file}"/> 267 <dataFile name="${data.file}"/> 268 </computeBugHistory> 269 270 <!-- 履歴を算出して ${hist.summary.file} に出力します --> 271 <mineBugHistory home="${findbugs.home}" 272 formatDates="true" 273 noTabs="true" 274 input="${hist.file}" 275 output="${hist.summary.file}"/> 276 </target> 277 278</project> 279 280</pre></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="rejarForAnalysis.html">戻る</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="license.html">次へ</a></td></tr><tr><td width="40%" align="left" valign="top">第11章 rejarForAnalysis の使用方法 </td><td width="20%" align="center"><a accesskey="h" href="index.html">ホーム</a></td><td width="40%" align="right" valign="top"> 第13章 ライセンス</td></tr></table></div></body></html>