Apache ant ツール

Apache ant ツールは、複雑なコンパイル作業などを手続きを指示する時に使うツールです。
Linuxではmakeコマンドが使われますが、Javaのような複数のプラットフォームで、 makeコマンドより使いやすいものという目標で、 作られたツールです。
ここに示す所にダウンロードサイトのリンクがあります。
以下は、上記の所から apache-ant-1.8.2-bin.zip をダウンロードして、これを X:\ 直下に解凍した場合の例で示します。

基本的な使い方

上記のようにインストールした場合、 『X:\apache-ant-1.8.2\bin』の中にある『ant』の名前の バッチファイルがこのツールで、コンソール(コマンドプロンプト)で操作します。 利用するには、実行するコマンド探索用環境変数の PATH にこの位置を設定しておくとよいでしょう。
set PATH=X:\apache-ant-1.8.2\bin;%PATH%
また 環境変数でのANT_HOME に、解凍したパスを Antをインストールしたディレクトリ に合わせて設定して使います。
上記の場合であれば、『X:\apache-ant-1.8.2』が ANT_HOME の設定値です。

そしてantを実行すると、『build.xml』の内容に従った処理を行います。

以下で、X:\work 内に srcclass フォルダを作り、 src の中に配置した Test.java を antでコンパイル実行させる『build.xml』の例を示します。
この場合の『build.xml』の内容例を次に示します。 このファイルはX:\work直下に配置します。

<?xml version="1.0" encoding="UTF-8" ?>

<project name="test" default="execute">

	<property name="src" location="./src/"/>
	<property name="class" location="./class"/>

	<target name="compile">
		<echo message="${src}内のソースをコンパイル!"/>
		<javac srcdir="${src}" destdir="${class}" includeantruntime="false"/>
	</target>

	<target name="execute" depends="compile">
		<echo message="${class}内のTestを実行!"/>
		<java classname="Test" classpath="${class}" />
	</target>

</project>

build.xmlには、トップレベルの要素として1つだけ記述する「project」の要素があり、 その中に、「target」「property」の要素を必要に応じて記述します。
またtargetの中で、実際の処理となる各種 task 要素を指定します。ここでは、echo javac javaのタスクを使っています。
まず「project」要素では name属性に名前を付け、実行させたいtargetの名前をdefualt属性に指定します。 つまりこの場合は、executeの名前が付いているtargetの部分が実行されます。
それにより echo タスクでメッセージを表示して、javaタスクで classのホルダ内のTestクラスを実行しようとします。 しかしtarget要素に depends="compile"の記述があり、 それにより依存しているcompileの名前のtargetが先行して実行することになります。 よって、先にjavacのコンパイラが実行することになります。
property(プロパティ)はタスク内で使用できる変数を宣言します。 これは他の要素で、${name}の変数値で参照できます。 なお、JavaAPIのシステムプロパティをあらかじめ設定された変数として参照することもできます。

srcフォルダ内に次のTest.javaがあるとします。これはシステムプロパティを列挙表示するプログラムです。

public class Test{
	public static void main(String args[]) throws Exception {
		System.out.println("システムプロパティ表示プログラム");
		java.util.Properties property = System.getProperties();
		java.util.Enumeration e = property.propertyNames(); 
		while(e.hasMoreElements()){//次があるか?
			String key = (String)e.nextElement();//次を取得
			String val = property.getProperty(key);//このプロパティ名の値取得
			System.out.print( key + "='" + val + "' ");
		}
		System.out.println();
	}
}

この時に、ant を実行した時の様子を以下に示します。

X:\work>ant
Buildfile: X:\work\build.xml

compile:
     [echo] X:\work\src内のソースをコンパイル!

execute:
     [echo] X:\work\class内のTestを実行!
     [java] システムプロパティ表示プログラム
     [java] java.runtime.name='Java(TM) SE Runtime Environment' sun.boot.library
.path='X:\Java\jdk1.6.0_26\jre\bin' java.vm.version='20.1-b02' ant.library.dir='
X:\apache-ant-1.8.2\lib' java.vm.vendor='Sun Microsystems Inc.' java.vendor.url=
'http://java.sun.com/' path.separator=';' java.vm.name='Java HotSpot(TM) Client
VM' file.encoding.pkg='sun.io' user.country='JP' sun.java.launcher='SUN_STANDARD
' sun.os.patch.level='Service Pack 1' java.vm.specification.name='Java Virtual M
achine Specification' user.dir='X:\work' java.runtime.version='1.6.0_26-b03' jav
a.awt.graphicsenv='sun.awt.Win32GraphicsEnvironment' java.endorsed.dirs='X:\Java
\jdk1.6.0_26\jre\lib\endorsed' os.arch='x86' java.io.tmpdir='C:\Users\yuu\AppDat
a\Local\Temp\' line.separator='
     [java] ' java.vm.specification.vendor='Sun Microsystems Inc.' user.variant=
