{"id":276,"date":"2026-10-13T07:21:42","date_gmt":"2026-10-13T07:21:42","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/07\/22\/a-sample-ant-build-script-that-builds-a-war-file\/"},"modified":"2026-10-13T07:21:42","modified_gmt":"2026-10-13T07:21:42","slug":"a-sample-ant-build-script-that-builds-a-war-file","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/a-sample-ant-build-script-that-builds-a-war-file\/","title":{"rendered":"Ant build.xml for WAR Packaging and Tomcat Deployment (Annotated Reference)"},"content":{"rendered":"\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\">If you maintain or modernize Java web applications that still use Apache Ant, this walkthrough shows how a WAR-oriented <code>build.xml<\/code> works end to end: from cleanup and compilation to packaging and deployment into a Tomcat <code>webapps<\/code> directory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This revision is based on the original sample post: <a href='https:\/\/www.devopsschool.com\/blog\/a-sample-ant-build-script-that-builds-a-war-file\/'>A sample Ant build script that builds a WAR file<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img src='https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2010\/07\/ant-build-script.png' alt='Ant build script WAR file example' width='600' height='400' \/><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">WAR build workflow in this Ant script<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The script defines two deployment paths: a full WAR build\/install path and a faster JSP\/static-only refresh path.<\/p>\n\n\n\n<pre class='mermaid'>\nflowchart TD\n    A[Run Ant target] --> B{Target selected}\n    B -->|install| C[clean and prepare]\n    C --> D[compile sources]\n    D --> E[copy descriptors and resources]\n    E --> F[build WAR archive]\n    F --> G[copy WAR to app server webapps]\n    B -->|jsps| H[copy JSP and static assets only]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Expected properties and project layout<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The build relies on conventional directories for source, web pages, resources, and libraries. During packaging, it stages content into a temporary WAR-like folder structure under <code>temp\/WEB-INF<\/code>.<\/p>\n\n\n\n<ul class='wp-block-list'><li><code>src<\/code>: Java source files<\/li><li><code>src-tests<\/code>: test or auxiliary Java sources (compiled by this sample)<\/li><li><code>pages<\/code>: JSP and static web content<\/li><li><code>resources<\/code>: <code>web.xml<\/code>, manifest, and app XML files<\/li><li><code>lib<\/code>: JAR dependencies for compile and WAR inclusion<\/li><li><code>target<\/code>: final WAR output directory<\/li><\/ul>\n\n\n<pre class='wp-block-code'><span><code class=\"hljs\" class='language-text'>project-root\/\n\u251c\u2500\u2500 build.xml\n\u251c\u2500\u2500 lib\/\n\u251c\u2500\u2500 pages\/\n\u251c\u2500\u2500 resources\/\n\u2502   \u251c\u2500\u2500 MANIFEST.MF\n\u2502   \u251c\u2500\u2500 web.xml\n\u2502   \u251c\u2500\u2500 managed-beans.xml\n\u2502   \u2514\u2500\u2500 navigation-rules.xml\n\u251c\u2500\u2500 src\/\n\u251c\u2500\u2500 src-tests\/\n\u2514\u2500\u2500 target\/<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Reference build.xml (based on the original sample)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The following is a cleaned, readable version of the sample logic from the original post.<\/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\" class='language-xml'><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'MyWebApplication'<\/span> <span class=\"hljs-attr\">basedir<\/span>=<span class=\"hljs-string\">'..'<\/span> <span class=\"hljs-attr\">default<\/span>=<span class=\"hljs-string\">'install'<\/span>&gt;<\/span>\n\n  <span class=\"hljs-comment\">&lt;!-- project-specific variables --&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'jsp.dir.name'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'myapp'<\/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\">'package.name'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'${jsp.dir.name}.war'<\/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\">'webapp.dir'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'\/Users\/al\/tomcat-6.0.16\/webapps'<\/span> \/&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">environment<\/span>=<span class=\"hljs-string\">'env'<\/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\">file<\/span>=<span class=\"hljs-string\">'${build.dir}\/build.${env.HOSTNAME}'<\/span> \/&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'lib.dir'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'lib'<\/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\">'pages.dir'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'pages'<\/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'<\/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.tests.dir'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'src-tests'<\/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\">'resources.dir'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'resources'<\/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\">'dest.dir'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'target'<\/span> \/&gt;<\/span>\n\n  <span class=\"hljs-comment\">&lt;!-- temporary staging structure --&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'temp.dir'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'temp'<\/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\">'temp.dir.web-inf'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'${temp.dir}\/WEB-INF'<\/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\">'temp.dir.lib'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'${temp.dir.web-inf}\/lib'<\/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\">'temp.dir.classes'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'${temp.dir.web-inf}\/classes'<\/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\">'temp.dir.meta-inf'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'${temp.dir}\/META-INF'<\/span> \/&gt;<\/span>\n\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">'package.file'<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">'${dest.dir}\/${package.name}'<\/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\">'build.class.path'<\/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>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">fileset<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">'${dest.dir}'<\/span> <span class=\"hljs-attr\">includes<\/span>=<span class=\"hljs-string\">'**\/*'<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">delete<\/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\">'${temp.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\">'${temp.dir.classes}'<\/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\">'${temp.dir.meta-inf}'<\/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\">'${temp.dir.web-inf}'<\/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\">'prepare'<\/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\">'${dest.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\">'${temp.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\">'${temp.dir.lib}'<\/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\">'${temp.dir.meta-inf}'<\/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\">'${temp.dir.web-inf}'<\/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\">'${temp.dir.classes}'<\/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\">'prepare'<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span>&gt;<\/span>=== COMPILE ===<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">echo<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">javac<\/span> <span class=\"hljs-attr\">debug<\/span>=<span class=\"hljs-string\">'on'<\/span> <span class=\"hljs-attr\">srcdir<\/span>=<span class=\"hljs-string\">'${src.dir}'<\/span> <span class=\"hljs-attr\">destdir<\/span>=<span class=\"hljs-string\">'${temp.dir.classes}'<\/span> <span class=\"hljs-attr\">includes<\/span>=<span class=\"hljs-string\">'**\/*'<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">classpath<\/span> <span class=\"hljs-attr\">refid<\/span>=<span class=\"hljs-string\">'build.class.path'<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">javac<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">javac<\/span> <span class=\"hljs-attr\">debug<\/span>=<span class=\"hljs-string\">'on'<\/span> <span class=\"hljs-attr\">srcdir<\/span>=<span class=\"hljs-string\">'${src.tests.dir}'<\/span> <span class=\"hljs-attr\">destdir<\/span>=<span class=\"hljs-string\">'${temp.dir.classes}'<\/span> <span class=\"hljs-attr\">includes<\/span>=<span class=\"hljs-string\">'com\/**'<\/span>&gt;<\/span>\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">classpath<\/span> <span class=\"hljs-attr\">refid<\/span>=<span class=\"hljs-string\">'build.class.path'<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">javac<\/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\">echo<\/span>&gt;<\/span>=== PACKAGE ===<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">echo<\/span>&gt;<\/span>\n\n    <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}\/web.xml'<\/span> <span class=\"hljs-attr\">tofile<\/span>=<span class=\"hljs-string\">'${temp.dir.web-inf}\/web.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}\/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\n    <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\">fileset<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">copy<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">war<\/span> <span class=\"hljs-attr\">destfile<\/span>=<span class=\"hljs-string\">'${package.file}'<\/span> <span class=\"hljs-attr\">webxml<\/span>=<span class=\"hljs-string\">'${temp.dir.web-inf}\/web.xml'<\/span> <span class=\"hljs-attr\">basedir<\/span>=<span class=\"hljs-string\">'${temp.dir}'<\/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\">'${pages.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\">classes<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">'${temp.dir.classes}'<\/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\">'jsps'<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span>&gt;<\/span>=== DEPLOY JSPS ===<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">echo<\/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\">'${webapp.dir}\/${jsp.dir.name}'<\/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\">'${pages.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\">'**\/*.jsp'<\/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\">'**\/*.html'<\/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\">'**\/*.css'<\/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\">'**\/*.gif'<\/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\">'**\/*.jpg'<\/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\">'**\/*.png'<\/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\">'**\/*.js'<\/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  <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\">'install'<\/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>&gt;<\/span>=== INSTALL ===<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">echo<\/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\">'${package.file}'<\/span> <span class=\"hljs-attr\">tofile<\/span>=<span class=\"hljs-string\">'${webapp.dir}\/${package.name}'<\/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\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<h2 class=\"wp-block-heading\">Run the build targets<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use Ant target names directly. Override environment-specific paths with <code>-D<\/code> properties to avoid editing <code>build.xml<\/code> per machine.<\/p>\n\n\n<pre class='wp-block-code' aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\" class='language-bash'><span class=\"hljs-comment\"># Full build and WAR creation<\/span>\nant package\n\n<span class=\"hljs-comment\"># Build and copy WAR into Tomcat webapps<\/span>\nant install -Dwebapp.dir=\/opt\/tomcat\/webapps\n\n<span class=\"hljs-comment\"># Fast JSP\/static-only refresh<\/span>\nant jsps -Dwebapp.dir=\/opt\/tomcat\/webapps -Djsp.dir.name=myapp\n\n<span class=\"hljs-comment\"># Clean output directories<\/span>\nant clean<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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\">Target comparison<\/h2>\n\n\n\n<figure class='wp-block-table'><table class='has-fixed-layout'><thead><tr><th>Target<\/th><th>Depends on<\/th><th>Primary output<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>clean<\/td><td>None<\/td><td>Removes temp and target artifacts<\/td><td>Resetting state before a new build<\/td><\/tr><tr><td>prepare<\/td><td>clean<\/td><td>Creates staging\/output directories<\/td><td>Pre-compilation setup<\/td><\/tr><tr><td>compile<\/td><td>prepare<\/td><td>Compiled classes in temp\/WEB-INF\/classes<\/td><td>Verifying code compiles<\/td><\/tr><tr><td>package<\/td><td>compile<\/td><td>WAR file in target\/<\/td><td>Artifact creation for CI\/CD<\/td><\/tr><tr><td>install<\/td><td>package<\/td><td>WAR copied to server webapps<\/td><td>Local or direct server deployment<\/td><\/tr><tr><td>jsps<\/td><td>None<\/td><td>JSP\/static files copied to deployed app dir<\/td><td>Fast UI\/content-only updates<\/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>Avoid hard-coded server paths.<\/strong> Externalize <code>webapp.dir<\/code> using <code>-D<\/code> properties or environment-specific property files.<\/li><li><strong>Keep test outputs separate from production classes.<\/strong> In this sample, <code>src-tests<\/code> compiles into the same classes directory used in the WAR.<\/li><li><strong>Be deliberate with bundled libraries.<\/strong> <code>lib\/**\/*.jar<\/code> is broad; verify you are not packaging container-provided JARs.<\/li><li><strong>Prefer CI artifact publishing over direct server copy.<\/strong> Use <code>package<\/code> to generate the WAR, then deploy through your pipeline.<\/li><li><strong>Fail fast on missing descriptors.<\/strong> Ensure required files like <code>web.xml<\/code> exist before packaging.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For legacy Ant projects, this pattern is still workable: keep targets small, parameterize environment values, and treat the generated WAR as the primary deployable artifact.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This guide turns a legacy Ant WAR build sample into a practical reference you can reuse. You will learn the target flow, required layout, runnable commands, and common pitfalls before using it in CI\/CD.<\/p>\n","protected":false},"author":1,"featured_media":4408,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[209,3827,4215,4212,4214,4209,4211,4216,4213,4219,378,4210,1122,3113,593,4218,213,4217],"class_list":["post-276","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-ant","tag-ant-build","tag-ant-build-script","tag-ant-build-script-for-war-file","tag-ant-script-to-build-war-file","tag-ant-war-task","tag-ant-war-task-meta-inf-example","tag-build-war-file","tag-build-war-file-using-ant","tag-build-war-file-with-ant","tag-commands","tag-create-war-file-using-ant-command","tag-guide","tag-how-to","tag-process","tag-sample","tag-tutorial","tag-war-file"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/276","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=276"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/276\/revisions"}],"predecessor-version":[{"id":79105,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/276\/revisions\/79105"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4408"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}