Apache ant の記述方法1

projecty要素

build.xmlに1つだけ存在するもので、次の属性があります。

属性名必須説明
nameプロジェクト名を指定する。
default×このプロジェクトで実行するターゲット名
basedir×ビルド処理を行う時のディレクトリを指定します。(指定しない場合は、build.xmlが在るディレクトリ)

project要素内の encoding="UTF-8" とこのファイルの保存に使った文字セットが異なるとエラーになります。 このproject要素の中にtarget、property要素を配置します。 また、target要素の中に、行わせるタスク要素を書きます。 利用できるタスクは数多くあるので、マニュアルで希望のタスクを確認しながら記述します。 (ここでは、概要と主要な属性だけ説明して説明しています。)
project以外の要素は必要に応じて書きます。以下はproperty要素を使っていない例です。 target内のタスク要素は、最も単純なecho要素の システムプロパティを表示する記述例です。

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

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

	<target name="step1">
		<echo message="${os.name}の値があるos.name"/>
	</target>

	<target name="step2">
		<echo message="${sun.boot.library.path}の値があるsun.boot.library.path"/>
	</target>
</project>

antのコマンドライン引数

ant命令は、カレントディレクトリにあるbuild.xmlのファイルを指示書として使いますが、 -fオプションで指定のファイルを指示書として指定できます。 以下の実行例は、上記のXMLの内容のproc.xmlのファイルがある場合に、このファイルを指定した実行例です。

X:\work>ant -f proc.xml
Buildfile: X:\work\proc.xml

step1:
     [echo] Windows 7の値があるos.name

BUILD SUCCESSFUL
Total time: 0 seconds

X:\work>

上記ではプロジェクトで指定しているdefaultターゲットが、step1なので、そのタスクだけを実行しています。 しかし、このXML例のように、複数のターゲットを書いていれば、そのターゲットの名前をコマンドライン引数で指定することで実行できます。
以下は、step2のターゲットを指定して実行している例です。

X:\work>ant -f proc.xml step2
Buildfile: X:\work\proc.xml

step2:
     [echo] X:\Java\jdk1.6.0_26\jre\binの値があるsun.boot.library.path

BUILD SUCCESSFUL
Total time: 0 seconds

X:\work>

antのコマンドライン引数では、実行させたいターゲット名を、実行させる順番に並べて指示する書き方もできます。 以下の例では、step2 step1の順でターゲットを実行させています。

X:\work>ant -f proc.xml step2 step1
Buildfile: X:\work\proc.xml

step2:
     [echo] X:\Java\jdk1.6.0_26\jre\binの値があるsun.boot.library.path

step1:
     [echo] Windows 7の値があるos.name

BUILD SUCCESSFUL
Total time: 0 seconds

X:\work>

antのpropty要素

プロパティはタスク内で使用できる変数を宣言します。
属性名必須概要
name変数の名前
value設定値
以下に例を示します。ここでは、sourceの名前の変数に、値を設定しています。
<property name="source" value="X:/work/src"/>
変数値は${変数名}で参照できます。 ですからタスク要素などで、${source}の表現は、X:/work/srcとなります。

antのtarget要素

ビルドで処理したいタスク要素のまとまりを書きます。 この中に書いたタスク要素は、書いた順番に処理されます。以下にここで指定できる属性を示します。
属性名必須概要
nameターゲットの名前
depends×依存するターゲットのnameを指定します。ここで指定したターゲットが正常に実行された後に、このターゲットが実行します。( ,のカンマで複数指定可能)
if×このターゲットが実行するために必要なプロパティ名を指定します。(指定がなければ実行しない)
unless×if属性の逆(そのプロパティ指定がない場合だけ実行できます)
description×ターゲットの概要を記述する部分

以下は、UdpReply.javaのソースファイルから実行可能ファイルのudpreply.jarを作成するXMLです。 コンパイル結果のクラスをworkディレクトリ入れてjarに圧縮して、最後にこの作業用ディレクトリを削除しています。
build のターゲットがこのXMLのdefault指定で、このターゲットのdependsにcompileターゲットがが指定しているので、 そのターゲットのコンパイル処理が先行します。

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

