Dev Study
← 解説「ant を実行すると何が起きるか」に戻る

サンプルコードで身につける: ant を実行すると何が起きるか

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

1build.xml の全文

前のレッスンの2を でビルドするための です。1行目の ="" が、引数なしの で実行される です。jar は compile に、compile は init に しています。 の行に出てくる src、classes、dist という場所の名前は、この build.xml を書いた人が決めたものです。

build.xml(29行)設定ファイル
<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 に、この行はありませんでした)。

$ ant(1回目。Ant 1.10.18。# の行は補足)コマンド出力
$ ant
Buildfile: /w/build.xml
 
init:
[mkdir] Created dir: /w/build/classes
[mkdir] Created dir: /w/dist
 
compile:
[javac] Compiling 2 source files to /w/build/classes
 
jar:
[jar] Building jar: /w/dist/app.jar
 
BUILD SUCCESSFUL
Total 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.jar
Hello, world!
 
# dist/app.jar の中の META-INF/MANIFEST.MF
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.10.18
Created-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 も作り直されました。

$ ant(2回目と、ソースを1つ更新した後)コマンド出力
##### 2nd run: nothing changed
$ ant
Buildfile: /w/build.xml
 
init:
 
compile:
 
jar:
 
BUILD SUCCESSFUL
Total time: 0 seconds
 
##### 3rd run: touch one source file
$ sleep 1; touch src/com/example/greet/Greeter.java; ant
Buildfile: /w/build.xml
 
init:
 
compile:
[javac] Compiling 1 source file to /w/build/classes
 
jar:
 
BUILD SUCCESSFUL
Total time: 0 seconds

4ant -v で、Ant が javac に渡した引数を見る

-v を付けると、Ant が内側でしていることが出ます。Build sequence の行が、depends を辿って決めた実行順です。Compilation arguments の下が のコンパイラに渡した引数で、手で打った と同じ形をしています。Ant は javac というコマンドを起動するのではなく、自分が動いている の中でコンパイラを呼んでいます。 は Ant が既定で付けるもので、この指定で作ったクラスは、が起きたときの表示に行番号が出ませんでした。

$ ant -v(1回目。50行のうち前半)追跡ログ
Apache Ant(TM) version 1.10.18 compiled on September 3 2026
Trying the default build file: build.xml
Buildfile: /w/build.xml
Detected Java version: 25 in: /opt/java/openjdk
Detected OS: Linux
parsing buildfile /w/build.xml with URI = file:/w/build.xml
Project base dir set to: /w
parsing 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 file
Build 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/dist
 
compile:
[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 -p、存在しない target、build.xml が無い場所コマンド出力
$ ant -p
Buildfile: /w/build.xml
Smallest Ant build: compile two classes and put them in a JAR
Main targets:
 
clean Delete everything this build created
compile Compile src/ into build/classes/
jar Package build/classes/ into dist/app.jar
Default target: jar
 
$ ant nosuch
Buildfile: /w/build.xml
 
BUILD FAILED
Target "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]

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