Antはビルドツールです。OSや環境に依存しないビルドツールということで幅広く使われています。

個人的にAntを使う理由というのは、ビルド以外のいろんな設定が簡単に出来ることです。例えば、環境ごとに異なった設定ファイルを作りたいときに、ベースとなるファイルを一つ用意するだけで、Filterという機能を使って設定ファイルの内容を変化させることが出来ます。

他にも、JUnitを使ったときに、Reportを自動で生成する機能や、Webアプリケーション用のwarファイルを作りそのままデプロイしたりと、色々なことが連続的に出来るのが気に入っています。作業と作業の間に人の手を入れずに実行できるので、作業忘れが発生しないというのが特徴です。 

解説

Antのサンプルビルドファイルを元にAntを理解していきます。

Antのデフォルトのビルドファイルは 「build.xml」という名前で作る。

Antはビルドファイルを読み込んで動作します。コマンドラインから 「ant」 と打つことで、build.xmlというファイルを読み込んでデフォルトタスクを実行します。ビルドファイルや実行タスクを指定することも出来ます。

<project name="AntTask" default="compile" basedir=".">
  <property name="src.dir" value="./src" />
  <property name="classes.dir" location="./classes" /> 
  <property file="project.properties" prefix="project" /> 
  <property environment="env" /> 
 
  <fileset id="classpath" dir="${project.lib}">
    <include name="*" /> 
    <include name="**/*.jar" /> 
    <exclude name="*.txt" /> 
  </fileset> 
 
  <target name="echo">
    <echo>${src.dir}</echo> 
    <echo>${classes.dir}</echo> 
    <echo>${project.ver}</echo> 
    <echo>${env.Path}</echo> 
  </target> 
 
  <target name="init"> 
    <mkdir dir="${classes.dir}" />
  </target> 
 
  <target name="compile"> 
    <ant antfile="build.xml" target="echo" />
    <javac srcdir="${src.dir}" destdir="${classes.dir}}" debug="on"> 
      <classpath> 
        <fileset refid="classpath" />           
      </classpath> 
    </javac> 
  </target> 
 
  <target name="copy" depends="compile"> 
    <copy todir="${classes.dir}">
      <fileset dir="${src.dir}"> 
        <include name="**/*.properties" /> 
        <include name="**/*.xml" /> 
        <include name="**/*.dtd" /> 
        <exclude name="build.xml" /> 
      </fileset> 
    </copy> 
  </target> 
 
  <target name="clean"> 
    <delete dir="${classes.dir}" /> 
    <delete> 
      <fileset dir="${project.tmp}" defaultexcludes="no"> 
        <include name="**/*" /> 
      </fileset> 
    </delete> 
  </target> 
 
  <target name="tests"> 
    <junit printsummary="yes" haltonfailure="no">
      <classpath> 
        <fileset refid="${classes.dir}" /> 
        <pathelement path="${java.class.path}" /> 
      </classpath> 
      <formatter type="xml"/> 
      <batchtest fork="yes" todir="${reports.dir}"> 
        <fileset dir="${src.dir}"> 
          <include name="**/*Test.java"/> 
        </fileset> 
      </batchtest> 
    </junit> 
    <junitreport todir="${reports.dir}"> 
      <fileset dir="${reports.dir}"> 
        <include name="TEST-*.xml"/> 
      </fileset> 
      <report format="frames" todir="${reports.dir}"/> 
    </junitreport> 
  </target>    
 
  <target name="setup"> 
    <filter token="VERSION" value="2.0.1" />
    <copy file="config-base.properties" 
             tofile="config.properties" 
             filtering="yes" /> 
  </target> 
 
</project>

1. 1行目: ビルドファイルは project タグで開始する

Antのビルドファイルは project タグではじめます。project の属性には、デフォルトのタスク名やベースとなるフォルダをしてすることが出来ます。今回の例では、プロジェクト名が AntTask、デフォルトタスク名が compile、ベースディレクトリがカレントディレクトリになります。

2. 2行目: property タスクは、設定情報を定義する

propertyタスクは、name属性に指定しな名前にマッピングされる値を定義します。定義された値は、ビルドファイル中から ${name} という方法で取り出せます。

1つめの例が、単純にnameに対してvalueを設定する方法です。

${src.dir} ⇒ ./src

2つめの例は、name属性に対して、PATH情報を設定しています。location属性で値を設定すると、値が絶対パスとして定義されます。

${classes.dir} ⇒ C:\java\ant\classes

3つめの例は、設定ファイルに定義されている値を読み込みます。file属性で指定されたファイルからname=valueという情報を読みとります。prefixが指定されていると、読み込んだname属性の頭にprefixで指定した値を付けて、valueを取り出せるようになります。

