現在のプロジェクトにタスクまたはデータ型の定義を追加し、この新しい型またはタスクを現在のプロジェクトで使用できるようにします。
タスクは、org.apache.tools.ant.Task
を拡張するクラス、またはアダプタークラスを使用してタスクとして適合させることができるクラスです。
データ型は、プロジェクトレベルで定義し、id 属性を介して参照できるパスやファイルセットなどです。カスタムデータ型は、通常、それらを有効に活用するためにカスタムタスクを必要とします。
定義を行うには、このデータ型を一意に識別する名前と、この型を実装するクラスの完全な名前(パッケージ名を含む)の2つの属性が必要です。
また、file 属性または resource 属性を使用して、定義のグループを一度に定義することもできます。これらの属性は、Java プロパティファイルまたは XML 形式のファイルを指します。
プロパティファイルの場合、各行は「名前=クラス名」の形式で単一のデータ型を定義します。
typename=fully.qualified.java.classname
XML 形式は、Antlib セクションで説明されています。
複数の taskdef
または typedef
タスクと同じクラスパスを共有するタスクまたは型を定義する場合、対応するクラスは異なる Java クラスローダーによってロードされます。異なるクラスローダーによってロードされた同じ名前の2つのクラスは、JVM の観点からは同じクラスではなく、静的変数を共有せず、これらのクラスのインスタンスは、「同じ名前の他のクラス」によって定義されたインスタンスの private メソッドまたは属性にアクセスできません。それらは同じ Java パッケージにも属しておらず、パッケージ private コードにもアクセスできません。
共有 Java コードを介して相互に連携する複数のタスク/型をロードする最良の方法は、resource 属性と antlib
記述子を使用することです。これが不可能な場合、2番目に良い選択肢は、loaderref 属性を使用し、すべての typedef
/taskdef
に同じ名前を指定することです。これにより、クラスは同じ ClassLoader
を共有します。loaderref 属性が機能するためには、typedef
/taskdef
タスクは同一のクラスパス定義(パスコンポーネントの順序を含む)を使用する必要があることに注意してください。
属性 | 説明 | 必須 |
---|---|---|
name | データ型名 | file 属性または resource 属性が指定されていない限り、必須です。 |
classname | データ型を実装する完全なクラス名 | |
file | 定義を読み込むファイルの名前。 | いいえ |
resource | 定義を読み込むリソースの名前。この名前のリソースがクラスパスに複数見つかり、format が「properties」の場合、最初のリソースがロードされます。それ以外の場合、そのようなすべてのリソースがロードされます。 | いいえ |
format | ファイルまたはリソースの形式。値は「properties」または「xml」です。値が「properties」の場合、ファイル/リソースは名前とクラス名のペアを含むプロパティファイルです。値が「xml」の場合、ファイル/リソースはAntlibに従って構造化された XML ファイル/リソースです。デフォルトは「properties」です。ただし、ファイル/リソース名が .xml で終わる場合は、format 属性の値は「xml」になります。 Ant 1.6 以降 | いいえ |
classpath | classname を検索するときに使用するクラスパス。 | いいえ |
classpathref | classname を検索するときに使用するクラスパスへの参照。 | いいえ |
loaderRef | 指定されたクラスパスから構築された、クラスのロードに使用されるローダーの名前。複数のタスク/型を同じローダーでロードできるようにして、相互に呼び出すことができるようにするために使用します。 Ant 1.5 以降 | いいえ |
onerror | 型の定義に失敗した場合に実行するアクション。値は、「fail」:ビルド例外を発生させる、「report」:警告を出力するが続行する、「ignore」:何もしない、です。 Ant 1.6 以降、追加の値として「failall」があります。fail のすべての動作に加えて、リソースまたはファイルが見つからない場合はリソースまたは file 属性のビルド例外も発生させます。 | いいえ。デフォルトは「fail」です(Ant 1.7 以降)。 |
adapter | 定義されたクラスを別のインターフェース/クラスに適合させるために使用されるクラス。アダプタークラスは、インターフェース org.apache.tools.ant.TypeAdapter を実装する必要があります。アダプタークラスは、定義されたクラスが属性「adaptto」で定義されたクラスを実装/拡張していない限り、定義されたクラスをラップするために使用されます。「adaptto」が設定されていない場合、定義されたクラスは常にラップされます。 Ant 1.6 以降 |
いいえ |
adaptto | この属性は、adapter 属性と組み合わせて使用されます。定義されたクラスがこの属性で指定されたインターフェース/クラスを実装/拡張していない場合、アダプタークラスを使用してクラスがラップされます。 Ant 1.6 以降 | いいえ |
uri | この定義が存在する必要がある URI。 Ant 1.6 以降 | いいえ |
Typedef
の classpath 属性は、パスのような構造 であり、ネストされた classpath
要素を介して設定することもできます。
次のフラグメントは、urlset
という名前の型を定義します。
<typedef name="urlset" classname="com.mydomain.URLSet"/>
データ型は Ant で使用できるようになりました。クラス com.mydomain.URLSet
はこの型を実装します。
Task
を拡張し、org.apache.tools.ant.TypeAdapter
を実装するクラス org.acme.ant.RunnableAdapter
と、execute()
メソッドでプロキシオブジェクトの run()
を呼び出すと仮定すると、Runnable
クラスを Ant タスクとして使用できます。次のフラグメントは、runclock
という名前のタスクを定義します。
<typedef name="runclock" classname="com.acme.ant.RunClock" adapter="org.acme.ant.RunnableAdapter"/>
次のフラグメントは、2つの定義をロードするための classpathref および loaderref の使用法を示しています。
<path id="lib.path"> <fileset dir="lib" includes="lib/*.jar"/> </path> <typedef name="filter1" classname="org.acme.filters.Filter1" classpathref="lib.path" loaderref="lib.path.loader"/> <typedef name="filter2" classname="org.acme.filters.Filter2" loaderref="lib.path.loader"/>
antlib を特別な XML 名前空間にロードする場合、uri 属性が重要です
<project xmlns:antcontrib="antlib:net.sf.antcontrib"> <taskdef uri="antlib:net.sf.antcontrib" resource="net/sf/antcontrib/antlib.xml" classpath="path/to/ant-contrib.jar"/>
ここでは、名前空間宣言 xmlns:antcontrib="antlib:net.sf.antcontrib"
により、Ant-Contrib Antlib のタスクと型を <antcontrib:if>
のように antcontrib プレフィックスで使用できます。XML 名前空間の通常のルールが適用され、任意の要素にプレフィックスを宣言して、宣言された要素とそのすべての子要素で使用できるようにすることができます。