{"id":210,"date":"2026-10-12T21:01:39","date_gmt":"2026-10-12T21:01:39","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/03\/21\/power-point-ppt-using-ant-to-build-j2-ee-application\/"},"modified":"2026-10-12T21:01:39","modified_gmt":"2026-10-12T21:01:39","slug":"power-point-ppt-using-ant-to-build-j2-ee-application","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/power-point-ppt-using-ant-to-build-j2-ee-application\/","title":{"rendered":"Using Apache Ant to Build J2EE Applications: Workflow, build.xml Template, and Commands"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Apache Ant is a target-driven build tool that is still widely encountered in legacy Java EE (historically called J2EE) environments. This guide is for engineers who need to maintain, troubleshoot, or standardize Ant-based enterprise builds, with a clear workflow, practical commands, and reusable configuration examples.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-03-21; fully revised and updated.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Original presentation and attribution<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post was primarily a slide embed. Source links preserved here: <a href=\"https:\/\/www.devopsschool.com\/blog\/power-point-ppt-using-ant-to-build-j2-ee-application\/\">original article permalink<\/a>, <a href=\"https:\/\/www.slideshare.net\/rajeshatbuzz\/using-ant-to-build-j2-ee-applications\">Using Ant To Build J2 Ee Applications<\/a>, and author profile <a href=\"https:\/\/www.slideshare.net\/rajeshatbuzz\">Rajesh Kumar<\/a>.<\/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\/ant-to-build-j2-ee-applicat.png\" alt=\"Using Ant to build J2EE applications slide cover\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-slideshare wp-block-embed-slideshare\"><div class=\"wp-block-embed__wrapper\">https:\/\/www.slideshare.net\/rajeshatbuzz\/using-ant-to-build-j2-ee-applications<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What Ant typically handles in a J2EE build<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In enterprise Java projects, Ant usually orchestrates repeatable steps from source code to deployable artifacts. A typical Ant file (<code>build.xml<\/code>) defines targets and dependencies between those targets.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Clean old build outputs<\/li><li>Compile Java sources with explicit classpaths<\/li><li>Assemble WAR files for web modules<\/li><li>Assemble JAR modules (for example, EJB-related classes)<\/li><li>Package EAR files for application server deployment<\/li><li>Copy artifacts to a deployment directory or handoff location<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Reference workflow for an Ant-based J2EE pipeline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is a practical flow you can adapt for CI jobs or local builds.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Developer updates source] --> B[ant clean]\n    B --> C[ant compile]\n    C --> D[ant test]\n    D --> E{Tests pass}\n    E -- no --> F[Fix code and rerun]\n    E -- yes --> G[ant war]\n    G --> H[ant ear]\n    H --> I[Publish artifact to app server]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Suggested project layout and properties<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Keep paths centralized in <code>build.properties<\/code> so environment changes do not require editing <code>build.xml<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-text\">inventory-app\/\n\u251c\u2500\u2500 build.xml\n\u251c\u2500\u2500 build.properties\n\u251c\u2500\u2500 lib\/\n\u251c\u2500\u2500 src\/main\/java\/\n\u251c\u2500\u2500 src\/main\/webapp\/\n\u251c\u2500\u2500 src\/main\/config\/META-INF\/application.xml\n\u251c\u2500\u2500 build\/\n\u2514\u2500\u2500 dist\/<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-properties\">app.name=inventory-app\njava.version=<span class=\"hljs-number\">1.8<\/span>\nsrc.dir=src\/main\/java\nweb.dir=src\/main\/webapp\nconf.dir=src\/main\/config\nlib.dir=lib\nbuild.dir=build\nclasses.dir=build\/classes\ndist.dir=dist\ndeploy.dir=<span class=\"hljs-regexp\">\/opt\/<\/span>appserver\/autodeploy<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Example build.xml for compile, WAR, EAR, and deploy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The example below shows a conventional Ant target chain. Adapt module paths and packaging rules to your real application structure.<\/p>\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-tag\">&lt;<span class=\"hljs-name\">project<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'inventory-app'<\/span> <span class=\"hljs-attr\">default<\/span>=<span class=\"hljs-string\">'ear'<\/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\">file<\/span>=<span class=\"hljs-string\">'build.properties'<\/span>\/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">path<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">'compile.classpath'<\/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\">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\">fileset<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">path<\/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\">'init'<\/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\">'${classes.dir}'<\/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\">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\">'init'<\/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>\n               <span class=\"hljs-attr\">destdir<\/span>=<span class=\"hljs-string\">'${classes.dir}'<\/span>\n               <span class=\"hljs-attr\">source<\/span>=<span class=\"hljs-string\">'${java.version}'<\/span>\n               <span class=\"hljs-attr\">target<\/span>=<span class=\"hljs-string\">'${java.version}'<\/span>\n               <span class=\"hljs-attr\">includeantruntime<\/span>=<span class=\"hljs-string\">'false'<\/span>\n               <span class=\"hljs-attr\">classpathref<\/span>=<span class=\"hljs-string\">'compile.classpath'<\/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\">'war'<\/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\">war<\/span> <span class=\"hljs-attr\">destfile<\/span>=<span class=\"hljs-string\">'${dist.dir}\/${app.name}.war'<\/span> <span class=\"hljs-attr\">webxml<\/span>=<span class=\"hljs-string\">'${web.dir}\/WEB-INF\/web.xml'<\/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\">'${web.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\">'WEB-INF\/web.xml'<\/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\">classes<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">'${classes.dir}'<\/span>\/&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">lib<\/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\">war<\/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\">'ejb-jar'<\/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\">jar<\/span> <span class=\"hljs-attr\">destfile<\/span>=<span class=\"hljs-string\">'${dist.dir}\/${app.name}-ejb.jar'<\/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\">'${classes.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\">'**\/ejb\/**\/*.class'<\/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\">jar<\/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\">'ear'<\/span> <span class=\"hljs-attr\">depends<\/span>=<span class=\"hljs-string\">'war,ejb-jar'<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ear<\/span> <span class=\"hljs-attr\">destfile<\/span>=<span class=\"hljs-string\">'${dist.dir}\/${app.name}.ear'<\/span> <span class=\"hljs-attr\">appxml<\/span>=<span class=\"hljs-string\">'${conf.dir}\/META-INF\/application.xml'<\/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\">'${dist.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\">'${app.name}.war'<\/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\">'${app.name}-ejb.jar'<\/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\">ear<\/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\">'deploy'<\/span> <span class=\"hljs-attr\">depends<\/span>=<span class=\"hljs-string\">'ear'<\/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\">'${dist.dir}\/${app.name}.ear'<\/span> <span class=\"hljs-attr\">todir<\/span>=<span class=\"hljs-string\">'${deploy.dir}'<\/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\">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-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\">Common Ant commands you can run<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># List available targets<\/span>\nant -p\n\n<span class=\"hljs-comment\"># Clean and build from scratch<\/span>\nant clean ear\n\n<span class=\"hljs-comment\"># Build only the web archive<\/span>\nant war\n\n<span class=\"hljs-comment\"># Deploy to a specific directory at runtime<\/span>\nant deploy -Ddeploy.dir=\/srv\/appserver\/autodeploy<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Ant vs Maven vs Gradle in enterprise Java builds<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tool<\/th><th>Build style<\/th><th>Dependency management<\/th><th>Best for<\/th><th>Typical trade-off<\/th><\/tr><\/thead><tbody><tr><td>Ant<\/td><td>Imperative XML targets and task flow<\/td><td>Manual classpath or add-ons such as Ivy<\/td><td>Legacy systems and highly customized build steps<\/td><td>More boilerplate and convention must be maintained by the team<\/td><\/tr><tr><td>Maven<\/td><td>Convention-driven lifecycle with POM<\/td><td>Built-in repository model<\/td><td>Standardized Java project structure and repeatable enterprise builds<\/td><td>Less flexible when workflows are unusual<\/td><\/tr><tr><td>Gradle<\/td><td>Declarative plus programmable DSL<\/td><td>Built-in repository support<\/td><td>Large multi-module builds needing flexibility and performance tuning<\/td><td>Higher DSL complexity for new maintainers<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls and best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Keep environment values externalized:<\/strong> use <code>build.properties<\/code> and runtime <code>-D<\/code> overrides for server-specific paths.<\/li><li><strong>Make targets composable:<\/strong> separate <code>clean<\/code>, <code>compile<\/code>, <code>war<\/code>, <code>ear<\/code>, and <code>deploy<\/code> so CI can call only what it needs.<\/li><li><strong>Fail early:<\/strong> ensure compile and test targets run before packaging targets in the dependency chain.<\/li><li><strong>Avoid hidden local dependencies:<\/strong> keep third-party JAR handling explicit and documented.<\/li><li><strong>Plan gradual modernization:<\/strong> if migration is needed, map current Ant targets to Maven\/Gradle equivalents before changing tooling.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If your organization still runs Ant for Java EE delivery, consistency matters more than novelty: clear target dependencies, centralized properties, and deterministic packaging will reduce build failures and deployment drift.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A practical, modernized guide to building legacy J2EE\/Java EE applications with Apache Ant. Learn the build workflow, use a reusable build.xml template, and compare Ant with Maven and Gradle.<\/p>\n","protected":false},"author":1,"featured_media":4231,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[12],"tags":[209,310,91,3755,3756,3758,3759,3760,1122,3757,3761,1806,3752,3754,3727,3728,593,3753,213],"class_list":["post-210","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apache-ant","tag-ant","tag-application","tag-build","tag-build-j2ee-application","tag-build-j2ee-application-using-ant","tag-build-j2ee-application-using-ant-ppt","tag-build-j2ee-application-using-ant-presentation","tag-build-j2ee-application-using-ant-slideshare","tag-guide","tag-how-to-build-j2ee-application-in-ant","tag-how-to-build-j2ee-application-in-ant-ppt","tag-instruction","tag-j2ee","tag-j2ee-application","tag-ppt","tag-ppt-presentation","tag-process","tag-slideshare","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/210","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=210"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/210\/revisions"}],"predecessor-version":[{"id":79043,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/210\/revisions\/79043"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4231"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=210"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=210"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}