いまさら Apache Ant に入門してみる
はじめに
現在行っているプロジェクトでは Apache Ant (以下 Ant )が使われており、途中参加だったのですでにある build.xml を多少眺めるくらいで保守は他のメンバーに任せっきりになっていました😅
そもそも Java 自体もプロジェクトに参加してから触るようになったのでちゃんと理解して使えるようにならないと!
ということで学習していきます💨
Antとは?
Ant は、Java ベースのビルドツールで、プロジェクトのビルド、テスト、デプロイなどの自動化をサポートします。Ant は XML 形式のビルドファイル( build.xml )を使用してタスクを定義し、それに基づいて一連のビルドプロセスを実行します。
最近の Java の入門本では Maven や Gradle の使い方がメインなので Ant についてあまりのってないですね・・・ 🥲
公式サイトはこちら
マニュアルはこちら
環境の準備
まずは、 Ant を Mac にインストールしましょう。
Java のインストール
Ant は Java で動作するため、 Java がインストールされている必要があります。以下のコマンドで Java がインストールされているか確認できます。
java -version
もしインストールされていない場合は、 Homebrew を使ってインストールします。
brew install openjdk
Antのインストール
次に、 Ant を Homebrew を使ってインストールします。
brew install ant
インストールが完了したら、以下のコマンドで正しくインストールされたか確認しましょう。
ant -version
プロジェクトの設定
ここでは、簡単な Java プロジェクトを例にして、 Ant の設定方法を確認します。
普段 IntelliJ を利用しているので IntelliJ で設定を行ってみたいと思います。
まず新規プロジェクトでとりあえずビルドシステムを IntelliJ で作成します。
次に IntelliJ の Ant プラグインをインストールしておきます。
すると「他のツールウィンドウ」に Ant が表示されるのでクリックします。
すると右側のメニューに Ant が表示され、そこからビルドファイルを指定して追加できるようになります。
ディレクトリ構成
以下のようなディレクトリ構成を作成します。
my-project/
├── src/
│ └── Main.java
└── build.xml
ソースコードの作成
src/Main.java
に以下のようなシンプルな Java プログラムを作成します。
public class Main {
public static void main(String[] args) {
System.out.println("Hello, Ant!");
}
}
build.xml の作成
次に、プロジェクトのルートディレクトリに build.xml
を作成し、以下の内容を記述します。
<project name="MyProject" default="compile" basedir=".">
<!-- プロパティの設定 -->
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<!-- ディレクトリの初期化 -->
<target name="init">
<mkdir dir="${build.dir}"/>
</target>
<!-- コンパイルタスク -->
<target name="compile" depends="init">
<javac srcdir="${src.dir}" destdir="${build.dir}"/>
</target>
<!-- クリーンアップタスク -->
<target name="clean">
<delete dir="${build.dir}"/>
</target>
</project>
この build.xml
では、以下の3つのターゲットが定義されています。
プロパティの設定
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property>
タグを使って、プロジェクト内で使うディレクトリパスを定義しています。これにより、後続のターゲット内で変数のように使うことができます。
ディレクトリの初期化
<target name="init">
<mkdir dir="${build.dir}"/>
</target>
<target>
タグでタスクを定義します。この場合、 init
ターゲットはビルド用のディレクトリを作成するタスクです。 <mkdir>
タグで指定したディレクトリが存在しない場合、新たに作成されます。
コンパイルタスク
<target name="compile" depends="init">
<javac srcdir="${src.dir}" destdir="${build.dir}"/>
</target>
compile
ターゲットは、 init
ターゲットに依存しています。つまり、 compile
ターゲットを実行する前に必ず init
ターゲットが実行されます。 <javac>
タグで、ソースディレクトリからビルドディレクトリへJavaファイルをコンパイルします。
クリーンアップタスク
<target name="clean">
<delete dir="${build.dir}"/>
</target>
clean
ターゲットは、ビルドディレクトリを削除するタスクです。 <delete>
タグで指定したディレクトリとその内容をすべて削除します。
Ant の実行
Ant の実行(コマンド)
それでは、実際に Ant を使ってビルドを実行してみましょう。プロジェクトのルートディレクトリで以下のコマンドを実行します。
ant
正常にビルドが完了すると、 build
ディレクトリ内にコンパイルされたクラスファイルが生成されます。
タスクの実行
特定のタスクを実行したい場合は、タスク名を指定して Ant を実行します。例えば、クリーンアップを行いたい場合は、以下のコマンドを実行します。
ant clean
Ant の実行(プラグイン)
Ant のプラグインから実行する方法も紹介します。
先ほどの右側のメニューで作成した build.xml ファイルを追加します。
するとターゲットが以下のように表示され右クリックから実行できるようになります。
また「実行構成の作成」もできます。
実行構成を作成することで上部のバーから直接ターゲットを実行できます。
build.xml の各要素について
project
project
タグは Ant ビルドファイルのルート要素であり、ビルドプロセス全体を定義するための必須タグです。
このタグを通じてプロジェクトの基本情報を設定し、ビルドプロセスの全体構造を定義します。
project タグの属性
name 属性
プロジェクトの名前を指定します。これはビルドファイル内で識別しやすくするためのものです。
<project name="MyProject" default="compile" basedir=".">
default 属性
Ant を実行したときにデフォルトで実行されるターゲットを指定します。この属性は必須ではありませんが、設定しておくと便利です。
<project name="MyProject" default="compile" basedir=".">
basedir 属性
プロジェクトの基準ディレクトリを指定します。通常は現在のディレクトリを示す .
を使用しますが、特定のディレクトリを指定することもできます。
<project name="MyProject" default="compile" basedir=".">
property
<property>
タグは、プロジェクト内で使用される変数を定義します。これにより、ハードコーディングを避け、設定の変更を容易にします。
-
name
属性: プロパティの名前を指定します。 -
value
属性: プロパティの値を指定します。
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
これにより、src.dir
と build.dir
というプロパティが設定され、後続のターゲットやタスク内で src.dir
と build.dir
を使うことができます。
target
target
タグは Ant のビルドプロセスの中で重要な部分を担い、ビルド、テスト、デプロイ、クリーンアップなどの処理をグループ化するために使用されます。
target
タグの使用方法を例とともに詳細に説明します。
target タグの基本構造
target
タグは複数のタスクを定義でき、依存関係や条件を設定することができます。
<target name="target-name" depends="other-target" if="property" unless="property">
<!-- タスクをここに記述 -->
</target>
-
name
属性: ターゲットの名前を指定します。 -
depends
属性: このターゲットを実行する前に実行する必要のあるターゲットを指定します(カンマ区切りで複数指定可能)。 -
if
属性: 指定されたプロパティが存在する場合にのみこのターゲットを実行します。 -
unless
属性: 指定されたプロパティが存在しない場合にのみこのターゲットを実行します。
具体例
以下に、いくつかのターゲットの具体例を示します。
1. 初期化ターゲット
ビルドディレクトリを作成するターゲットです。
<target name="init">
<mkdir dir="build"/>
</target>
2. コンパイルターゲット
ソースファイルをコンパイルするターゲットで、init
ターゲットに依存します。
<target name="compile" depends="init">
<javac srcdir="src" destdir="build/classes"/>
</target>
3. JAR作成ターゲット
コンパイル後のクラスファイルを JAR ファイルにパッケージングするターゲットです。
<target name="jar" depends="compile">
<jar destfile="dist/myapp.jar" basedir="build/classes"/>
</target>
4. クリーンアップターゲット
ビルドディレクトリを削除するターゲットです。
<target name="clean">
<delete dir="build"/>
</target>
5. テストターゲット
JUnit テストを実行するターゲットで、compile
ターゲットに依存します。
<target name="test" depends="compile">
<junit printsummary="yes">
<classpath>
<pathelement path="build/classes"/>
</classpath>
<batchtest>
<fileset dir="test">
<include name="**/*Test.class"/>
</fileset>
</batchtest>
<formatter type="plain"/>
</junit>
</target>
6. デプロイターゲット
アプリケーションをリモートサーバにデプロイするターゲットで、jar
ターゲットに依存します。
<target name="deploy" depends="jar">
<scp file="dist/myapp.jar" todir="user@server:/path/to/destination"/>
</target>
条件付きターゲット
プロパティの存在によって実行を制御するターゲットです。
<target name="conditional-task" if="deploy.ready" unless="deploy.failed">
<echo message="Deploying application..."/>
</target>
-
if
属性:deploy.ready
プロパティが存在する場合にのみターゲットを実行します。 -
unless
属性:deploy.failed
プロパティが存在しない場合にのみターゲットを実行します。
task
Ant のタスクタグには、さまざまなビルドやデプロイのプロセスを自動化するための多くのタスクが用意されています。以下に、一般的によく使用されるタスクタグの一部を紹介します。
実際の使い方をドキュメントをご確認ください。
タスクの一覧は以下のページにあります。
<mkdir>
1. ディレクトリを作成するタスクです。
<mkdir dir="build"/>
<javac>
2. Java ソースファイルをコンパイルするタスクです。
<javac srcdir="src" destdir="build"/>
<java>
3. Java アプリケーションを実行するタスクです。
<java classname="com.example.Main" fork="true">
<classpath>
<pathelement path="build"/>
</classpath>
</java>
<jar>
4. JAR ファイルを作成するタスクです。
<jar destfile="dist/myapp.jar" basedir="build"/>
<copy>
5. ファイルやディレクトリをコピーするタスクです。
<copy file="src/config.xml" todir="build/config"/>
<delete>
6. ファイルやディレクトリを削除するタスクです。
<delete dir="build"/>
<zip>
7. ZIP ファイルを作成するタスクです。
<zip destfile="dist/myapp.zip" basedir="build"/>
<unzip>
8. ZIP ファイルを解凍するタスクです。
<unzip src="dist/myapp.zip" dest="build"/>
<echo>
9. メッセージをコンソールに出力するタスクです。
<echo message="Build complete"/>
<exec>
10. 外部プログラムを実行するタスクです。
<exec executable="echo">
<arg value="Hello, world!"/>
</exec>
<chmod>
11. ファイルのパーミッションを変更するタスクです。
<chmod file="script.sh" perm="755"/>
<scp>
12. ファイルをリモートサーバーにコピーするタスクです(ant-contrib
ライブラリが必要です)。
<scp file="build/myapp.jar" todir="user@server:/path/to/destination"/>
<ftp>
13. FTP を使用してファイルを転送するタスクです。
<ftp server="ftp.example.com" userid="user" password="password" remotedir="/upload" passive="yes">
<fileset dir="build">
<include name="**/*"/>
</fileset>
</ftp>
<mail>
14. メールを送信するタスクです。
<mail from="build@example.com" to="dev@example.com" subject="Build Status">
<message>Build completed successfully</message>
</mail>
<junit>
15. JUnit テストを実行するタスクです。
<junit printsummary="yes">
<classpath>
<pathelement path="build"/>
</classpath>
<batchtest>
<fileset dir="test">
<include name="**/*Test.class"/>
</fileset>
</batchtest>
<formatter type="plain"/>
</junit>
最後に
今回は、 Mac 環境での Apache Ant のインストールから基本的な使い方までやってみました。
これで少しは Ant が理解できたかな?
Ant だけではライブラリの管理が厳しいので Ivy との組み合わせが必要ですね!
参考サイト
Discussion