{"id":274,"date":"2026-10-13T07:01:48","date_gmt":"2026-10-13T07:01:48","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/07\/22\/samples-of-the-ant-copy-task\/"},"modified":"2026-10-13T07:01:48","modified_gmt":"2026-10-13T07:01:48","slug":"samples-of-the-ant-copy-task","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/samples-of-the-ant-copy-task\/","title":{"rendered":"Apache Ant Copy Task Examples: File, FileSet, Include\/Exclude, and Flatten Patterns"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Apache Ant\u2019s <code>copy<\/code> task is a core build step for moving resources into output directories. This guide helps build and release engineers choose the right copy pattern, avoid common mistakes, and reuse practical snippets in <code>build.xml<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-07-22; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img src='https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/07\/ant-copy-task.png' alt='Ant copy task example' \/><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quick syntax reference for the Ant copy task<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>file<\/code> and <code>tofile<\/code> for one-to-one copies, and use <code>todir<\/code> with a nested <code>fileset<\/code> for bulk copies selected by patterns.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">file<\/span>=<span class=\"hljs-string\">'${resources.dir}\/MANIFEST.MF'<\/span> <span class=\"hljs-attr\">tofile<\/span>=<span class=\"hljs-string\">'${temp.dir.meta-inf}\/MANIFEST.MF'<\/span> <span class=\"hljs-attr\">overwrite<\/span>=<span class=\"hljs-string\">'true'<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">file<\/span>=<span class=\"hljs-string\">'${resources.dir}\/managed-beans.xml'<\/span> <span class=\"hljs-attr\">tofile<\/span>=<span class=\"hljs-string\">'${temp.dir.web-inf}\/managed-beans.xml'<\/span> <span class=\"hljs-attr\">overwrite<\/span>=<span class=\"hljs-string\">'true'<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">file<\/span>=<span class=\"hljs-string\">'${resources.dir}\/navigation-rules.xml'<\/span> <span class=\"hljs-attr\">tofile<\/span>=<span class=\"hljs-string\">'${temp.dir.web-inf}\/navigation-rules.xml'<\/span> <span class=\"hljs-attr\">overwrite<\/span>=<span class=\"hljs-string\">'true'<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">file<\/span>=<span class=\"hljs-string\">'${resources.dir}\/faces-config.xml'<\/span> <span class=\"hljs-attr\">tofile<\/span>=<span class=\"hljs-string\">'${temp.dir.web-inf}\/faces-config.xml'<\/span> <span class=\"hljs-attr\">overwrite<\/span>=<span class=\"hljs-string\">'true'<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">file<\/span>=<span class=\"hljs-string\">'${resources.dir}\/log4j.properties'<\/span> <span class=\"hljs-attr\">tofile<\/span>=<span class=\"hljs-string\">'${temp.dir.classes}\/log4j.properties'<\/span> <span class=\"hljs-attr\">overwrite<\/span>=<span class=\"hljs-string\">'true'<\/span> \/&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">todir<\/span>=<span class=\"hljs-string\">'${temp.dir.classes}'<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">fileset<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">'${src.dir}'<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">include<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'**\/*.xml'<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">include<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'**\/*.xsl'<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">include<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'**\/*.properties'<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">fileset<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">copy<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Choose the right copy pattern<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Pattern<\/th><th>Example form<\/th><th>Keeps directory tree<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Single file to explicit destination<\/td><td>&lt;copy file=&#8217;&#8230;&#8217; tofile=&#8217;&#8230;&#8217; \/&gt;<\/td><td>No<\/td><td>Manifest or one config file with a fixed target name<\/td><\/tr><tr><td>Bulk copy with fileset<\/td><td>&lt;copy todir=&#8217;&#8230;&#8217;&gt;&lt;fileset &#8230; \/&gt;&lt;\/copy&gt;<\/td><td>Yes<\/td><td>Resource folders with many files<\/td><\/tr><tr><td>Pattern-filtered copy<\/td><td>Include and exclude patterns<\/td><td>Yes<\/td><td>Copy only certain file types or paths<\/td><\/tr><tr><td>Flattened bulk copy<\/td><td>flatten=&#8217;true&#8217;<\/td><td>No<\/td><td>Collect jars and zips into one runtime lib directory<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Practical examples for include, exclude, flatten, and cleanup<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Copy images while excluding GIF files (attribute form)<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">todir<\/span>=<span class=\"hljs-string\">'${dist}'<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">fileset<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">'${src}'<\/span> <span class=\"hljs-attr\">includes<\/span>=<span class=\"hljs-string\">'**\/images\/*'<\/span> <span class=\"hljs-attr\">excludes<\/span>=<span class=\"hljs-string\">'**\/*.gif'<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">copy<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">The same filter using nested include and exclude elements<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">todir<\/span>=<span class=\"hljs-string\">'${dist}'<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">fileset<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">'${src}'<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">include<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'**\/images\/*'<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">exclude<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'**\/*.gif'<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">fileset<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">copy<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Flatten nested libraries into one output folder<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">todir<\/span>=<span class=\"hljs-string\">'${temp.dir.lib}'<\/span> <span class=\"hljs-attr\">flatten<\/span>=<span class=\"hljs-string\">'true'<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">fileset<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">'${lib.dir}'<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">exclude<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'${cob.lib.dir}'<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">exclude<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'junit*'<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">include<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'**\/*.jar'<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">include<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'**\/*.zip'<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">fileset<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">copy<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Delete the original selection after copying (when your process requires cleanup)<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">delete<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">'${dist}'<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">include<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'**\/images\/*'<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">exclude<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'**\/*.gif'<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">delete<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Copy-stage workflow in a typical Ant build<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This flow shows where targeted copies, filtered copies, and optional cleanup usually sit between compilation and packaging.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart LR\n    A[Compile sources] --> B[Copy fixed config files]\n    B --> C[Copy fileset resources]\n    C --> D{Use flatten}\n    D -- Yes --> E[Write into one lib directory]\n    D -- No --> F[Keep source folder layout]\n    E --> G[Package artifact]\n    F --> G\n    G --> H[Optional cleanup]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Use Ant properties for all source and destination paths so environments stay portable.<\/li><li>Prefer explicit include and exclude rules instead of copying entire trees blindly.<\/li><li>Be careful with <code>flatten='true'<\/code>: files with identical names from different folders can overwrite each other.<\/li><li>Use <code>overwrite='true'<\/code> only when deterministic replacement is desired.<\/li><li>Keep copy and delete rules close to packaging targets so the build intent is obvious.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn practical Apache Ant copy task patterns for real build pipelines, from single-file copies to filtered FileSets and flattened library bundles. Includes reusable XML snippets and a workflow diagram.<\/p>\n","protected":false},"author":1,"featured_media":4396,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[12],"tags":[209,4193,4196,4190,4194,4192,4188,4195,4189,4191],"class_list":["post-274","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apache-ant","tag-ant","tag-ant-copy-task-examples","tag-ant-copy-task-guide","tag-ant-copy-task-samples","tag-ant-task-copy-delete-examples","tag-apache-ant-copy","tag-copy-task","tag-how-to-use-ant-copy-task","tag-samples","tag-samples-ant-copy-task"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=274"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/274\/revisions"}],"predecessor-version":[{"id":79103,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/274\/revisions\/79103"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4396"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}