Originally published on 2009-06-20; fully revised and updated.
This guide explains a common Apache Ant copy/fileset troubleshooting case: one include style appears to fail while another works. If you maintain legacy Ant build files, this will help you understand how include patterns are interpreted and how to make file-copy targets deterministic.
The original question and examples came from this post, using Apache Ant version 1.5.4.

Problem statement and observed behavior
The reported issue: a copy task with a nested <include name="..."/> did not copy files, while a self-closing fileset using an includes attribute did work, even though the file names looked the same.
| Approach | Syntax style | How Ant interprets it | Likely result |
|---|---|---|---|
| Program 1 | One nested include element containing a comma-separated string in name | Treated as one pattern string | No match (or unexpected match) |
| Program 2 | includes attribute on fileset with comma-separated list | Treated as a list of patterns | Expected files copied |
Why Program 1 can fail while Program 2 works
The key difference is pattern list parsing. In Ant, a nested <include> typically represents one pattern per element, while the includes attribute supports a list format. So this is not just visual syntax variation; it changes how the matcher receives patterns. See the Ant manual for FileSet and PatternSet.
- Use multiple nested
<include name="..."/>entries if you choose nested form. - Use
includes="a,b,c"when you want one-line list syntax. - Be careful with exact file names, case sensitivity, and relative directory paths.
Correct ways to specify multiple include patterns
Option A: Use the includes attribute (compact form)
<copy todir="${Temp}/uaw/Uaw_compilescripts">
<fileset dir="${SVNCheckout}/scripts/compilescripts"
includes="BuildSh,Compsh,vsamc,buildc.sh,script,compl2,main.sh,makefile,makepl1"/>
</copy>Code language: HTML, XML (xml)
Option B: Use multiple nested include elements (explicit form)
<copy todir="${Temp}/uaw/Uaw_compilescripts">
<fileset dir="${SVNCheckout}/scripts/compilescripts">
<include name="BuildSh"/>
<include name="Compsh"/>
<include name="vsamc"/>
<include name="buildc.sh"/>
<include name="script"/>
<include name="compl2"/>
<include name="main.sh"/>
<include name="makefile"/>
<include name="makepl1"/>
</fileset>
</copy>Code language: HTML, XML (xml)
Optional: wildcard-based patterns for maintainability
<copy todir="${Temp}/uaw/Uaw_compilescripts">
<fileset dir="${SVNCheckout}/scripts/compilescripts"
includes="**/*.sh,**/makefile"/>
</copy>Code language: HTML, XML (xml)
How Ant processes file selection in copy tasks
flowchart TD
A[Define copy task] --> B[Create fileset]
B --> C{Include style}
C --> D[includes attribute list]
C --> E[nested include elements]
D --> F[Split into patterns]
E --> G{Single include contains commas}
G -- yes --> H[Treated as one pattern]
G -- no --> I[Each include is one pattern]
F --> J[Match files under dir]
H --> J
I --> J
J --> K{Any files matched}
K -- no --> L[No files copied]
K -- yes --> M[Files copied]
Troubleshooting commands and checks
When results are unexpected, run Ant with extra logging and verify resolved property values.
ant -version
ant -verbose your-target
ant -d your-target
<echo message="SVNCheckout=${SVNCheckout}"/>
<echo message="Temp=${Temp}"/>Code language: HTML, XML (xml)
- Confirm the
fileset direxists at runtime. - Check case sensitivity of file names on your OS/filesystem.
- Avoid combining many literal names into a single nested
include name. - Remove duplicates (for example,
scriptlisted twice) to keep intent clear.
Best practices
- Prefer one pattern per nested include element when using nested syntax.
- Use the includes attribute for concise pattern lists.
- Add temporary
echostatements and run with-verboseduring debugging. - Keep include patterns simple and predictable; move complex matching into well-named pattern sets.
I’m Rajesh Kumar, a DevOps, SRE, DevSecOps, Cloud, and Platform Engineering expert passionate about sharing practical knowledge, real-world experiences, and industry best practices. I have worked at Cotocus and regularly write about technology, travel, investing, health, product reviews, and digital marketing through my various platforms.
I publish technical articles at DevOps School, travel stories at Holiday Landmark, stock market insights at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at TrueReviewNow, and SEO and digital marketing strategies at Wizbrand.
Find Trusted Cardiac Hospitals
Compare heart hospitals by city and services — all in one place.
Explore Hospitals
One challenge that often appears in long-running Ant projects is that copy rules can become difficult to maintain as the application structure evolves. When new modules, resources, or deployment requirements are added, existing patterns may no longer represent the actual artifact requirements. Instead of only fixing copy configuration issues when they occur, teams can introduce automated artifact checks to verify that expected files, configurations, and dependencies are included before release. This approach helps prevent silent packaging errors and improves confidence in deployment processes, especially when multiple teams contribute changes to the same build system.