<fileset>によるコピー元ファイルの指定

広告

前のページのサンプルではコピーするファイルを「file」属性で指定していましたが、「file」属性の代わりに<fileset>要素を使ってコピーするファイルを指定することが出来ます。

<fileset>要素

filesetではファイルの集合を定義します。<fileset>要素の基本となるのは下記の属性です。

属性説明必須
dirファイルセットのディレクトリツリーのルートdir か file のどちらか必須
file1つのファイルのみのファイルセットを定義するためのショートカットdir か file のどちらか必須
defaultexcludesデフォルト除外パターンを使うかどうか指定します。(yes | no)。省略された場合デフォルト除外パターンは使われます。×
includesカンマあるいは空白で区切られた含められるファイルのパターンのリスト。省略された場合全てのファイルが含められる。×
includesfileファイルの名前。このファイルの各行が includes パターンとして扱われる。×
excludesカンマあるいは空白で区切られた除外するファイルのパターンのリスト。省略された場合、(デフォルト除外ファイルを除き)何も除外しない。×
excludesfileファイルの名前。このファイルの各行が excludes パターンとして扱われる。×

例えば「class」ディレクトリに含まれる全てのファイルを示す場合は下記のようになります。

<fileset dir="./class"/>

全てのファイルではなく、特定のファイルを指定する場合には「includes」属性を使います。例えばクラスファイルだけを対象にする場合には下記のようになります。

<fileset dir="./class" includes="*.class"/>

ファイルの集合から除外したいファイルを指定するには「excludes」属性を使います。例えばソースファイルは対象から外す場合には下記のようになります。

<fileset dir="./class" excludes="*.java"/>

「defaultexcludes」属性はデフォルト除外パターンを使うかどうかを指定します。デフォルトでは使うことになっています。デフォルト除外パターンというのは下記になります。

**/*~
**/#*#
**/.#*
**/%*%
**/._*
**/CVS
**/CVS/**
**/.cvsignore
**/SCCS
**/SCCS/**
**/vssver.scc
**/.svn
**/.svn/**
**/.DS_Store

このデフォルト除外パターンが何を意味するのかは分からないのですけど、デフォルトでこのパターンに該当するファイルはファイル集合から除外されていますので、無効にしたい場合には「defaultexcludes」属性に「no」を指定して下さい。

「includes」属性や「excludes」属性の代わりに、それぞれ<include>要素と<exclude>要素を使うことができます。例えばクラスファイルだけを対象としますが「test」という文字が含まれるファイルは対象外にしたい場合は下記のように記述します。

<fileset dir="./class">
  <include name="*.class"/>
  <exclude name="*test*"/>
</fileset>

<include>要素と<exclude>要素を使う場合は「name」属性でファイルを指定します。

<fileset>要素を使ってコピー

では実際に試してみましょう。注意する点としては<fileset>要素を使う場合にはファイルのコピー先の指定に「tofile」ではなく「todir」を指定しなければならない点です。これは<fileset>要素はファイルの集合を表現するのに使うわけですから、コピー先が単一のファイルではなくディレクトリである必要があるためだと思われます。

今回の構成は下記のようになっています。

-sample5     build.xml
  |
  +--src     test.java
  |          sample1.java
  |          sample2.java
  |
  +--class
  |
  +--to

3つのファイルをコンパイルして「class」ディレクトに格納後、「class」ディレクトリの中の「sample」が付いていないクラスファイルだけ(結果的にtest.classだけになる)を「to」ディレクトリにコピーさせてみます。

コンパイルするプログラムファイルは下記です。(中身は意味がないので省略します)。

test.java

sample1.java

sample2.java

ビルドファイルは下記です。

build2.xml

<?xml version="1.0" encoding="Shift_JIS"?>

<project name="antsample" default="compile">

  <target name="compile">
    <javac srcdir="./src" destdir="./class" />
    <copy todir="./to">
      <fileset dir="./class"
               includes="*.class"
               excludes="sample*"
      />
    </copy>
  </target>

</project>

ではantを実行してみます。

AntでのCopyタスク

上記のように実行後、まず「class」ディレクトリにあるファイルを確認してみます。

AntでのCopyタスク

クラスファイルは3つ作成されています。最後に、コピー先である「to」ディレクトリにあるファイルを確認してみます。

AntでのCopyタスク

コピー元のディレクトリにはクラスファイルは3つありましたが、コピーされたファイルは「test.class」1つだけです。

( Written by Tatsuo Ikura )