Ant メモ
ファイルのコピー
ソースツリーの中に .properties ファイルが散在していると、 いちいちファイル名を指定してコピーするなんて ちょっと馬鹿馬鹿しくてやってられない。 そういう時は、copy タスクを使う。
<target name="copyproperties"> <copy todir="${class.dir}"> <fileset dir="${source.dir}" includes="**/*.properties" /> </copy> </target>
サクっとコピーできるので、楽ちんである。
プラットフォームの判別
どうしてもプラットフォームごとの作業を切り替えたい場合は、 os 関連のプロパティを見るとプラットフォームの判別ができる。 簡単なのはそれぞれことにプロパティファイルを用意してしまう作戦だ。
<property file="${os.name}.properties"/>
Windows は邪悪なため、os.name は "Windows XP" とか "Windows 2000" とか 言ってくる。これらをまとめるには、os family を使えばよい。 ただし、java のプロパティとして用意されているわけではなく、 Ant の os タスクの機能を使うことになる。
<condition property="iswindows"> <os family="windows"/> </condition>
ant-contrib に入っている if タスクと組み合わせれば、 もっと複雑なこともシンプルに書ける。が、割愛する。
Java8 への対応
javac1.8 が not found という具合のエラーが出る場合、 Java 8 への対応の問題である可能性がある。
要するに Ant 1.8.x の javac タスクは Java 8 で動かない。
解法は、1.9.x に上げることである。
JUnit 4.x への対応
別に普通に jar を CLASSPATH に入るように build.xml を書くだけなのだが、 assertThat で Matcher を使おうとすると ant test した際に LinkageError が出る …場合がある。
java.lang.LinkageError: loader constraint violation: loader (instance of java/net/URLClassLoader) previously initiated loading for a different type with name "org/hamcrest/Matcher"
そんなん知るか、という話である。 こいつが出る時は、 ant を呼び出す時点の環境変数 CLASSPATH が邪魔している。未設定にするのがよい。