{"id":217,"date":"2026-10-12T23:21:14","date_gmt":"2026-10-12T23:21:14","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/03\/21\/power-point-ppt-apache-ant\/"},"modified":"2026-10-12T23:21:14","modified_gmt":"2026-10-12T23:21:14","slug":"power-point-ppt-apache-ant","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/power-point-ppt-apache-ant\/","title":{"rendered":"Apache Ant Complete Guide: build.xml Structure, Commands, CI Workflow, and Tool Comparison"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-03-21; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Apache Ant is a Java-based build automation tool that gives you explicit control over build steps through XML targets and tasks. This guide is for DevOps and Java engineers who need to maintain or modernize Ant builds, understand execution flow, and run Ant reliably in local and CI environments.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/03\/introduction-apache-ant-1.png\" alt=\"Apache Ant presentation cover image\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Original slide deck and attribution<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post shared a SlideShare presentation: <a href=\"https:\/\/www.slideshare.net\/rajeshatbuzz\/apache-ant-1117746\">Apache Ant<\/a> by <a href=\"https:\/\/www.slideshare.net\/rajeshatbuzz\">Rajesh Kumar<\/a>.<\/p>\n\n\n\n<iframe loading=\"lazy\" src=\"https:\/\/www.slideshare.net\/slideshow\/embed_code\/key\/t9sQUztoc4MQ5r\" width=\"595\" height=\"485\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" allowfullscreen=\"allowfullscreen\"><\/iframe>\n\n\n\n<h2 class=\"wp-block-heading\">Apache Ant fundamentals<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ant builds are usually defined in a <code>build.xml<\/code> file. A project contains named targets, and each target executes one or more tasks (for example <code>javac<\/code>, <code>jar<\/code>, <code>copy<\/code>, and <code>delete<\/code>).<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>project<\/strong>: top-level build definition<\/li><li><strong>target<\/strong>: a named phase such as clean, compile, package, deploy<\/li><li><strong>task<\/strong>: an executable unit inside a target<\/li><li><strong>property<\/strong>: reusable values for paths, artifact names, and environment settings<\/li><li><strong>depends<\/strong>: target ordering and dependency chain<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How a typical Ant build flows<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most Ant pipelines follow a deterministic sequence: initialize, compile, test, package, then publish or deploy.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Developer commits changes] --> B[CI job runs ant clean]\n    B --> C[Compile target runs]\n    C --> D[Test target runs]\n    D --> E{Tests pass}\n    E -- No --> F[Fail build and notify]\n    E -- Yes --> G[Package artifact]\n    G --> H[Publish or deploy]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Minimal build.xml you can run<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This example shows a small but practical target chain for clean, compile, and package.<\/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\">project<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"demo-app\"<\/span> <span class=\"hljs-attr\">default<\/span>=<span class=\"hljs-string\">\"package\"<\/span> <span class=\"hljs-attr\">basedir<\/span>=<span class=\"hljs-string\">\".\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"app.name\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"demo-app\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"src.dir\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"src\/main\/java\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"build.dir\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"build\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"dist.dir\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"dist\"<\/span>\/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"clean\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">delete<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">\"${build.dir}\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">delete<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">\"${dist.dir}\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">target<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"compile\"<\/span> <span class=\"hljs-attr\">depends<\/span>=<span class=\"hljs-string\">\"clean\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mkdir<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">\"${build.dir}\/classes\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">javac<\/span> <span class=\"hljs-attr\">srcdir<\/span>=<span class=\"hljs-string\">\"${src.dir}\"<\/span> <span class=\"hljs-attr\">destdir<\/span>=<span class=\"hljs-string\">\"${build.dir}\/classes\"<\/span> <span class=\"hljs-attr\">includeantruntime<\/span>=<span class=\"hljs-string\">\"false\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">target<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"package\"<\/span> <span class=\"hljs-attr\">depends<\/span>=<span class=\"hljs-string\">\"compile\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mkdir<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">\"${dist.dir}\"<\/span>\/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">jar<\/span> <span class=\"hljs-attr\">destfile<\/span>=<span class=\"hljs-string\">\"${dist.dir}\/${app.name}.jar\"<\/span> <span class=\"hljs-attr\">basedir<\/span>=<span class=\"hljs-string\">\"${build.dir}\/classes\"<\/span>\/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">target<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">project<\/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\">Useful local commands:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">ant<\/span> <span class=\"hljs-selector-tag\">-version<\/span>\n<span class=\"hljs-selector-tag\">ant<\/span> <span class=\"hljs-selector-tag\">-p<\/span>\n<span class=\"hljs-selector-tag\">ant<\/span> <span class=\"hljs-selector-tag\">clean<\/span>\n<span class=\"hljs-selector-tag\">ant<\/span> <span class=\"hljs-selector-tag\">package<\/span>\n<span class=\"hljs-selector-tag\">ant<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">build<\/span><span class=\"hljs-selector-class\">.xml<\/span> <span class=\"hljs-selector-tag\">package<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Reusable patterns for real projects<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Externalize environment settings<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use property files and command-line overrides instead of hardcoding paths or environments.<\/p>\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\">property<\/span> <span class=\"hljs-attr\">file<\/span>=<span class=\"hljs-string\">\"build.properties\"<\/span>\/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"deploy.env\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"dev\"<\/span>\/&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"deploy\"<\/span> <span class=\"hljs-attr\">depends<\/span>=<span class=\"hljs-string\">\"package\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span> <span class=\"hljs-attr\">message<\/span>=<span class=\"hljs-string\">\"Deploying ${app.name}.jar to ${deploy.env}\"<\/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<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">ant -Ddeploy.env=staging deploy<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Run Ant in a CI workflow<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A simple CI job can call Ant targets directly after setting up Java.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http language-yaml\"><span class=\"hljs-attribute\">name<\/span>: ant-build\n<span class=\"hljs-attribute\">on<\/span>: &#91;push]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v4\n      - uses: actions\/setup-java@v4\n        with:\n          distribution: temurin\n          java-version: '17'\n      - name: Build with Ant\n        run: ant clean package<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Apache Ant vs Maven vs Gradle<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These tools overlap but optimize for different build styles and team preferences.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tool<\/th><th>Build definition style<\/th><th>Dependency management<\/th><th>Convention vs control<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Apache Ant<\/td><td>XML targets and tasks<\/td><td>Not built in by default (often paired with Ivy or custom logic)<\/td><td>Maximum control, low convention<\/td><td>Legacy Java builds, custom task orchestration, non-standard workflows<\/td><\/tr><tr><td>Maven<\/td><td>XML POM lifecycle model<\/td><td>Built in<\/td><td>High convention, less low-level control<\/td><td>Standardized Java project structures and lifecycle-driven builds<\/td><\/tr><tr><td>Gradle<\/td><td>Groovy\/Kotlin DSL<\/td><td>Built in<\/td><td>Convention plus strong extensibility<\/td><td>Modern JVM projects, multi-module builds, flexible automation<\/td><\/tr><\/tbody><\/table><\/figure>\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>Keep targets <em>idempotent<\/em> so reruns are safe in CI.<\/li><li>Centralize path and artifact values in properties; avoid hardcoded absolute paths.<\/li><li>Use <code>depends<\/code> to model order clearly instead of manually invoking nested target flows.<\/li><li>Use <code>ant -p<\/code> to document available targets and maintain discoverability.<\/li><li>Pin Java and Ant runtime versions in CI to reduce environment drift.<\/li><li>If you use optional tasks (for example test integrations), verify required task libraries are present on the Ant classpath.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn how Apache Ant works in real DevOps workflows, from core build.xml concepts to practical command-line and CI usage. This revised guide also compares Ant with Maven and Gradle so you can choose the right build approach.<\/p>\n","protected":false},"author":1,"featured_media":4250,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[12],"tags":[3820,683,3819,3816,2880,3738,3739,3740,3818,3727,3094,3817,3753],"class_list":["post-217","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apache-ant","tag-advantages-of-ant","tag-apache-ant","tag-apache-ant-benefits","tag-apache-ant-complete-guide","tag-apache-ant-introduction","tag-apache-ant-ppt","tag-apache-ant-presentation","tag-apache-ant-slideshare","tag-apache-ant-usage","tag-ppt","tag-presentation","tag-presentation-on-apache-ant-by-experts","tag-slideshare"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/217","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=217"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/217\/revisions"}],"predecessor-version":[{"id":79057,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/217\/revisions\/79057"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4250"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}