<project name="UdpReply" default="build">

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

	<target name="compile">
		<!-- ディレクトリの作成 -->
  		<mkdir dir="${class}"/>
		<echo message="${class}内へコンパイルして格納"/>
		<javac srcdir="." destdir="${class}" includes="UdpReply.java" includeantruntime="false"/>
	</target>

	<target name="build" depends="compile">
		<echo message="jarファイル作成"/>
		<jar destfile="udpreply.jar" basedir="${class}">
			<manifest >
				<attribute name="Built-By" value="${user.name}"/>
				<attribute name="Main-Class" value="UdpReply"/>
				<attribute name="Class-Path" value="udpreply.jar"/>
			</manifest>
		</jar>
		<delete includeEmptyDirs="true" >
			<fileset dir="${class}" />
 		</delete>
	</target>
</project>

mkdirタスク

存在しない場合だけ、ディレクトリを作成する処理を行います。
属性名必須概要
dir作成するディレクトリ名を指定
上記例では、プロパティで指定したclassの変数で、"./work"のディレクトリを作業用に作っている。

javacタスク

javacによりコンパイル処理を行います。
属性名必須概要
srcdirjavaソースファイルがあるディレクトリの指定
destdir×コンパイルしたclassファイルを出力するディレクトリの指定
classpath×classpathを指定します。
includes×コンパイルに含めたいファイルの指定
excludes×コンパイルから除きたいファイルの指定
includeantruntime×Antランタイムライブラリをクラスパスに含めるならtrue
上記では、includes属性でUdpReply.javaのソースファイルを指定しています。これを指定しない場合は、srcdirのディレクトリ内の全ての ソースファイルがコンパイル対象になります。

jarタスク

指定したファイル群をjarファイルに圧縮する処理を行います。
属性名必須概要
destfilejarファイル名を指定します。
basedir圧縮したいファイル群を置くルートディレクトリを指定します。
manifestのネストした要素は、外部ファイルではなく、ビルドファイル中に、 JARファイルのマニフェストをインラインで提供します。 このネストのmanifest要素では、fileとmode属性以外の使い方が manifestタスクと同じです。

deleteタスク

指定されたディレクトリ全体や指定されたファイル集合をセットできます。
属性名必須概要
dirまたはfile操作対象のディレクトリ名を指定
fileまたはdir操作対象のファイルを指定
includeEmptyDirs×空のディレクトリを削除する指定
ファイル集合は、FileSet要素で指定します。 上記では、作業で使い終わった"./work"のディレクトリを最後に削除しています。

JSPからJavaソースを生成してコンパイルする

次のような内容の .batファイルでantを起動して行う例である。
set JAR_PATH=.\ant.jar
set JAR_PATH=%JAR_PATH%;.\ant-launcher.jar

set JAR_PATH=%JAR_PATH%;.\tomcat-juli.jar

set JAVA_HOME="C:\Program Files\Java\jdk1.8.0_77"
if not exist %JAVA_HOME% set JAVA_HOME="C:\Program Files\Java\jdk1.7.0_80"
if not exist %JAVA_HOME% set JAVA_HOME="H:\jdk1.7.0_80"
if not exist %JAVA_HOME% set JAVA_HOME="C:\Program Files\Java\jdk1.7.0_25"
if not exist %JAVA_HOME% set JAVA_HOME="C:\Program Files\Java\jdk1.6.0_24"

set CLASSPATH=.;%JAVA_HOME%;%JAR_PATH%

set PATH=%JAVA_HOME%\bin;%PATH%

java org.apache.tools.ant.Main

cmd
「java org.apache.tools.ant.Main」の 記述で、ant.jar内のorg.apache.tools.ant.Mainクラスが起動してantを実行しています。
すると、同じフォルダ内の「build.xml」に従った手順でantの翻訳がなされます。
これを実行する環境のフォルダ内構造を示すます。

同一フォルダ内の tomcat-juli.jarは、tomcat環境内のbinからコピーしています。 また、同一フォルダ内の libフォルダは、tomcat環境内のlibフォルダをコピーしています。

さて、「build.xml」が翻訳作業の手続きで、次の内容で、JSPからJavaソースを作ります。
<?xml version="1.0" encoding="UTF-8" ?>

