Antは、Makeと同様に、中断したときにどこを続行するかを理解するのに非常に優れています。ソースが更新されない限り、<javac>
タスクはコードを再コンパイルしません。この<copy>
タスクは、デフォルトではファイルを再コピーしません。ただし、ビルドを複数のファイルに分割してから、のパラメーターを使用<ant>
する代わりにタスクを使用すると、このシステムが分割されます。depends
<target>
独立したプロジェクトA、B、C、およびDがあるとします。あなたbuild.xml
がすることは、それぞれの正しいターゲットを呼び出すことだけです。それぞれがjarファイルを作成するとします。そして、JavaエラーのためにプロジェクトCでプロセスが中断しました。開発者はそれを修正しました。もう一度実行するbuild.xml
と、プロジェクトAとBが再度呼び出されます。ただし、これらのプロジェクトはすでに構築されているため、何も実行しないでください。AとBの呼び出しが表示されますが、何も起こりません。
プロジェクトCでも、ビルドプロセスは中断したところから開始されます。つまり、Antのビルドを理解する能力を壊すために何もしなかった場合です。
Antを壊す方法はたくさんあります。たとえば、ビルドプロセス中にファイルを削除しないでください。ターゲットファイルが存在しない場合、Antはタイムスタンプを使用して何をすべきかを判断できません。
場合によっては、プロセスでビルドを回避するために少しの助けが必要になります。Antには<uptodate>
タスクが組み込まれていますが、<outofdate>
はるかに使いやすいと思います。たとえば、プロジェクトAがプロジェクトBが使用するjarファイルを生成するとします。jarで使用されるクラスファイルとリソースがjarのタイムスタンプよりも古い場合は、これらのタスクの1つを使用してそのjarをコピーしないようにすることができます。
それ以外の場合、jarをプロジェクトBに盲目的にコピーした場合、プロジェクトBは、クラスファイルが依存するファイルが更新されたことを確認します。したがって、プロジェクトBはすべてを再コンパイルします。次に、すべてをコピーし、構築していたjarファイルまたは戦争を再構築します。Javaクラスファイルを直接更新するサードパーティのタスクに問題があり、コンパイルを2回実行しないように監視ファイルを使用する必要がありました。特に、クラスファイルを変更するタスクを実行する必要がありました。
ちなみに、Antが実行していると言っているターゲットに腹を立てないでください。Antはそれらのターゲットを実行しますが、何かが更新されない限り、それらのターゲットを構成するタスクは実行されません。
更新:<outofdate>
FromAnt-Contribの使用
マスタープロジェクトファイルに、次のターゲットがあるとします。
<target name="build"
description="Builds every sub project">
<ant antfile=${project.a.dir}/build.xml target="build"/>
<ant antfile=${project.b.dir}/build.xml target="build"/>
<ant antfile=${project.c.dir}/build.xml target="build"/>
<ant antfile=${project.d.dir}/build.xml target="build"/>
使用<outofdate>
:
<target name="build"
description="Builds every sub project">
<outofdate>
<sourcefiles>
<fileset dir="${project.a.srcdir}"/>
</sourcefiles>
<targetfiles>
<fileset dir="${project.a.dir}/target">
<include name="*.jar"/>
</fileset>
</targetfiles>
<sequential>
<ant antfile=${project.a.dir}/build.xml
target="build"/>
</sequential>
</outofdate>
<outofdate>
<sourcefiles>
<fileset dir="${project.b.srcdir}"/>
</sourcefiles>
<targetfiles>
<fileset dir="${project.a.dir}/target">
<include name="*.jar"/>
</fileset>
</targetfiles>
<sequential>
<echo>CALLING PROJECT: ${project.b.dir}</echo>
<ant antfile=${project.b.dir}/build.xml
target="build"/>
</sequential>
</outofdate>
<etc, etc, etc/>
正しく設定されていれば、おそらくAnt-Contrib<for>
ループですべてを実行できるので、サブプロジェクトごとにこれを実行する必要はありません。
これがもっと速いかどうかはわかりません。タスクは<outofdate>
引き続きすべてのファイルを調べて日付を比較する必要がありますが、少なくとも、サブプロジェクトファイル内のすべてのターゲットを呼び出すことはありません。