👾

いまさら Apache Ant に入門してみる

2024/07/22に公開

はじめに

現在行っているプロジェクトでは Apache Ant (以下 Ant )が使われており、途中参加だったのですでにある build.xml を多少眺めるくらいで保守は他のメンバーに任せっきりになっていました😅
そもそも Java 自体もプロジェクトに参加してから触るようになったのでちゃんと理解して使えるようにならないと!
ということで学習していきます💨

Antとは?

Ant は、Java ベースのビルドツールで、プロジェクトのビルド、テスト、デプロイなどの自動化をサポートします。Ant は XML 形式のビルドファイル( build.xml )を使用してタスクを定義し、それに基づいて一連のビルドプロセスを実行します。

最近の Java の入門本では Maven や Gradle の使い方がメインなので Ant についてあまりのってないですね・・・ 🥲

公式サイトはこちら
https://ant.apache.org/

マニュアルはこちら
https://ant.apache.org/manual/index.html

https://ja.wikipedia.org/wiki/Apache_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 プラグインをインストールしておきます。

https://plugins.jetbrains.com/plugin/23025-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.dirbuild.dir というプロパティが設定され、後続のターゲットやタスク内で src.dirbuild.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 のタスクタグには、さまざまなビルドやデプロイのプロセスを自動化するための多くのタスクが用意されています。以下に、一般的によく使用されるタスクタグの一部を紹介します。
実際の使い方をドキュメントをご確認ください。

タスクの一覧は以下のページにあります。
https://ant.apache.org/manual/tasksoverview.html

1. <mkdir>

ディレクトリを作成するタスクです。

<mkdir dir="build"/>

2. <javac>

Java ソースファイルをコンパイルするタスクです。

<javac srcdir="src" destdir="build"/>

3. <java>

Java アプリケーションを実行するタスクです。

<java classname="com.example.Main" fork="true">
    <classpath>
        <pathelement path="build"/>
    </classpath>
</java>

4. <jar>

JAR ファイルを作成するタスクです。

<jar destfile="dist/myapp.jar" basedir="build"/>

5. <copy>

ファイルやディレクトリをコピーするタスクです。

<copy file="src/config.xml" todir="build/config"/>

6. <delete>

ファイルやディレクトリを削除するタスクです。

<delete dir="build"/>

7. <zip>

ZIP ファイルを作成するタスクです。

<zip destfile="dist/myapp.zip" basedir="build"/>

8. <unzip>

ZIP ファイルを解凍するタスクです。

<unzip src="dist/myapp.zip" dest="build"/>

9. <echo>

メッセージをコンソールに出力するタスクです。

<echo message="Build complete"/>

10. <exec>

外部プログラムを実行するタスクです。

<exec executable="echo">
    <arg value="Hello, world!"/>
</exec>

11. <chmod>

ファイルのパーミッションを変更するタスクです。

<chmod file="script.sh" perm="755"/>

12. <scp>

ファイルをリモートサーバーにコピーするタスクです(ant-contrib ライブラリが必要です)。

<scp file="build/myapp.jar" todir="user@server:/path/to/destination"/>

13. <ftp>

FTP を使用してファイルを転送するタスクです。

<ftp server="ftp.example.com" userid="user" password="password" remotedir="/upload" passive="yes">
    <fileset dir="build">
        <include name="**/*"/>
    </fileset>
</ftp>

14. <mail>

メールを送信するタスクです。

<mail from="build@example.com" to="dev@example.com" subject="Build Status">
    <message>Build completed successfully</message>
</mail>

15. <junit>

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 との組み合わせが必要ですね!

https://zenn.dev/rescuenow/articles/c61dd7c525213e

参考サイト

https://qiita.com/maple_syrup/items/4ad7ec8e207d2289beac

レスキューナウテックブログ

Discussion