Dev Study
← Spring コース

16. ant を実行すると何が起きるか

と打つと、ant という起動用のスクリプトが を起動し、その の中で 本体(Java で書かれたプログラム)が動きます。Ant はカレントディレクトリの を読み、そこに書かれた手順を順に実行します。手順のまとまりを と呼びます。レッスン「ソースから起動まで」に出てきた の フォルダとは無関係の、同じ綴りの別の言葉です。

引数なしなら、 属性に書かれた target が選ばれます。 で先に済ませる target を書けるので、Ant はそれを辿って順番を決めます。target の中身は の並びで、task はシェルのコマンドではなく、Ant の中の Java の部品です。 の task は のコンパイラを同じ JVM の中で呼び、 の task は Ant 自身が を書きます。

できあがるのは、前のレッスンで手で打ったときと同じ形の と JAR です。ただし javac や jar というコマンドは起動していません。2回目の ant は、ソースと .class の更新時刻を比べ、変更が無ければ何もしません。Ant は何をどこに置くかも決めていません。src、build、dist という名前は build.xml に各自が書いたもので、build.xml を読まないと構成が分かりません。

点線の付いた語はタップすると説明が出ます。用語集を開く →

引数なしの ant が実行する順(build.xml の default は jar)
ant起動用のスクリプト。java を起動する
java が起動する
Ant 本体(JVM の中で動く)カレントディレクトリの build.xml を読む
default="jar" から depends を辿る(jar → compile → init)
target: initmkdir の task が build/classes と dist を作る
次の target へ
target: compilejavac の task が、同じ JVM の中で JDK のコンパイラを呼ぶ
次の target へ
target: jarjar の task が、Ant 自身で dist/app.jar を書く
もう一度 ant を実行すると
init: / compile: / jar: の見出しだけ変更が無いので、どの task も何もしない
  • ・Apache Ant 1.10.18 と JDK 25 での実行です。build.xml の全文と出力はサンプル集にあります
  • ・ant の実行中に OS が起動した実行ファイルを strace で記録すると、ant のスクリプト、uname(3回)、java だけで、javac や jar というコマンドは1度も起動されていませんでした(Linux のコンテナで1回)。javac の task が外部のコンパイラを起動するかを決める fork 属性は、既定で no です
  • ・Ant のマニュアルは、Ant を make のようなもの(kind of like make)と紹介したうえで、シェルのコマンドを書くのではなく Java のクラスで拡張する点が違うと説明しています
  • ・同じ build.xml にある clean という target は、どこからも depends されていないので、ant clean と名指ししない限り実行されません
  • ・公式サイトの原文: Ant is extremely flexible and does not impose coding conventions or directory layouts to the Java projects which adopt it as a build tool.
  • ・Ant が決めている名前は build.xml というファイル名だけで、それも -f で変えられます
  • ・変更の有無はファイル名と更新時刻で判定します。ソースの中身は見ていません
  • ・Ant 本体は依存の JAR を取ってきません。人が置くか、Ivy という別の道具を組み合わせます(Ivy は「ビルドツールを読む」の Ant の依存の回で実際に動かします)

図やコードに出てくる用語(タップで説明)

サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