Ant が新しいソースを持つ依存関係の再構築に失敗する原因を突き止めようとしています。
いくつかのパッケージがあり、それぞれが Ant に独自のビルド ターゲットを持っています。ターゲットの 1 つである mds は、別のターゲットである robotsim に依存しています。依存関係のリストにそれを追加しないと、おかしな動作になり、時々しかビルドされないので、いつ、どのような理由でビルドするかを知りたいです。
$ ant clean mds
...
BUILD SUCCESSFUL
この時点で、robotsim パッケージの Java ファイルを開き、セミコロンを削除します。
$ ls -l src/com/robotsim/model/Robot.java
-rw-rw-r-- 1 matt matt 6.3K 2012-05-15 14:28 src/com/robotsim/model/Robot.java
$ ls -l build/com/robotsim/model/Robot.class
-rw-rw-r-- 1 matt matt 6.6K 2012-05-15 14:13 build/com/robotsim/model/Robot.class
$ ant mds
...
BUILD SUCCESSFUL
$ ant clean mds
...
[javac] Robot.java:110: ';' expected
...
BUILD FAILED
問題は、なぜ 2 番目のビルドが成功したのかということです。
build.xml の関連部分を含めるように編集します。
<target name='init'>
<mkdir dir='${build.dir}'/>
<mkdir dir='${dist.dir}'/>
</target>
...
<target name='customTasks'>
<javac srcdir='${customTasks.src.dir}' destdir='${ant.library.dir}' classpathref='customTasks.classpath' failonerror='false'/>
<taskdef name='protoc' classname='com.hrilab.Protoc' classpath="${ant.library.dir}"/>
</target>
...
<target name='algorithms' depends='init' extensionOf='compile' description='Builds a few generic algorithms'>
<build-java package.dir='com/algorithms'/>
</target>
...
<target name='engine3d' depends='init' extensionOf='compile' description='Builds the 3D engine'>
<build-java package.dir='com/engine3D'/>
</target>
...
<target name='humanoid' depends='init,utilities' extensionOf='compile' description='Builds the humanoid servers.'>
<build-java package.dir='com/humanoid'/>
</target>
...
<target name='mds' depends='init,algorithms,engine3d,humanoid' extensionOf='compile' description='Builds the servers for the Xitome MDS.'>
<build-java package.dir='com/mds'/>
</target>
...
<target name='robotsim' depends='init,customTasks' extensionOf='compile' description='Builds the 3D robot simulator'>
<protoc minversion='2.4.0' srcfile='com/robotsim/calibration/leng/calibration_server_config.proto' destdir='${src.dir}'/>
<protoc minversion='2.4.0' srcfile='com/robotsim/calibration/leng/extrinsic_parameters_collection.proto' destdir='${src.dir}'/>
<build-java package.dir='com/robotsim'/>
</target>
...
<target name='utilities' depends='init' extensionOf='compile' description='Builds some common utilities'>
<build-java package.dir='utilities'/>
</target>
...
<macrodef name='build-java'>
<attribute name='classpath' default='base.classpath'/>
<attribute name='package.dir' default='NOT SET'/>
<attribute name='package.mask' default='**'/> <!-- HACK: please do not use this attribute, it's only here to hack around the way we have our source laid out -->
<sequential>
<javac srcdir='${src.dir}' destdir='${build.dir}' includes='@{package.dir}/@{package.mask}' debug='${debug.enabled}' debuglevel='${debug.level}'>
<classpath refid='@{classpath}'/>
</javac>
</sequential>
</macrodef>