← Spring コース
26. Ant: build.xml を1行ずつ読む
は、 の 、その の 、target の中の 、 の値、の順に読みます。project はファイルに1つで、default は引数なしの で動く target、 はパス計算の基準(省略時は build.xml の場所)です。target は task の集まりで、depends に先に行う target を書きます。
property は名前と値の対で、${name} の所に値が入ります。value は文字列のまま、location は絶対パスに直して保存されます。は path として target と同じ階層に置き、( の * 全部)や (1つの場所)を並べ、 の classpathref で id を指して使い回します。各 task の属性は5本目の表にまとめました。
つまずく点が4つあります。property の名前と値の対は では出ず、 の Setting project property: の行に出ます。 で上書きすると build.xml 側は Override ignored と無視されます。ant B C と2つ並べると前提の A は2回走ります。 のある target が1つでもあれば、無い target は に出ません。
点線の付いた語はタップすると説明が出ます。用語集を開く →
1. <project name="app" default="jar" basedir=".">引数なしの ant は jar を実行する。basedir はパス計算の基準で、. は build.xml のあるフォルダ
2. jar の depends を辿る
jar depends="test"test depends="compile,resources"
compile / resourcesどちらも depends="init"
initdepends なし。ここが出発点
Ant が並べ直した実行順(ant run の出力に見出しが出る順)
init → compile → resources → test → jar左から右、ただし依存が先。1つの呼び出しの中では各 target は1回
3. 各 target の中の task と、その属性を読む
<javac srcdir destdir classpathref debug>srcdir の .java を destdir に。debug="true" で javac に -g が付く
<copy todir><fileset dir/></copy>fileset で選んだファイルを todir へ。既定では送り側が新しいときだけ
<jar destfile basedir><manifest>basedir の中身を destfile に。manifest に Main-Class を1行
4. 属性の ${…} を property の値に、classpathref を path の中身に置き換える
<property name="classes.dir" location="build/classes"/>location は絶対パスに直して保存。ant -d の Setting project property: name -> /絶対パス の形で見える
<path id="compile.classpath"><fileset dir="${lib.dir}" includes="*.jar"/>。lib/ 直下の JAR 全部。javac の classpathref で参照
- ・Apache Ant 1.10.18 / JDK 25 での実測です。build.xml の全文と、ant -p、ant run の1回目と2回目の出力はサンプル集にあります。要素と属性の一覧は5本目の表に、マニュアルの原文つきでまとめました
- ・2回目の ant run では compile:、resources:、jar: は見出しだけで何もしませんでしたが、test の junitlauncher は2回目も走りました
- ・Ant のマニュアルの原文: Properties are immutable: whoever sets a property first freezes it for the rest of the build; they are most definitely not variables.
- ・同じく原文: Ant tries to execute the targets in the depends attribute in the order they appear (from left to right). / each target gets executed only once, even when more than one target depends on it. 後者は1つの target の依存木の中での話で、ant B C と並べたときには当てはまりませんでした
- ・ant -p の表示は実測で、description のある target が1つでもあるファイル(73行版)では description の無い init が出ず、1つも無いファイル(ダイヤモンドの例)では全部が Other targets に並びました。マニュアルの原文は Targets without such a description are deemed internal and will not be listed です
- ・npm scripts に近いのは target です。npm にも pre と post という名前で前後に script を付ける仕組みはありますが、depends のように前提を何本でも書いて順番を決めさせる形ではありません
- ・ant -d の Setting project property: の行は、29行版の build.xml(レッスン「ant を実行すると何が起きるか」のもの)で実測しました。73行版の classes.dir についても形は同じですが、行そのものは記録していません
- ・ここで読んだ 73 行版は、前のレッスンの5段を target にするために自作したものです。実務の build.xml の典型例として書いたものではありません。テストの task には JUnit 5 以降用の junitlauncher を使いました
図やコードに出てくる用語(タップで説明)
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