Javaクラスファイルの依存関係を管理するタスク。
depend
タスクは、ソースに対してどのクラスが古くなっているかを判断し、古くなったクラスに依存する他のクラスのクラスファイルを削除することで動作します。
クラスの依存関係を判断するために、depend
タスクは渡されたすべてのクラスファイルのクラスファイルを分析します。このタスクは、ソースコードを解析するのではなく、コンパイラによってクラスファイルにエンコードされたクラス参照に依存します。これは一般的に、Javaソースファイルを解析するよりも高速です。
クラスファイルからこの情報がどのように取得されるかについての詳細は、Java仮想マシン仕様を参照してください。
クラスの依存関係は、クラス自体が変更された場合にのみ変更されるため、depend
タスクは依存関係情報をキャッシュできます。変更されたクラスファイルのみ、依存関係情報が再分析されます。ソースを変更してクラスの依存関係を変更した場合、クラスはとにかく再コンパイルされることに注意してください。作成された依存関係ファイルを調べて、クラスの依存関係を理解することができます。ただし、情報は将来のリリースで変更される可能性があるため、情報の形式に依存しないでください。
depend
はすべてのクラスの依存関係を検出すると、この関係を「反転」させて、各クラスについて、どの他のクラスがそれに依存しているかを判断します。この「影響を受ける」リストを使用して、古いクラスによって無効化されるクラスを検出します。無効化されたクラスのクラスファイルが削除され、影響を受けるクラスのコンパイルがトリガーされます。
depend
タスクは、depend
が直接のクラスとクラスの関係のみを考慮するか、推移的な間接的な関係も考慮するかを制御する属性closureをサポートしています。たとえば、A、B、Cの3つのクラスがあり、AはBに依存し、BはCに依存しているとします。ここで、クラスCが古くなっているとします。closureがない場合、depend
によって削除されるのはクラスBのみです。closureが設定されている場合、クラスAも削除されます。通常、直接的な関係で十分です。クラスが直接的な関係を持たずに別のクラスに依存することはまれです。closureを設定すると、depend
は通常、はるかに多くのクラスファイルを削除することに気付くでしょう。
<depend>
のclasspath属性はオプションです。存在する場合、depend
はこのクラスパス上のクラスとjarに対してクラスの依存関係をチェックします。このクラスパスの要素に依存し、その要素よりも古いクラスは削除されます。この機能を使用する典型的な例は、ユーティリティjarを構築していて、このjarに対して古いクラスが再構築されるようにする場合です。このクラスパスには、JDKランタイムjarやサードパーティjarなど、変更されないことが予想されるjarを含めないでください。そうすると、依存関係チェックの速度が低下するだけです。これは、depend
タスクにクラスパスを使用する場合、コードを実際にコンパイルするために必要なクラスパスとは異なる場合があることを意味します。
depend
タスクのパフォーマンスは、クラス関係の複雑さや、いくつのクラスファイルが古くなっているかなど、多くの要因に依存します。すべてのクラスを再コンパイルする方が安いか、depend
タスクを使用する方が安いかの決定は、プロジェクトの規模とクラスの相互関係によって異なります。
depend
が検出しないソース依存関係がいくつかあります
depend
もコンパイラタスクも、非パブリッククラスが欠落していることを検出できません。内部クラスは、depend
タスクによって処理されます。これらの制限の最も明白な例は、他のクラスによってエクスポートされた定数プリミティブデータ型が変更されたときに、どのクラスを再コンパイルするかをタスクが判断できないことです。たとえば、次のような定義の変更は、他のクラスによって検出されません。
public final class Constants { public final static boolean DEBUG=false; }
属性 | 説明 | 必須 |
---|---|---|
srcDir | これは、ソースが存在するディレクトリです。depend はこれを調べて、どのクラスが古くなっているかを判断します。複数のソースディレクトリを使用する場合は、この属性にソースディレクトリのパスを渡すことができます。 |
はい |
destDir | これは、分析されるクラスファイルのルートディレクトリです。 | いいえ; デフォルトはsrcdir |
cache | これは、depend が依存関係情報を格納および取得できるディレクトリです。 |
いいえ; デフォルトはキャッシュなし |
closure | この属性は、depend が古いクラスに直接依存するクラスのみを削除するかどうかを制御します。これが「true」に設定されている場合、depend はクラス依存関係グラフをトラバースして、影響を受けるすべてのクラスを削除します。 |
いいえ; デフォルトは「false」 |
dump | trueの場合、依存関係情報はデバッグレベルログに書き込まれます | いいえ; デフォルトは「false」 |
classpath | <depend> が依存関係もチェックする必要があるjarとクラスを含むクラスパス |
いいえ |
warnOnRmiStubs | rmicによって生成されたスタブ/スケルトンクラスのように見え、.javaソースがないファイルに関する警告を無効にするフラグ。RMI開発を行う場合に便利です。 | いいえ; デフォルト「true」 |
depend
タスクのclasspath属性は、パスのような構造であり、ネストされた<classpath>
要素を介して設定することもできます。
さらに、このタスクは暗黙的なFileSetを形成し、<fileset>
のほとんどの属性(dirはsrcdirになる)と、ネストされた<include>
、<exclude>
、および<patternset>
要素をサポートします。
${build.classes}ディレクトリにある、古いクラスに依存するクラスを削除します。クラスは、<javac>
タスクと同じメカニズムを使用して、${java.dir}ディレクトリにあるソースに対して古いと見なされます。この例では、<depend>
タスクは依存関係情報をdepcacheディレクトリにキャッシュします。
<depend srcdir="${java.dir}" destdir="${build.classes}" cache="depcache" closure="yes"/>
前の例と同じことを行いますが、${java.dir}/build_excludesに示されているリストに一致するものを除くすべての.javaファイルを明示的に含めます。
<depend srcdir="${java.dir}" destdir="${build.classes}" cache="depcache" closure="yes"> <include name="**/*.java"/> <excludesfile name="${java.dir}/build_excludes"/> </depend>