目次へ

4.3. マッパー(Mapper)

マッパーはファイル名の変換規則を記述するために用いられます。例えば、Javaのソースファイルをコンパイルするとクラスファイルが生成されます。このとき、Test.javaというファイルからはTest.classというファイルが生成されますし、Sample.javaというファイルからはSample.classというファイルが生成されます。ここには、「a.java」から「a.class」への名前の変換規則があることがわかると思います。マッパーではこのようなファイル名変換規則を表現できます。

マッパーは<mapper>要素を用いて定義します。<mapper>要素の属性は次のとおりです。

属性 説明 必須
type
変換規則の種類を指定します。 どちらか1つ
classname
変換処理を行うJavaクラスを指定します。
classpath
classnameで指定したクラスを実行するのに必要なクラスパスを指定します。  
classpathref
classnameで指定したクラスを実行するのに必要なクラスパスを定義したパス類似構造を参照します。クラスパスはこれらの方法以外に<classpath>子要素でも指定できます。  
from
変換前のファイル名規則を指定します。 変換の種類による
to
変換後のファイル名規則を指定します。
refid
事前定義したmapper要素を参照します。  

変換規則の種類は、あらかじめ用意されているものに加えて、独自に実装したものが利用できます。あらかじめ用意されているものを利用するときにはtype属性でその種類を指定し、独自実装のものを利用するときにはclassnameで実装したJavaクラス名を指定します。

typeで指定できる変換規則の種類には次のものがあります(ここで変換前のファイルを「ソースファイル」、変換後のファイルを「ターゲットファイル」と呼ぶことにします)。

type 説明
Identity
ソースファイル名とターゲットファイル名がディレクトリ構造も含めて同一の変換規則です。from属性とto属性は無視されます。
Flatten
ファイル名は同一ですが、ディレクトリ構造が取り除かれます。例えばソースファイル「a/b/c/d.java」に対してターゲットファイルは「d.java」になります。from属性とto属性は無視されます。
Merge
ソースファイル名によらず、ターゲットファイル名がto属性で指定した固定のファイル名になる変換規則です。from属性は無視されます。
Glob
あらゆる文字列にマッチするワイルドカード「*」を用いることができます。to属性に記述した「*」は、from属性の「*」にマッチした文字列が参照されます。例えば先ほどのJavaコンパイルの変換規則は、このタイプの変換規則を用いて、to="*.java" from="*.class"とすることで表現することができます。
Regexp
from属性に正規表現を用いることができます。正規表現ではカッコ( )を用いて部分文字列を最大9個指定でき、それぞれにマッチした文字列をto属性内にで\1から\9によって参照できます。例えば、from="(.*)/Test/(.*).java" to="\1/\2.java"としたとき、ソースファイル「a/Test/b.java」に対するターゲットファイルは「a/Test/b.java」となります(1番目のカッコが「a」にマッチし、2番目のカッコが「b」にマッチしているため、「\1」が「a」に、「\2」が「b」に置換されます)。
Package
Globと同じようにワイルドカード「*」を一つ用いることができます。Globとの違いは、「*」にマッチした文字列内にディレクトリ区切り文字(Unixなら「/」、Windowsなら「\」)があったとき、そのディレクトリ区切り文字が「.」に置換されます。例えば、from="*.java" to="*"としたとき、ソースファイル「a/b/c/d.java」に対するターゲットファイルは「a.b.c.d」となります。

UnixとWindows両方で用いるビルドファイルにおいてディレクトリ区切り文字を使う時には注意が必要です。マッパー要素のfrom属性やto属性に記述した「/」や「\」は環境によって自動的には変換されません。このようなときはディレクトリ区切り文字として${file.separator}を用います。${file.separator}は、環境に応じたディレクトリ区切り文字を表す組み込みプロパティです。

(実習課題)

カレントディレクトリに存在するsrcディレクトリ以下のすべてのファイルを、ディレクトリ構造そのままでdestディレクトリ以下へコピーする処理をCopyタスクを用いて作成して下さい。ただし、このときファイル名が「tmp」で始まるものと「.tmp」終わるものについてはコピーしないようにして下さい。またコピー先のファイル名は、もとのファイル名の最後に「.bak」を追加したものにして下さい。

なお、Copyタスクでは、コピー元のファイルをファイルセット子要素で指定し、コピー先のディレクトリはtodir属性で指定します。またファイル名の変換規則はマッパー子要素で指定します。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp