Antlib

概要

antlib ファイルは、"antlib" をルート要素を持つ xml ファイルです。 Antlib の要素は、ant の定義用のタスクです。それは、 TypedefTaskdef、または org.apache.tools.ant.taskdefs.AntlibDefinition を 拡張した ant のタスクのようなものです。

タスクやデータ型のグループは、antlib ファイルの中で一緒に 定義されるでしょう。以下の sample.xml は、このファイルの例です:

<?xml version="1.0"?>
<antlib>
   <typedef name="if" classname="org.acme.ant.If"/>
   <typedef name="scriptpathmapper"
            classname="org.acme.ant.ScriptPathMapper"
            onerror="ignore"/>
</antlib>
      

これは、if と scriptpathmapper の 2つのデータ型またはタスクを定義して います。この antlib ファイルは、以下のようにしてビルドスクリプト内で 使われます。

<typedef file="sample.xml"/>
      

typedef の他の属性も、同様に使うことができます。 例えば、クラスも含んでいる jar ファイル sample.jarsample.xml があると仮定すると、次のビルドフラグメントは、 if と scriptpathmapper タスク/データ型を定義して、samples:/acme.org のネームスペース URI にそれらを置きます。

<typedef resource="org/acme/ant/sample.xml"
         uri="samples:/acme.org"/>
      

この定義は、次のようにして使われます:

<sample:if valuetrue="${props}" xmlns:sample="samples:/acme.org">
   <sample:scriptpathmapper language="beanshell">
      some bean shell
   </sample:scriptpathmapper>
</sample:if>
      

antlibネームスペース

antlib:java packageのようなパターンを持つネームスペースURIは、 特別に扱われます。

Ant はこのパターンのネームスペースURIを持つ要素に遭遇した場合、 デフォルトのクラスパスからそのパッケージのディレクトリ内に antlib.xml という名前のリソースがあるかどうかをチェックします。

例えば、antcontrib.jar というファイルが ${ant.home}/lib ディレクトリ内にあり、すべての antcontrib の定義がされている net/sf/antcontrib/antlib.xml というリソースが含まれていると仮定すると、次のビルドファイルでは、 HERE の 場所で antcontrib の定義を自動的にロードします。

<project default="deletetest" xmlns:antcontrib="antlib:net.sf.antcontrib">
   <macrodef name="showdir">
      <attribute name="dir"/>
      <sequential>
         <antcontrib:shellscript shell="bash">  <!-- HERE -->
            ls -Rl @{dir}
         </antcontrib:shellscript>
      </sequential>
   </macrodef>

   <target name="deletetest">
      <delete dir="a" quiet="yes"/>
      <mkdir dir="a/b"/>
      <touch file="a/a.txt"/>
      <touch file="a/b/b.txt"/>
      <delete>
         <fileset dir="a"/>
      </delete>
      <showdir dir="a"/>
   </target>
</project>
      

リソースがデフォルトクラスパスにあるという必要条件は、将来のバージョンの Ant ではなくなるかもしれません。

実行中のネームスペース

antlib の中で定義されたものは、antlib の中で使われるでしょう。しかしながら、 定義の置かれるネームスペースは、antlib で使っている <typedef> に依存して います。 この問題に対処するため、定義は antlib の実行が続いている間は ant:current というネームスペースURIに置かれます。 例えば、次の antlib 定義は <if> タスクと <isallowed> データ型、 定義したタスクとデータ型を利用した <ifallowed> というマクロを定義しています。

<antlib xmlns:current="ant:current">
   <taskdef name="if" classname="org.acme.ant.If"/>
   <typedef name="isallowed" classname="org.acme.ant.Isallowed"/>
   <macrodef name="ifallowed">
      <attribute name="action"/>
      <element name="do"/>
      <sequential>
         <current:if>
            <current:isallowed test="@{action}"/>
            <current:then>
               <current:do/>
            </current:then>
         </current:if>
      </sequential>
   </macrodef>
</antlib>
      

その他の例と解説

antlib は、他の antlib を利用することもあります。

antlib で定義された名前が、<typedef> によって呼ばれたか自動的に要素が 解決されたことによって決められたネームスペース URI 内にある場合、 呼び出し側がネームスペース URI を使っていれば、Ant コアのタスクやデータ型の名前を 再利用するかもしれません。例えば、次の antlib は、様々なタスクのデフォルトを 定義するために使われています。

<antlib xmlns:antcontrib="antlib:net.sf.antcontrib">
   <presetdef name="javac">
      <javac deprecation="${deprecation}"
             debug="${debug}"/>
   </presetdef>
   <presetdef name="delete">
      <delete quiet="yes"/>
   </presetdef>
   <presetdef name="shellscript">
      <antcontrib:shellscript shell="bash"/>
   </presetdef>
</antlib>
      

これは、次のようにして使われます。

<project xmlns:local="localpresets">
   <typedef file="localpresets.xml" uri="localpresets"/>
   <local:shellscript>
      echo "hello world"
   </local:shellscript>
</project>
      

Copyright © 2003-2004 The Apache Software Foundation. All rights Reserved.

[訳注: これは浦本 和則が翻訳しました.日本語訳に対するコメントがあれば、 report@jajakarta.orgに送って下さい。]