ぺんぎんノート

momoiro_tjのノート (旧:システムオペレータの週末)

【ant入門】java自動実行タスクをつくってみた

最近jenkinsを触ってて、改めてAntとかMavenとかのビルドツールについて勉強し始めた。

Antって意外とネットに日本語の解説してくれてるサイトがないので、私は英語のドキュメントで簡単に勉強しました。
日本語のドキュメントもあるので、英語苦手な人はこっちがよさげ。

Apache Ant - ようこそ

javaファイルを管理するために、簡単なAntスクリプト?組んだので、メモ程度に。
もし、練習とか検証とかにコピペで使いたい人とかいれば、Antインストール後にソースファイルがあるフォルダにbuild.xmlファイルを作って、そこにコピペしてください。
ソースファイルフォルダに移動して、コマンドラインからantを実行で使えます。

antのインストールは割愛します。

build.xml作成

次の通りbuild.xml作りました。

<?xml version="1.0" encoding="Shift_JIS"?>
<project name="AntSample" default="exec" basedir=".">

    <!--source,targetフォルダ作成。ソースファイルコピー-->
    <target name="init">
        <mkdir dir="source" />
        <mkdir dir="target" />
        <copy todir="source">
            <fileset dir="." includes="**.java" />
        </copy>
    </target>

    <!--コンパイル-->
    <target name="compile" depends="init">
        <javac srcdir="source" destdir="target" encoding="Shift_JIS" includeAntRuntime="false" />
    </target>

    <!--実行-->
    <target name="exec" depends="compile">
        <!--classnameを実行するclass名に変更する-->

        <!--GUIを伴うので別プロセスで実行。※spawn=true/fork=true-->
        <java classname="AntSample" classpath="target" spawn="true" fork="true" />
    </target>
</project>

antはルート要素にproject要素をもち、その中にtarget要素を含むのが基本的な形式。

project要素のname属性、basedir属性、default属性はあった方がいい。(必須ではない。)

  • name : project名
  • basedir : 基本となるディレクトリ(.で、build.xmlがあるカレントディレクトリ)
  • default : ant実行時に、targetを指定しなかった場合、自動で実行されるtarget

target要素には、実際に実行するタスクを記述していきます。

  • name : targetを識別する名前
  • depends : targetが依存するtargetを指定。指定されたtargetは実行前に必ず実行される。

initのtarget要素では、mkdir要素でソースファイル用のsourceフォルダ、classファイルを出力するtargetフォルダを作成しています。
また、copy要素で、拡張子が.javaのファイルをカレントディレクトリ内で探し、sourceフォルダにコピーしています。

compileのtarget要素では、javac要素で、sourceフォルダ内のjavaソースをコンパイルし、targetフォルダに出力ています。
includeAntRuntime属性は必ずfalseにする必要があるっぽいです。

最後に、execのtarget要素では、java要素で指定のclassを実行します。
使用時は、classname属性を実行するclass名に変更してください。
また、ウィンドウをもつプログラムの場合、別プロセスで実行したいので、spawn属性、fork属性をtrueに設定します。(コマンドラインベースの場合は指定不要)

また、各target要素には、depends属性を設定しており、project要素のdefault属性にexecを指定しているので、さかのぼって

init => compile => exec

の順に実行されます。

実行例

適当に、ウィンドウをもつjavaプログラムを作成します。

//AntSample.java
import javax.swing.*;

public class AntSample {
    public static void main(String args[]) {
        JFrame frame = new JFrame("ant_sample");
        
        //サイズを指定
        frame.setSize(800, 600);

        //×ボタンで終了を指定
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //ウィンドウを可視化
        frame.setVisible(true);
    }
}

build.xmlと同じディレクトリに配置します。

.
    AntSample.java
    build.xml

コマンドプロンプトを開き、build.xmlがあるディレクトリに移動。antを実行。

cd C:\antSample
ant

Buildfile: C:\antSample\build.xml

init:
    [mkdir] Created dir: C:\antSample\source
    [mkdir] Created dir: C:\antSample\target
     [copy] Copying 1 file to C:\antSample\source

compile:
    [javac] Compiling 1 source file to C:\antSample\target

exec:

BUILD SUCCESSFUL
Total time: 1 second

すると、sourceフォルダ、targetフォルダが作成され、JFrameのウィンドウが表示される。
コンパイルから実行まで一連をantコマンドひとつでできるので便利。

実行後のフォルダ構成は次の通り。

.
│  AntSample.java
│  build.xml
│
├─source
│      AntSample.java
│
└─target
        AntSample.class

ant、もっといろいろできるみたいなので、もうちょっと勉強したいなー。


参考

Apache Ant User Manual

7. 基本的なタスク | TECHSCORE(テックスコア)

現場に活かすJakarta Project(2):AntでJavaのビルドを簡単にする - @IT

AntでJavaを実行する手順のまとめと、線形探索。 - 感謝のプログラミング 10000時間

Antを勉強する - それはBooks