<project name="jspc" default="jspc" basedir=".">

	<target name="jspc">
		<taskdef name="jasper2" classname="org.apache.jasper.JspC" >
		<classpath id="jspc.classpath">
			<fileset dir="./lib">
				<include name="*.jar"/> 
			</fileset>
		</classpath>
		</taskdef>

		<echo message="jspc内へコンパイルして格納"/>
		<mkdir dir="./jspc/WEB-INF/src"/>

		<jasper2
			uriroot="webapps"
			outputdir="./jspc/WEB-INF/src"
			javaencoding="utf-8"
			trimspaces="true"
		/>
	</target>

</project>
"webapps"フォルダ内のJSPソースファイルを、Javaのソースファイルに翻訳して、 "./jspc/WEB-INF/src" の中に出力する指示です。
このように、XMLファイルで作業が指示されます。一つの作業が<targetから</target>で示されます。

同様に、上記で作られた "./jspc/WEB-INF/src" の中のJavaのソースファイルをコンパイルして、クラスファイルを"./jspc/WEB-INF/classes"のフォルダに出力する指示の「build.xml」を 以下に示します。
<?xml version="1.0" encoding="UTF-8" ?>

<project name="jspc" default="compile" basedir=".">

	<target name="compile">

		<mkdir dir="./jspc/WEB-INF/classes"/>

		<javac fork="true" 
			srcdir="./jspc/WEB-INF/src"
			destdir="./jspc/WEB-INF/classes"
			optimize="off" includeantruntime="yes"
			debug="on" failonerror="false"
			encoding="utf-8">
			<classpath>
				<pathelement location="./jspc/WEB-INF/classes"/>
				<fileset dir="./lib">
					<include name="*.jar"/> 
				</fileset>
			</classpath>
			<include name="**" />
			<exclude name="tags/**" />
		</javac>
	</target>

</project>

Tomacatは「Apache Software Foundation」で開発された「HTMLなどのWebページをプログラムで生成するJavaサーブレットを動作させる環境」のソフトで、Webサーバとしての機能も持っています。
ここで動作するものは、Javaサーブレット(HttpServlet)と呼ばれるjavaのクラスファイルです。
そしてJSPファイルを、所定の箇所に置くだけで、それが自動的に変換し、コンパイルされて、 Javaサーブレット(HttpServletを継承したHttpJspBase)のファイルを生成でき、それが実行できるようになっています。
ここでは、JSPファイルから .javaのソースファイルを生成して、 その .javaソースをコンパイルして、.classファイルを作るように、2段の翻訳がなされています。
この複雑なコンパイル作業などの手続きを指示するJavaのツールで、「Apache のant」が使われています。(上で紹介した、「java_JSP_antコンパイル」も、Tomacatの翻訳をまねてantで翻訳しています。
2段の翻訳を「build.xml」を以下に紹介します。
<?xml version="1.0" encoding="UTF-8" ?>

<project name="jspc" default="all" basedir=".">

	<target name="jspc">
		<taskdef name="jasper2" classname="org.apache.jasper.JspC" >
		<classpath id="jspc.classpath">
			<fileset dir="./lib">
				<include name="*.jar"/> 
			</fileset>
		</classpath>
		</taskdef>

		<echo message="jspc内へコンパイルして格納"/>
		<mkdir dir="./jspc/WEB-INF/src"/>

		<jasper2
			uriroot="webapps"
			outputdir="./jspc/WEB-INF/src"
			javaencoding="utf-8"
			trimspaces="true"
		/>
	</target>

	<target name="compile">
		<mkdir dir="./jspc/WEB-INF/classes"/>

		<javac fork="true" 
			srcdir="./jspc/WEB-INF/src"
			destdir="./jspc/WEB-INF/classes"
			optimize="off" includeantruntime="yes"
			debug="on" failonerror="false"
			encoding="utf-8">
			<classpath>
				<pathelement location="./jspc/WEB-INF/classes"/>
				<fileset dir="./lib">
					<include name="*.jar"/> 
				</fileset>
			</classpath>
			<include name="**" />
			<exclude name="tags/**" />
		</javac>
	</target>

	<target name="all" depends="jspc,compile">
	</target>

</project>