${project.version} ⇒ 1.6.1

4つめの例は、環境変数を読み込むときに使用するプレフィックスを指定します。

${env.PATH} ⇒ C:\java\lib\;C:\java\ant\lib

3. 7行目: fileset タスクは、ファイルの集合を定義する

filesetタスクは、ファイルの集合を定義します。javacやjava コマンドで使用するクラスパスや、ライブラリパスなどを設定するのに便利です。

id属性に指定した名前で、ビルドファイル中から呼び出されます。dir属性は、ファイルの存在場所を指定します。include・exclude属性を使って、集合に含めるファイルを選択します。パターンとして使える文字と意味はAnt詳細というページを参考にしてください。

4. 13行目: タスクの集合を定義するには、targetタスクを利用します

タスクをまとめて実行したい場合には、targetタスクを利用します。通常、意味のある単位でタスクをまとめます。例えば、JUnitでテストを行う、javacコマンドでコンパイルしてクラスファイルだけを別のフォルダに移動させる、jarコマンドでファイルを圧縮してデプロイするなどです。

5. 21行目: フォルダを作るには mkdir タスクを使う

フォルダの作成には、mkdirタスクを使います。この他、ファイルを削除したり(deleteタスク)、ファイルを移動したり(moveタスク)もできます。

6. 25行目: 他のビルドファイル中のタスクを呼び出すには antタスクを呼び出す

ビルドファイルを分割したい場合があります。例えば、非常に大きなファイルになってしまったり、環境に応じて読み込むビルドファイルを変えたりしたい場合です。

そんなときは、antタスクを使って、別のビルドファイルを読み込むことが出来ます。antfile属性に読み込むビルドファイルを指定します。target属性には、呼び出すタスクを指定します。

7. 34行目: ファイルをコピーするには copyタスクを利用する

ファイルをコピーしたい場合は良くあります。そのようなときは copy タスクを使います。moveタスクとの違いは、copyはコピー元のファイルが残ることです。

8. 54行目: JUnitとJUnitReportを使う

AntにはJUnitを実行して、その結果をレポートにまとめるタスクが存在します。細かいタスクの説明は参考文献を見てもらうとして、レポートに必要な条件は1つだけです。

JUnitのサマリーをXML形式で出力すること。(Formatter type="xml")

JUnitとJUnitReportタスクを使うと、それなりにしっかりとした形式でテスト結果が出力されるようになります。テスト結果をプロジェクトメンバーで共有したい場合などに利用できます。

9. 75行目: ファイル内の設定を置換する Filter タスク

環境によって設定ファイルを複数用意したい場合があると思います。そんな時、ベースとなる設定ファイルを一つ用意して、Filterタスクを利用して、環境に合わせた設定ファイルを作ることが出来ます。 参考:Filter タスク

Antは、非常にたくさんのことが出来るビルドツールです。CVSから最新のファイルを取得して、コンパイルしてデプロイするなんて動作も、Antの達人にしてみれば朝飯前なことでしょう。僕はまだまだ初心者ですが (^^;)

今回はAntを勉強する取っ掛かりとしてサンプルファイルを元に簡単な説明書きだけを載せておきました。(勉強会用の資料としてつくりましたので・・・)これを気に、Antに興味がわいたなら勉強会大成功ということにしておきます。

プロジェクト管理ツール「Maven」

Antはビルドツールです。ただのビルドツールではなく、タスクを利用して定型作業を自動化したり、JUnitなどと連携して自動テストを行ったりも出来ます。しかし、プロジェクトで開発を行っていくと、さまざまな問題点がでてきます。 

例えば、開発者ごとにビルドの構成が変わってくるということがあげられます。開発環境が違えば、それぞれ開発用のビルドファイルを用意しなければなりません。また、ビルドの手順も人それぞれによって変わってきてしまいます。これらの問題点というのは、プロジェクト管理の範疇に入ってくる問題といえます。

つまり、Antにはプロジェクト管理の機能が抜けているといえるでしょう。個人で開発を行う上では非常に便利なAntですが、複数人で開発を行うときは、気をつけなければならない点が増えてきてしまいます。

こういった問題点を解決してくれるのが「Maven」です。MavenはApacheプロジェクトで作られている、Java開発プロジェクトの管理および開発チーム間での情報共有のために用いられるツールです。

Mavenに関しての詳しい解説は参考ページを見てください。

参考

  • WebのAnt解説ページです。(詳しい!) Ant 詳説

  • Antの解説本です。


​​