'' os.name='Windows 7' ant.home='X:\apache-ant-1.8.2' sun.jnu.encoding='MS932' j
ava.library.path='X:\Java\jdk1.6.0_26\bin;C:\Windows\Sun\Java\bin;C:\Windows\sys
tem32;C:\Windows;X:\Java\jdk1.6.0_26\bin;X:\apache-ant-1.8.2\bin;X:\android-sdk-
windows\tools;\android-sdk-windows\platform-tools;C:\Windows\system32;C:\Windows
;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;.' java.sp
ecification.name='Java Platform API Specification' java.class.version='50.0' sun
.management.compiler='HotSpot Client Compiler' os.version='6.1' user.home='C:\Us
ers\yuu' user.timezone='Asia/Tokyo' java.awt.printerjob='sun.awt.windows.WPrinte
rJob' file.encoding='MS932' java.specification.version='1.6' user.name='yuu' jav
a.class.path='X:\apache-ant-1.8.2\lib\ant-launcher.jar;X:\work\.\;X:\Java\jdk1.6
.0_26\;X:\apache-ant-1.8.2\lib\ant-antlr.jar;X:\apache-ant-1.8.2\lib\ant-apache-
bcel.jar;X:\apache-ant-1.8.2\lib\ant-apache-bsf.jar;X:\apache-ant-1.8.2\lib\ant-
apache-log4j.jar;X:\apache-ant-1.8.2\lib\ant-apache-oro.jar;X:\apache-ant-1.8.2\
lib\ant-apache-regexp.jar;X:\apache-ant-1.8.2\lib\ant-apache-resolver.jar;X:\apa
che-ant-1.8.2\lib\ant-apache-xalan2.jar;X:\apache-ant-1.8.2\lib\ant-commons-logg
ing.jar;X:\apache-ant-1.8.2\lib\ant-commons-net.jar;X:\apache-ant-1.8.2\lib\ant-
jai.jar;X:\apache-ant-1.8.2\lib\ant-javamail.jar;X:\apache-ant-1.8.2\lib\ant-jde
pend.jar;X:\apache-ant-1.8.2\lib\ant-jmf.jar;X:\apache-ant-1.8.2\lib\ant-jsch.ja
r;X:\apache-ant-1.8.2\lib\ant-junit.jar;X:\apache-ant-1.8.2\lib\ant-junit4.jar;X
:\apache-ant-1.8.2\lib\ant-launcher.jar;X:\apache-ant-1.8.2\lib\ant-netrexx.jar;
X:\apache-ant-1.8.2\lib\ant-swing.jar;X:\apache-ant-1.8.2\lib\ant-testutil.jar;X
:\apache-ant-1.8.2\lib\ant.jar;X:\Java\jdk1.6.0_26\lib\tools.jar' java.vm.specif
ication.version='1.0' sun.arch.data.model='32' java.home='X:\Java\jdk1.6.0_26\jr
e' sun.java.command='org.apache.tools.ant.launch.Launcher -cp .;X:\Java\jdk1.6.0
_26' java.specification.vendor='Sun Microsystems Inc.' user.language='ja' awt.to
olkit='sun.awt.windows.WToolkit' java.vm.info='mixed mode' java.version='1.6.0_2
6' java.ext.dirs='X:\Java\jdk1.6.0_26\jre\lib\ext;C:\Windows\Sun\Java\lib\ext' s
un.boot.class.path='X:\Java\jdk1.6.0_26\jre\lib\resources.jar;X:\Java\jdk1.6.0_2
6\jre\lib\rt.jar;X:\Java\jdk1.6.0_26\jre\lib\sunrsasign.jar;X:\Java\jdk1.6.0_26\
jre\lib\jsse.jar;X:\Java\jdk1.6.0_26\jre\lib\jce.jar;X:\Java\jdk1.6.0_26\jre\lib
\charsets.jar;X:\Java\jdk1.6.0_26\jre\lib\modules\jdk.boot.jar;X:\Java\jdk1.6.0_
26\jre\classes' java.vendor='Sun Microsystems Inc.' file.separator='\' java.vend
or.url.bug='http://java.sun.com/cgi-bin/bugreport.cgi' sun.cpu.endian='little' s
un.io.unicode.encoding='UnicodeLittle' sun.desktop='windows' sun.cpu.isalist='pe
ntium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86'

BUILD SUCCESSFUL
Total time: 0 seconds

X:\work>

なお、compileの名前のターゲットで指定されるタスクで、javacのタスクを実行していますが、 その属性でのincludeantruntimeは、Antのランタイムライブラリをクラスパスに含むかという設定です(デフォルトでtrue)。 上記の実行ではあらかじめ CLASSPATHの設定を次のように指定した状態で実行しているで、そのクラスサーチだけ使う指定です。

X:\work>echo %CLASSPATH%
.;X:\Java\jdk1.6.0_26
X:\work>