ファイルまたはリソースコレクションを新しいファイルまたはディレクトリにコピーします。デフォルトでは、ソースファイルが宛先ファイルより新しい場合、または宛先ファイルが存在しない場合にのみファイルがコピーされます。Antにおける「新しい」の意味については、granularity属性を参照してください。ただし、overwrite
属性を使用して、ファイルを明示的に上書きすることができます。
リソースコレクションは、コピーするファイルのグループを選択するために使用されます。リソースコレクションを使用するには、todir属性を設定する必要があります。注意 一部のリソース(例えばfileリソース)は絶対パスを名前として返し、ネストされたマッパー(またはflatten属性)を使用せずにそれらを使用すると、予期しない結果になる場合があります。
注意:コピー操作でフィルターを使用する場合は、テキストファイルへのコピーに制限する必要があります。バイナリファイルは、コピー操作によって破損します。これは、フィルターがfilterタスクによって暗黙的に定義されている場合でも、filtersetsとしてコピー操作に明示的に提供されている場合でも適用されます。エンコーディングに関する注意を参照してください。
属性 | 説明 | 必須 |
---|---|---|
file | コピーするファイル。 | はい、ネストされたリソースコレクション要素が使用されない限り |
preservelastmodified | コピーされたファイルに、元のソースファイルと同じ最終更新時刻を設定します。 | いいえ。デフォルトはfalse |
tofile | コピー先のファイル。Apache Ant 1.8.2より前は、tofile属性はfileリソースからのコピーのみをサポートしていました。 | file属性を使用する場合、tofileまたはtodirのいずれかを使用できます。 ネストされたリソースコレクション要素を使用する場合、含まれるリソース数が1を超える場合、または <fileset> にdir属性のみが指定されている場合、またはfile属性も指定されている場合、todirのみが許可されます。 |
todir | コピー先のディレクトリ。 | |
overwrite | 宛先ファイルが新しい場合でも、既存のファイルを上書きします。 | いいえ。デフォルトはfalse |
force | 読み取り専用の宛先ファイルを上書きします。Ant 1.8.2以降 | いいえ。デフォルトはfalse |
filtering | グローバルビルドファイルフィルターを使用したトークンフィルタリングをコピー中に実行するかどうかを示します。注意:ネストされた<filterset> 要素は、この属性が指定されていない場合、またはその値がfalse、 no、または offの場合でも、常に使用されます。 |
いいえ。デフォルトはfalse |
flatten | ソースファイルのディレクトリ構造を無視し、すべてのファイルをtodir属性で指定されたディレクトリにコピーします。flattenマッパーを使用しても同じ効果を得ることができます。 | いいえ。デフォルトはfalse |
includeEmptyDirs | FileSetに含まれる空のディレクトリをコピーします。 | いいえ。デフォルトはtrue |
failonerror | falseの場合、コピーするファイルが存在しない場合、またはネストされたfilesetのいずれかが存在しないディレクトリを指している場合、またはコピー中にエラーが発生した場合、警告メッセージをログに記録しますが、ビルドは停止しません。 |
いいえ。デフォルトはtrue |
quiet | trueでfailonerrorが falseの場合、コピーするファイルが存在しない場合、またはネストされたfilesetのいずれかが存在しないディレクトリを指している場合、またはコピー中にエラーが発生した場合、警告メッセージをログに記録しません。Ant 1.8.3以降。 |
いいえ。デフォルトはfalse |
verbose | コピーされているファイルをログに記録します。 | いいえ。デフォルトはfalse |
encoding | ファイルをフィルターコピーするときに想定するエンコーディング。Ant 1.5以降。 | いいえ。デフォルトはデフォルトのJVM文字エンコーディング |
outputencoding | ファイルを書き込む際に使用するエンコーディング。Ant 1.6以降。 | いいえ。設定されている場合はencoding、そうでない場合はデフォルトのJVM文字エンコーディングがデフォルトになります。 |
enablemultiplemappings | trueの場合、タスクは特定のソースパスに対するすべてのマッピングを処理します。 falseの場合、タスクは最初のファイルまたはディレクトリのみを処理します。この属性は、 mapper サブ要素がある場合にのみ関連します。Ant 1.6以降。 |
いいえ。デフォルトはfalse |
granularity | ファイルが古くなったと判断するまでの許容時間(ミリ秒)。すべてのファイルシステムが最終更新時刻をミリ秒レベルで追跡できるわけではないため、これが必要です。ソースファイルとターゲットファイルがクロックが同期していない別々のマシンにある場合にも役立ちます。Ant 1.6.2以降。 | いいえ。デフォルトは1秒、DOSシステムでは2秒です。 |
リソースコレクションは、コピーするファイルのグループを選択するために使用されます。リソースコレクションを使用するには、todir属性を設定する必要があります。
Ant 1.7より前は、ネストされた要素として<fileset>
のみがサポートされていました。
ネストされたmapper要素を使用して、ファイル名の変換を定義できます。<copy>
で使用されるデフォルトのマッパーはidentityマッパーです。
Ant 1.6.3以降、mapper要素の代わりにfilenamemapperタイプを使用できます。
マッパーに渡されるソース名は、使用するリソースコレクションによって異なります。<fileset>
または基本ディレクトリを提供する他のコレクションを使用する場合、マッパーに渡される名前は、基本ディレクトリを基準とした相対ファイル名になります。それ以外の場合は、ソースの絶対ファイル名を使用します。
FilterSetは、コピーされるファイル内のトークンを置換するために使用されます。FilterSetを使用するには、ネストされた<filterset>
要素を使用します。
複数のfiltersetを使用できます。
コピータスクは、ネストされたFilterChainをサポートします。
同じ<copy>
タスク内に<filterset>
要素と<filterchain>
要素が使用されている場合、すべての<filterchain>
要素が最初に処理され、次に<filterset>
要素が処理されます。
単一ファイルをコピーする
<copy file="myfile.txt" tofile="mycopy.txt"/>
単一ファイルをディレクトリにコピーする
<copy file="myfile.txt" todir="../some/other/dir"/>
ディレクトリを別のディレクトリにコピーする
<copy todir="../new/dir"> <fileset dir="src_dir"/> </copy>
一連のファイルをディレクトリにコピーする
<copy todir="../dest/dir"> <fileset dir="src_dir"> <exclude name="**/*.java"/> </fileset> </copy> <copy todir="../dest/dir"> <fileset dir="src_dir" excludes="**/*.java"/> </copy>
一連のファイルをディレクトリにコピーし、ファイル名に.bakを動的に追加する
<copy todir="../backup/dir"> <fileset dir="src_dir"/> <globmapper from="*" to="*.bak"/> </copy>
一連のファイルをディレクトリにコピーし、すべてのファイル内の@TITLE@
をFoo Barに置き換える。
<copy todir="../backup/dir"> <fileset dir="src_dir"/> <filterset> <filter token="TITLE" value="Foo Bar"/> </filterset> </copy>
現在のCLASSPATH
設定からすべてのアイテムを宛先ディレクトリに収集し、ディレクトリ構造をフラット化する。
<copy todir="dest" flatten="true"> <path> <pathelement path="${java.class.path}"/> </path> </copy>
いくつかのリソースを指定されたディレクトリにコピーします。
<copy todir="dest" flatten="true"> <resources> <file file="src_dir/file1.txt"/> <url url="https://ant.dokyumento.jp/index.html"/> </resources> </copy>
上記の例でflatten属性を使用しなかった場合、<file>
リソースは完全パスをソース名とターゲット名として返し、まったくコピーされません。一般的に、絶対パスを名前として使用するリソースと共に明示的なマッパーを使用することをお勧めします。
最新の2つのリソースを宛先ディレクトリにコピーします。
<copy todir="dest" flatten="true"> <first count="2"> <sort> <date xmlns="antlib:org.apache.tools.ant.types.resources.comparators"/> <resources> <file file="src_dir/file1.txt"/> <file file="src_dir/file2.txt"/> <file file="src_dir/file3.txt"/> <url url="https://ant.dokyumento.jp/index.html"/> </resources> </sort> </first> </copy>
前の例に続く段落はこの例にも適用されます。
Unixに関する注意:ファイルをコピーするときはファイルのアクセス許可は保持されません。代わりにデフォルトのUMASK
アクセス許可になります。これは、現在のJavaランタイムでファイルのアクセス許可を問い合わせたり設定したりする手段がないことが原因です。アクセス許可を保持するコピー機能が必要な場合は、代わりに<exec executable="cp" ... >
を使用してください。
Windowsに関する注意:既に存在するファイルにファイルをコピーする場合でも、大文字と小文字が異なる場合、コピーされたファイルは元のファイルの大文字と小文字が反映されます。回避策としては、コピーする前に宛先ディレクトリにあるファイルを削除します。
エンコーディングに関する重要な注意:フィルター処理されたバイナリファイルが破損する理由は、フィルター処理にReaderクラスを使用してファイルを読み込むことが含まれるためです。これには、ファイルのエンコーディング方法を指定するエンコーディングがあります。エンコーディングにはUTF-8、UTF-16、Cp1252、ISO-8859-1、US-ASCIIなど、多くの種類があります。Windowsのデフォルト文字エンコーディングはCp1252、Unixでは通常UTF-8です。これら2つのエンコーディングには、不正なバイトシーケンスがあります(UTF-8の方がCp1252より多い)。
Readerクラスがこれらの不正なシーケンスをどのように処理するかは、文字デコーダの実装によって異なります。現在のSun Javaの実装では、これらを有効な文字にマップします。以前のSun Java(1.3以前)では、MalformedInputException
をスローしていました。IBM Java 1.4もこの例外をスローします。文字のマッピングによって破損が発生します。
デフォルトが通常UTF-8であるUnixでは、これは大きな問題です。ISO-8859-1からの非US-ASCII文字(例えば、デンマーク語のœ文字)を含むファイルを作成して編集するのは簡単です。Antで(フィルター処理して)コピーすると、文字が疑問符などに変換されます。
Antができることはあまりありません。どのファイルがバイナリファイルかを判断することはできません(韓国語のUTF-8バージョンには、上位ビットが設定されているバイトがたくさんあります)。現在のSun Javaの実装では、不正な文字シーケンスについて通知されません。
US-ASCIIのみを含むフィルター処理を行うための1つの方法は、ISO-8859-1エンコーディングを使用することです。これは不正な文字シーケンスを含まないようであり、下位7ビットはUS-ASCIIです。別の方法は、LANG
環境変数をus.utf8
のようなものからus
に変更することです。