{"id":135,"date":"2026-10-12T11:41:18","date_gmt":"2026-10-12T11:41:18","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2009\/06\/20\/opy-and-include-issues-in-apache-ant\/"},"modified":"2026-10-12T11:41:18","modified_gmt":"2026-10-12T11:41:18","slug":"apache-ant-copy-and-include-issue","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/apache-ant-copy-and-include-issue\/","title":{"rendered":"Apache Ant Copy + FileSet Include Issue: Why Comma-Separated include name Fails"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">If your Apache Ant <code>&lt;copy&gt;<\/code> task seems to skip files when you use <code>&lt;include&gt;<\/code>, the problem is usually pattern syntax, not the copy task itself. This guide explains why one style fails, why the other works, and how to write include rules that are predictable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2009-06-20; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Source scenario: <a href=\"https:\/\/www.devopsschool.com\/blog\/apache-ant-copy-and-include-issue\/\">DevOpsSchool original post<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2009\/06\/issues-in-apache-ant-1.png\" alt=\"Apache Ant copy and include issue\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Why Program 1 fails and Program 2 works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In a <code>&lt;fileset&gt;<\/code>, a nested <code>&lt;include name=\"...\"\/&gt;<\/code> expects <strong>one pattern per include element<\/strong>. It does not automatically split a comma-separated string into many names. By contrast, the <code>includes=\"...\"<\/code> attribute supports a list, so comma-separated values are parsed as multiple patterns.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Failing style (single nested include with commas)<\/h3>\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\">todir<\/span>=<span class=\"hljs-string\">\"${Temp}\/uaw\/Uaw_compilescripts\"<\/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\">\"${SVNCheckout}\/scripts\/compilescripts\"<\/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\">\"BuildSh,Compsh,vsamc,buildc.sh,script,compl2,main.sh,makefile,makepl1,script\"<\/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-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\n<p class=\"wp-block-paragraph\">This is treated as one literal pattern string. Unless a real filename matches that entire comma-joined value, no files are copied.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Working styles<\/h3>\n\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-comment\">&lt;!-- Option A: one nested include per pattern --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">todir<\/span>=<span class=\"hljs-string\">\"${Temp}\/uaw\/Uaw_compilescripts\"<\/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\">\"${SVNCheckout}\/scripts\/compilescripts\"<\/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\">\"BuildSh\"<\/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\">\"Compsh\"<\/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\">\"vsamc\"<\/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\">\"buildc.sh\"<\/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\">\"script\"<\/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\">\"compl2\"<\/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\">\"main.sh\"<\/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\">\"makefile\"<\/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\">\"makepl1\"<\/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>\n\n<span class=\"hljs-comment\">&lt;!-- Option B: includes attribute with a list --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">todir<\/span>=<span class=\"hljs-string\">\"${Temp}\/uaw\/Uaw_compilescripts\"<\/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\">\"${SVNCheckout}\/scripts\/compilescripts\"<\/span>\n             <span class=\"hljs-attr\">includes<\/span>=<span class=\"hljs-string\">\"BuildSh,Compsh,vsamc,buildc.sh,script,compl2,main.sh,makefile,makepl1\"<\/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\">How Ant processes include patterns<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[copy task runs] --> B[fileset reads base directory]\n    B --> C{Pattern source}\n    C --> D[includes attribute list]\n    C --> E[nested include elements]\n    D --> F[List split into multiple patterns]\n    E --> G[Each include name is one pattern]\n    F --> H[Matching files copied]\n    G --> I[Comma joined name usually no match]\n    I --> J[Copy seems to fail]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Comparison of include approaches<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Approach<\/th><th>Example syntax<\/th><th>How patterns are interpreted<\/th><th>Typical result<\/th><\/tr><\/thead><tbody><tr><td>Nested include with comma list<\/td><td>&lt;include name=&#8221;a,b,c&#8221;\/&gt;<\/td><td>Single pattern string<\/td><td>Usually no matches<\/td><\/tr><tr><td>Nested include, one per item<\/td><td>&lt;include name=&#8221;a&#8221;\/&gt; then &lt;include name=&#8221;b&#8221;\/&gt;<\/td><td>Each include is evaluated separately<\/td><td>Works as expected<\/td><\/tr><tr><td>includes attribute list<\/td><td>includes=&#8221;a,b,c&#8221;<\/td><td>List is split into multiple patterns<\/td><td>Works as expected<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Debugging and verification commands<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When copy behavior is unclear, run Ant in verbose or debug mode to inspect resolved file patterns and copied files.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">ant -v copy-scripts\nant -d copy-scripts<\/code><\/span><\/pre>\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\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"copy-scripts\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">copy<\/span> <span class=\"hljs-attr\">todir<\/span>=<span class=\"hljs-string\">\"${Temp}\/uaw\/Uaw_compilescripts\"<\/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\">fileset<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">\"${SVNCheckout}\/scripts\/compilescripts\"<\/span>\n                 <span class=\"hljs-attr\">includes<\/span>=<span class=\"hljs-string\">\"BuildSh,Compsh,vsamc,buildc.sh,script,compl2,main.sh,makefile,makepl1\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">copy<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">target<\/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<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Use <code>includes=\"...\"<\/code> for compact lists, or one nested <code>&lt;include&gt;<\/code> per pattern.<\/li><li>Avoid duplicates in include lists (for example, repeated <code>script<\/code> entries) to keep builds readable.<\/li><li>Prefer explicit filenames or well-scoped wildcards so copy behavior is deterministic.<\/li><li>Use <code>ant -v<\/code> or <code>ant -d<\/code> whenever file selection does not match expectations.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>If Ant <copy> appears broken when using nested <include>, the root cause is usually pattern parsing. Learn the correct include syntax, compare options, and verify behavior with verbose Ant output.<\/p>\n","protected":false},"author":1,"featured_media":4058,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[12],"tags":[209,3196,3197,3200,3201,683,3195,3193,3194,2881,2882,2520,3191,3190,3192,3189,255,1028],"class_list":["post-135","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apache-ant","tag-ant","tag-ant-copy-and-include-issue-troubleshooting","tag-ant-copy-issue-troubleshooting-guide","tag-ant-troubleshooting","tag-ant-troubleshooting-guide","tag-apache-ant","tag-apache-ant-copy-and-include-issue","tag-apache-ant-copy-issue","tag-apache-ant-copy-toubleshoot","tag-apache-ant-guide","tag-apache-ant-tutorial","tag-copy","tag-copy-and-include-issue-in-ant","tag-copy-issue","tag-copy-problem","tag-include","tag-issues","tag-problems"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/135","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=135"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/135\/revisions"}],"predecessor-version":[{"id":78984,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/135\/revisions\/78984"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4058"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=135"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=135"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}