1build.xml の全文
前のレッスンの2を でビルドするための です。1行目の ="" が、引数なしの で実行される です。jar は compile に、compile は init に しています。 の行に出てくる src、classes、dist という場所の名前は、この build.xml を書いた人が決めたものです。
<project name="hello" default="jar" basedir="."><description>Smallest Ant build: compile two classes and put them in a JAR</description><property name="src.dir" location="src"/><property name="build.dir" location="build/classes"/><property name="dist.dir" location="dist"/><target name="clean" description="Delete everything this build created"><delete dir="build"/><delete dir="${dist.dir}"/></target><target name="init"><mkdir dir="${build.dir}"/><mkdir dir="${dist.dir}"/></target><target name="compile" depends="init" description="Compile src/ into build/classes/"><javac srcdir="${src.dir}" destdir="${build.dir}" includeantruntime="false"/></target><target name="jar" depends="compile" description="Package build/classes/ into dist/app.jar"><jar destfile="${dist.dir}/app.jar" basedir="${build.dir}"><manifest><attribute name="Main-Class" value="com.example.app.Main"/></manifest></jar></target></project>
21回目の ant: 出力の読み方
引数なしで ant を実行した出力です。init: のような見出しが target の名前で、その下に字下げされた [mkdir] や [] が、実行された とそのメッセージです。init、compile、jar の順に進み、build/ と dist/ ができました。できた は、手で作ったものと同じように で動きます。の Ant-Version の行は、この JAR を書いたのが jar コマンドではなく Ant 自身であることを示しています(jar コマンドで作った JAR に、この行はありませんでした)。
$ antBuildfile: /w/build.xmlinit:[mkdir] Created dir: /w/build/classes[mkdir] Created dir: /w/distcompile:[javac] Compiling 2 source files to /w/build/classesjar:[jar] Building jar: /w/dist/app.jarBUILD SUCCESSFULTotal time: 0 seconds$ find . -type f | sort./build/classes/com/example/app/Main.class./build/classes/com/example/greet/Greeter.class./build.xml./dist/app.jar./src/com/example/app/Main.java./src/com/example/greet/Greeter.java$ java -jar dist/app.jarHello, world!# dist/app.jar の中の META-INF/MANIFEST.MFManifest-Version: 1.0Ant-Version: Apache Ant 1.10.18Created-By: 25.0.4.1+1-LTS (Eclipse Adoptium)Main-Class: com.example.app.Main
32回目の ant は何もしない
何も変えずにもう一度 ant を実行すると、target の見出しだけが出て、下に task の行がありません。target は実行されたものの、task が「することが無い」と判断したという意味です。ソースを1つ更新すると、その1ファイルだけがコンパイルされます。このとき jar: の下が空なのは、Ant の jar が2秒未満の新しさを無視するためで、5秒空けた別の回では JAR も作り直されました。
##### 2nd run: nothing changed$ antBuildfile: /w/build.xmlinit:compile:jar:BUILD SUCCESSFULTotal time: 0 seconds##### 3rd run: touch one source file$ sleep 1; touch src/com/example/greet/Greeter.java; antBuildfile: /w/build.xmlinit:compile:[javac] Compiling 1 source file to /w/build/classesjar:BUILD SUCCESSFULTotal time: 0 seconds
4ant -v で、Ant が javac に渡した引数を見る
-v を付けると、Ant が内側でしていることが出ます。Build sequence の行が、depends を辿って決めた実行順です。Compilation arguments の下が のコンパイラに渡した引数で、手で打った と同じ形をしています。Ant は javac というコマンドを起動するのではなく、自分が動いている の中でコンパイラを呼んでいます。 は Ant が既定で付けるもので、この指定で作ったクラスは、が起きたときの表示に行番号が出ませんでした。
Apache Ant(TM) version 1.10.18 compiled on September 3 2026Trying the default build file: build.xmlBuildfile: /w/build.xmlDetected Java version: 25 in: /opt/java/openjdkDetected OS: Linuxparsing buildfile /w/build.xml with URI = file:/w/build.xmlProject base dir set to: /wparsing buildfile jar:file:/opt/apache-ant-1.10.18/lib/ant.jar!/org/apache/tools/ant/antlib.xml with URI = jar:file:/opt/apache-ant-1.10.18/lib/ant.jar!/org/apache/tools/ant/antlib.xml from a zip fileBuild sequence for target(s) `jar' is [init, compile, jar]Complete build sequence is [init, compile, jar, clean, ]init:[mkdir] Created dir: /w/build/classes[mkdir] Created dir: /w/distcompile:[javac] com/example/app/Main.java added as com/example/app/Main.class doesn't exist.[javac] com/example/greet/Greeter.java added as com/example/greet/Greeter.class doesn't exist.[javac] Compiling 2 source files to /w/build/classes[javac] Using modern compiler[javac] Compilation arguments:[javac] '-d'[javac] '/w/build/classes'[javac] '-classpath'[javac] '/w/build/classes'[javac] '-sourcepath'[javac] '/w/src'[javac] '-g:none'[javac][javac] The ' characters around the executable and arguments are[javac] not part of the command.[javac] Files to be compiled:[javac] /w/src/com/example/app/Main.java[javac] /w/src/com/example/greet/Greeter.java
5target の一覧と、うまくいかない場合
は、build.xml の target のうち の付いたものの一覧と、default を表示します。初めて触るプロジェクトで最初に打つとよいコマンドです(description の無い init は出ません)。存在しない target を指定した場合と、build.xml の無いフォルダで実行した場合は、下のように失敗します。[exit 1] は失敗の終了コードを記録した行です。
$ ant -pBuildfile: /w/build.xmlSmallest Ant build: compile two classes and put them in a JARMain targets:clean Delete everything this build createdcompile Compile src/ into build/classes/jar Package build/classes/ into dist/app.jarDefault target: jar$ ant nosuchBuildfile: /w/build.xmlBUILD FAILEDTarget "nosuch" does not exist in the project "hello".Total time: 0 seconds[exit 1]##### no build.xml in the current directory$ cd /empty && ls -a && ant...Buildfile: build.xml does not exist!Build failed[exit 1]