alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Ant example source code file (build.xml)

This example Ant source code file (build.xml) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Ant tags/keywords

ant, ant, apache, apache, create, foundation, license, license, name, notice, readme, set, set, software

The build.xml source code

<?xml version="1.0"?>

<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<project name="apache-ant" default="main" basedir=".">

  <!-- Give user a chance to override without editing this file
       (and without typing -D on each invocation) -->
  <property file=".ant.properties"/>
  <property file="${user.home}/.ant.properties"/>
  <property environment="env"/>


  <!--
       ===================================================================
         Set the properties that control names and versions
       ===================================================================
  -->
  <property name="Name" value="Apache Ant"/>
  <property name="name" value="ant"/>
  <!-- this is the groupId of ant in the Maven repository -->
  <property name="groupid" value="org.apache.ant"/>
  <property name="project.version" value="1.7.0"/>
  <!-- pom.version is used when doing a distribution and must match with what is checked in under src/etc/poms -->
  <property name="pom.version" value="1.7.0-SNAPSHOT"/>
  <property name="manifest-version" value="1.7.0"/>
  <property name="bootstrap.jar" value="ant-bootstrap.jar"/>

  <property name="ant.package" value="org/apache/tools/ant"/>
  <property name="taskdefs.package" value="${ant.package}/taskdefs"/>
  <property name="condition.package" value="${taskdefs.package}/condition"/>
  <property name="optional.package" value="${taskdefs.package}/optional"/>
  <property name="optional.condition.package" value="${optional.package}/condition"/>
  <property name="type.package" value="${ant.package}/types"/>
  <property name="optional.type.package" value="${type.package}/optional"/>
  <property name="apache.resolver.type.package" value="${ant.package}/types/resolver"/>
  <property name="util.package" value="${ant.package}/util"/>
  <property name="regexp.package" value="${util.package}/regexp"/>

  <property name="optional.jars.prefix" value="ant"/>
  <property name="optional.jars.whenmanifestonly" value="skip"/>

  <!--
       ===================================================================
         Set the properties that control various build options
       ===================================================================
  -->
  <property name="debug" value="true"/>
  <property name="chmod.fail" value="true"/>
  <property name="chmod.maxparallel" value="250"/>
  <property name="deprecation" value="false"/>
  <property name="optimize" value="true"/>
  <property name="javac.target" value="1.2"/>
  <property name="javac.source" value="1.2"/>
  <property name="junit.fork" value="false"/>
  <property name="junit.filtertrace" value="off"/>
  <property name="junit.summary" value="no"/>
  <property name="test.haltonfailure" value="false"/>
  <property name="junit.forkmode" value="once"/>
  <property name="unfiltered.files" value="**/*.gif,**/*.jpg,**/*.ico,**/*.pdf,**/*.zip"/>

  <!--
       ===================================================================
         Set the properties related to the source tree
       ===================================================================
  -->
  <property name="src.dir" value="src"/>
  <property name="java.dir" value="${src.dir}/main"/>
  <property name="script.dir" value="${src.dir}/script"/>
  <property name="lib.dir" value="lib"/>
  <property name="docs.dir" value="docs"/>
  <property name="etc.dir" value="${src.dir}/etc"/>
  <property name="src.junit" value="${src.dir}/tests/junit"/>
  <property name="src.antunit" value="${src.dir}/tests/antunit"/>
  <property name="tests.etc.dir" value="${src.dir}/etc/testcases"/>
  <property name="manifest" value="${src.dir}/etc/manifest"/>
  <property name="resource.dir" value="${src.dir}/resources"/>

  <!--
       ===================================================================
         Set the properties for the build area
       ===================================================================
  -->
  <property name="build.dir" value="build"/>
  <property name="bootstrap.dir" value="bootstrap"/>
  <property name="build.classes" value="${build.dir}/classes"/>
  <property name="build.lib" value="${build.dir}/lib"/>
  <property name="build.javadocs" value="${build.dir}/javadocs"/>
  <property name="build.tests" value="${build.dir}/testcases"/>
  <property name="build.tests.javadocs" value="${build.dir}/javadocs.test/"/>
  <property name="build.junit.xml" location="${build.tests}/xml"/>
  <property name="antunit.xml" location="${build.dir}/antunit/xml"/>
  <property name="antunit.reports" location="${build.dir}/antunit/reports"/>
  <property name="build.junit.reports" location="${build.tests}/reports"/>
  <property name="manifest.tmp" value="${build.dir}/optional.manifest"/>
  <!-- the absolute path -->
  <property name="build.tests.value" location="${build.tests}"/>

  <!--
       ===================================================================
         Set the paths used in the build
       ===================================================================
  -->
  <path id="classpath">
  </path>

  <path id="tests-classpath">
    <pathelement location="${build.classes}"/>
    <pathelement location="${build.tests}"/>
    <!--
        include the test source and test data dirs
        so that we can pick resources via getResource(AsStream)
     -->
    <pathelement location="${src.junit}"/>
    <pathelement location="${tests.etc.dir}"/>
    <path refid="classpath"/>
  </path>

  <!-- turn this path into a string which is passed to the tests -->
  <property name="tests-classpath.value"
    refid="tests-classpath"/>

  <!--
        ===================================================================
          Set up properties for the distribution area
        ===================================================================
   -->
  <property name="dist.name" value="apache-${name}-${project.version}"/>
  <property name="dist.base" value="distribution"/>
  <property name="dist.base.source" value="${dist.base}/source"/>
  <property name="dist.base.binaries" value="${dist.base}/binaries"/>
  <property name="dist.dir" value="dist"/>
  <property name="dist.bin" value="${dist.dir}/bin"/>
  <property name="dist.lib" value="${dist.dir}/lib"/>
  <property name="dist.docs" value="${dist.dir}/docs"/>
  <property name="dist.etc" value="${dist.dir}/etc"/>
  <property name="dist.javadocs" value="${dist.dir}/docs/manual/api"/>

  <property name="src.dist.dir" value="dist-src"/>
  <property name="src.dist.src" value="${src.dist.dir}/src"/>
  <property name="src.dist.docs" value="${src.dist.dir}/docs"/>
  <property name="src.dist.lib" value="${src.dist.dir}/lib"/>

  <property name="java-repository.dir" value="java-repository/${groupid}"/>
  <property name="java-repository.jars.dir" value="${java-repository.dir}/jars"/>
  <property name="java-repository.poms.dir" value="${java-repository.dir}/poms"/>

  <!--
       ===================================================================
         Set up selectors to be used by javac, junit and jar to exclude
         files that have dependencies that are not available
       ===================================================================
  -->
  <!-- depends on JDK version -->
  <selector id="needs.jdk1.3+">
    <or>
      <filename name="${ant.package}/taskdefs/TestProcess*"/>
      <filename name="${optional.package}/extension/**"/>
    </or>
  </selector>

  <selector id="needs.jdk1.4+">
    <or>
      <filename name="${regexp.package}/Jdk14Regexp*"/>
      <filename name="${ant.package}/types/AssertionsTest.java"/>
    </or>
  </selector>

  <selector id="needs.jdk1.5+">
    <or>
      <filename name="${taskdefs.package}/AptTest*"/>
      <filename name="${util.package}/java15/*"/>
    </or>
  </selector>

  <!-- Kaffe has some JDK 1.5 features including java.lang.Readable,
       but not all of them -->
  <selector id="not.in.kaffe">
    <or>
      <filename name="${condition.package}/IsReachable*"/>
    </or>
  </selector>

  <!-- depends on external libraries -->
  <selector id="needs.trax">
    <or>
      <filename name="${optional.package}/TraXLiaison*"/>
      <filename name="${optional.package}/XsltTest*"/>
      <filename name="${type.package}/XMLCatalogBuildFileTest*"/>
    </or>
  </selector>

  <selector id="needs.apache-resolver">
    <filename name="${apache.resolver.type.package}/**"/>
  </selector>

  <selector id="needs.junit">
    <filename name="${optional.package}/junit/**"/>
  </selector>

  <selector id="needs.apache-regexp">
    <filename name="${regexp.package}/JakartaRegexp*"/>
  </selector>

  <selector id="needs.apache-oro">
    <or>
      <filename name="${regexp.package}/JakartaOro*"/>
      <filename name="${optional.package}/perforce/*"/>
    </or>
  </selector>

  <selector id="needs.apache-bcel">
    <or>
      <filename name="${ant.package}/filters/util/JavaClassHelper*"/>
      <filename name="${util.package}/depend/bcel/*"/>
      <filename name="${optional.type.package}/depend/ClassFileSetTest*"/>
    </or>
  </selector>

  <selector id="needs.apache-log4j">
    <filename name="${ant.package}/listener/Log4jListener*"/>
  </selector>

  <selector id="needs.commons-logging">
    <filename name="${ant.package}/listener/CommonsLoggingListener*"/>
  </selector>

  <selector id="needs.apache-bsf">
    <or>
      <filename name="${util.package}/ScriptRunner.*"/>
      <filename name="${util.package}/optional/ScriptRunner*"/>
    </or>
  </selector>

  <selector id="needs.stylebook">
    <filename name="${optional.package}/StyleBook*"/>
  </selector>

  <selector id="needs.javamail">
    <or>
      <filename name="${ant.package}/taskdefs/email/MimeMailer*"/>
    </or>
  </selector>

  <selector id="needs.netrexx">
    <filename name="${optional.package}/NetRexxC*"/>
  </selector>

  <selector id="needs.weblogic.ejbc">
    <filename name="${optional.package}/ejb/Ejbc*"/>
  </selector>

  <selector id="needs.weblogic.ddcreator">
    <filename name="${optional.package}/ejb/DDCreator*"/>
  </selector>

  <selector id="needs.weblogic.server">
    <or>
      <filename name="${optional.package}/ejb/WLRun*"/>
      <filename name="${optional.package}/ejb/WLStop*"/>
    </or>
  </selector>

  <selector id="needs.commons-net">
    <or>
      <filename name="${optional.package}/net/FTP*"/>
      <filename name="${optional.package}/net/RExec*"/>
      <filename name="${optional.package}/net/TelnetTask*"/>
    </or>
  </selector>

  <selector id="needs.starteam">
    <or>
      <filename name="${optional.package}/scm/AntStarTeam*"/>
      <filename name="${optional.package}/starteam/*"/>
    </or>
  </selector>

  <selector id="needs.antlr">
    <filename name="${optional.package}/ANTLR*"/>
  </selector>

  <selector id="needs.jmf">
    <filename name="${optional.package}/sound/*"/>
  </selector>

  <selector id="needs.jai">
    <or>
      <filename name="${optional.package}/image/*"/>
      <filename name="${optional.type.package}/image/*"/>
    </or>
  </selector>

  <selector id="needs.jdepend">
    <filename name="${optional.package}/jdepend/*"/>
  </selector>

  <selector id="needs.swing">
    <filename name="${optional.package}/splash/*"/>
  </selector>

  <selector id="needs.jsch">
    <filename name="${optional.package}/ssh/*"/>
  </selector>

  <selector id="ant.launcher">
    <filename name="${ant.package}/launch/**/*"/>
  </selector>

  <patternset id="onlinetests">
    <exclude name="**/GetTest.java" if="offline"/>
  </patternset>

  <patternset id="teststhatfail">
    <!-- Property 'run.failing.tests' should force Ant to run these tests. -->
    <!-- Because the whole patternset can not be excluded, you have to add -->
    <!-- an unless-attribute on each exclude-element.                      -->
    <exclude unless="run.failing.tests" name="${optional.package}/BeanShellScriptTest.java"/>
    <exclude unless="run.failing.tests" name="${optional.package}/jdepend/JDependTest.java"/>
    <exclude unless="run.failing.tests" name="${optional.package}/DotnetTest.java"/>
    <exclude unless="run.failing.tests" name="${optional.package}/WsdlToDotnetTest.java"/>
  </patternset>

  <!--tests that need an XML Schema-supporting parser to work-->
  <selector id="needs.xmlschema">
    <or>
      <filename name="${optional.package}/SchemaValidateTest.*"/>
      <filename name="${optional.package}/XmlValidateTest.*"/>
    </or>
  </selector>

  <!--
       ===================================================================
         Set up a patternsets that matches the parts of our JUnit testsuite
         that may be useful for task developers.
       ===================================================================
  -->
  <patternset id="useful.tests">
    <include name="${ant.package}/BuildFileTest*"/>
    <include name="${regexp.package}/RegexpMatcherTest*"/>
    <include name="${regexp.package}/RegexpTest*"/>
    <include name="${optional.package}/AbstractXSLTLiaisonTest*"/>
    <include name="${ant.package}/types/AbstractFileSetTest*"/>
  </patternset>

  <!--
       ===================================================================
         Set up a patternsets that matches the parts of our site that
         should not be part of the distribution.
       ===================================================================
  -->
  <patternset id="site.excludes">
    <exclude name="bindownload.html"/>
    <exclude name="srcdownload.html"/>
    <exclude name="*.cgi"/>
  </patternset>

  <!--
       ===================================================================
         Check to see what optional dependencies are available
       ===================================================================
  -->
  <target name="check_for_optional_packages">
    <available property="jdk1.3+" classname="java.lang.StrictMath"/>
    <available property="jdk1.4+" classname="java.lang.CharSequence"/>
    <available property="jdk1.5+" classname="java.net.Proxy"/>
    <available property="jdk1.6+" classname="java.util.ServiceLoader"/>
    <available property="kaffe" classname="kaffe.util.NotImplemented"/>
    <available property="bsf.present"
      classname="org.apache.bsf.BSFManager"
      classpathref="classpath"/>
    <available property="netrexx.present"
      classname="netrexx.lang.Rexx"
      classpathref="classpath"/>
    <available property="trax.present"
      classname="javax.xml.transform.Transformer"
      classpathref="classpath"/>
    <condition property="trax.impl.present">
      <or>
        <and>
          <isset property="javax.xml.transform.TransformerFactory"/>
          <available classname="${javax.xml.transform.TransformerFactory}"
            classpathref="classpath"/>
        </and>
        <available resource="META-INF/services/javax.xml.transform.TransformerFactory"/>
      </or>
    </condition>
    <available property="apache.resolver.present"
      classname="org.apache.xml.resolver.tools.CatalogResolver"
      classpathref="classpath"/>
    <available property="xalan2.present"
      classname="org.apache.xalan.transformer.TransformerImpl"
      classpathref="classpath"/>
    <available property="ejb.ejbc.present"
      classname="weblogic.ejbc"
      classpathref="classpath"/>
    <available property="ejb.DDCreator.present"
      classname="weblogic.ejb.utils.DDCreator"
      classpathref="classpath"/>
    <available property="ejb.wls.present"
      classname="weblogic.Server"
      classpathref="classpath"/>
    <available property="junit.present"
      classname="junit.framework.TestCase"
      classpathref="classpath"/>
    <available property="antunit.present"
      classname="org.apache.ant.antunit.AntUnit"
      classpathref="classpath"/>
    <available property="commons.net.present"
      classname="org.apache.commons.net.ftp.FTPClient"
      classpathref="classpath"/>
    <available property="starteam.present"
      classname="com.starbase.util.Platform"
      classpathref="classpath"/>
    <available property="antlr.present"
      classname="antlr.Tool"
      classpathref="classpath"/>
    <available property="stylebook.present"
      classname="org.apache.stylebook.Engine"
      classpathref="classpath"/>
    <available property="apache.regexp.present"
      classname="org.apache.regexp.RE"
      classpathref="classpath"/>
    <available property="apache.oro.present"
      classname="org.apache.oro.text.regex.Perl5Matcher"
      classpathref="classpath"/>
    <available property="jmf.present"
      classname="javax.sound.sampled.Clip"
      classpathref="classpath"/>
    <available property="jai.present"
      classname="javax.media.jai.JAI"
      classpathref="classpath"/>
    <available property="jdepend.present"
      classname="jdepend.framework.JDepend"
      classpathref="classpath"/>
    <available property="log4j.present"
      classname="org.apache.log4j.Logger"
      classpathref="classpath"/>
    <available property="commons.logging.present"
      classname="org.apache.commons.logging.LogFactory"
      classpathref="classpath"/>
    <available property="xalan.envcheck"
      classname="org.apache.xalan.xslt.EnvironmentCheck"
      classpathref="classpath"/>
    <available property="which.present"
      classname="org.apache.env.Which"
      classpathref="classpath"/>

    <available property="xerces.present"
      classname="org.apache.xerces.parsers.SAXParser"
      classpathref="classpath"/>
    <available property="bcel.present"
      classname="org.apache.bcel.Constants"
      classpathref="classpath"/>

    <condition property="javamail.complete">
      <and>
        <available classname="javax.activation.DataHandler"
          classpathref="classpath"/>
        <available classname="javax.mail.Transport"
          classpathref="classpath"/>
      </and>
    </condition>

    <condition property="some.regexp.support">
      <or>
        <isset property="jdk1.4+"/>
        <isset property="apache.regexp.present"/>
        <isset property="apache.oro.present"/>
      </or>
    </condition>

    <condition property="tests.and.ant.share.classloader">
      <or>
        <equals arg1="${junit.fork}" arg2="true"/>
        <equals arg1="${build.sysclasspath}" arg2="only"/>
      </or>
    </condition>

    <condition property="sun.tools.present">
      <and>
        <available classname="sun.tools.native2ascii.Main"/>
        <available classname="com.sun.tools.javah.Main"/>
      </and>
    </condition>

    <condition property="tests.are.on.system.classpath">
      <or>
        <resourcecount count="1">
          <intersect>
            <path path="${java.class.path}" />
            <file file="${build.tests}" />
          </intersect>
        </resourcecount>
        <istrue value="${junit.fork}"/>
      </or>
    </condition>

    <echo level="verbose"> tests.are.on.system.classpath=${tests.are.on.system.classpath}

    <condition property="jasper.present">
      <and>
        <available classname="org.apache.jasper.compiler.Compiler"/>
        <available classname="org.apache.jasper.JasperException"/>
      </and>
    </condition>

    <condition property="swing.present">
      <or>
        <not>
          <isset property="kaffe"/>
        </not>
        <available classname="javax.swing.ImageIcon"
          classpathref="classpath"/>
      </or>
    </condition>

    <!-- http client needs commons logging -->
    <condition property="apache-httpclient.present">
      <and>
        <available
          classname="org.apache.commons.httpclient.HttpClient"
          classpathref="classpath"/>
        <isset property="commons.logging.present"/>
      </and>
    </condition>

    <condition property="wsdl.found">
      <or>
        <available file="wsdl" filepath="${env.PATH}"/>
        <available file="wsdl.exe" filepath="${env.PATH}"/>
        <available file="wsdl.exe" filepath="${env.Path}"/>
      </or>
    </condition>
    <echo level="verbose"> wsdl.found=${wsdl.found}
    <condition property="csc.found">
      <or>
        <available file="mcs" filepath="${env.PATH}"/>
        <available file="csc" filepath="${env.PATH}"/>
        <available file="csc.exe" filepath="${env.PATH}"/>
        <available file="csc.exe" filepath="${env.Path}"/>
      </or>
    </condition>
    <echo level="verbose"> csc.found=${csc.found}
    <condition property="dotnetapps.found">
      <and>
        <isset property="csc.found"/>
        <isset property="wsdl.found"/>
      </and>
    </condition>
    <echo level="verbose"> dotnetapps.found=${dotnetapps.found}

    <available property="rhino.present"
      classname="org.mozilla.javascript.Scriptable"
      classpathref="classpath"/>
    <available property="beanshell.present"
      classname="bsh.StringUtil"
      classpathref="classpath"/>
    <available property="xerces1.present"
      classname="org.apache.xerces.framework.XMLParser"
      classpathref="classpath"/>
    <available property="jsch.present"
      classname="com.jcraft.jsch.Session"
      classpathref="classpath"/>

    <condition property="build.compiler" value="classic">
      <not>
        <isset property="jdk1.3+"/>
      </not>
    </condition>
    <property name="build.compiler" value="modern"/>

    <!--check for XSD support in the parser-->
    <condition property="xmlschema.present">
      <or>
        <parsersupports
          feature="http://apache.org/xml/features/validation/schema"/>
        <parsersupports
          feature="http://java.sun.com/xml/jaxp/properties/schemaSource"/>
      </or>
    </condition>

  </target>


  <!--
       ===================================================================
         Prepare the build
       ===================================================================
  -->
  <target name="prepare">
    <tstamp>
      <format property="year" pattern="yyyy"/>
    </tstamp>
    <filterchain id="ant.filters">
       <expandproperties/>
    </filterchain>
  </target>

  <!--
       ===================================================================
         Build the code
       ===================================================================
  -->
  <target name="build"
    depends="prepare, check_for_optional_packages"
    description="--> compiles the source code">
    <mkdir dir="${build.dir}"/>
    <mkdir dir="${build.classes}"/>
    <mkdir dir="${build.lib}"/>

    <javac srcdir="${java.dir}"
      destdir="${build.classes}"
      debug="${debug}"
      deprecation="${deprecation}"
      target="${javac.target}"
      source="${javac.source}"
      optimize="${optimize}">
      <classpath refid="classpath"/>

      <selector id="conditional-patterns">
        <not>
          <or>
            <selector refid="needs.jdk1.3+" unless="jdk1.3+"/>
            <selector refid="needs.jdk1.4+" unless="jdk1.4+"/>
            <selector refid="needs.jdk1.5+" unless="jdk1.5+"/>
            <selector refid="not.in.kaffe" if="kaffe"/>

            <selector refid="needs.trax" unless="trax.present"/>
            <selector refid="needs.apache-resolver" unless="apache.resolver.present"/>
            <selector refid="needs.junit" unless="junit.present"/>
            <selector refid="needs.apache-regexp"
              unless="apache.regexp.present"/>
            <selector refid="needs.apache-oro" unless="apache.oro.present"/>
            <selector refid="needs.apache-bcel" unless="bcel.present"/>
            <selector refid="needs.apache-log4j" unless="log4j.present"/>
            <selector refid="needs.commons-logging"
              unless="commons.logging.present"/>
            <selector refid="needs.apache-bsf" unless="bsf.present"/>
            <selector refid="needs.stylebook" unless="stylebook.present"/>
            <selector refid="needs.javamail" unless="javamail.complete"/>
            <selector refid="needs.netrexx" unless="netrexx.present"/>
            <selector refid="needs.weblogic.ejbc" unless="ejb.ejbc.present"/>
            <selector refid="needs.weblogic.ddcreator"
              unless="ejb.DDCreator.present"/>
            <selector refid="needs.weblogic.server" unless="ejb.wls.present"/>
            <selector refid="needs.commons-net" unless="commons.net.present"/>
            <selector refid="needs.starteam" unless="starteam.present"/>
            <selector refid="needs.antlr" unless="antlr.present"/>
            <selector refid="needs.jmf" unless="jmf.present"/>
            <selector refid="needs.jai" unless="jai.present"/>
            <selector refid="needs.jdepend" unless="jdepend.present"/>
            <selector refid="needs.swing" unless="swing.present"/>
            <selector refid="needs.jsch" unless="jsch.present"/>
            <selector refid="needs.xmlschema" unless="xmlschema.present"/>
          </or>
        </not>
      </selector>
    </javac>

    <copy todir="${build.classes}">
      <fileset dir="${java.dir}">
        <include name="**/*.properties"/>
        <include name="**/*.dtd"/>
        <include name="**/*.xml"/>
      </fileset>
      <fileset dir="${resource.dir}" />
    </copy>

    <copy todir="${build.classes}"
      overwrite="true" encoding="UTF-8">
      <fileset dir="${java.dir}">
        <include name="**/version.txt"/>
        <include name="**/defaultManifest.mf"/>
      </fileset>
      <filterchain refid="ant.filters"/>
    </copy>

    <copy todir="${build.classes}/${optional.package}/junit/xsl">
      <fileset dir="${etc.dir}">
        <include name="junit-frames.xsl"/>
        <include name="junit-noframes.xsl"/>
      </fileset>
    </copy>
  </target>

  <!--
       ===================================================================
         Create the all of the Apache Ant jars
       ===================================================================
  -->
  <target name="jars"
    depends="build"
    description="--> creates the Apache Ant jars">

    <copy todir="${build.dir}">
      <fileset dir="${basedir}">
        <include name="LICENSE"/>
        <include name="LICENSE.xerces"/>
        <include name="LICENSE.dom"/>
        <include name="LICENSE.sax"/>
        <include name="NOTICE"/>
      </fileset>
      <mapper type="glob" from="*" to="*.txt"/>
    </copy>

    <copy file="${manifest}" tofile="${manifest.tmp}"/>
    <manifest file="${manifest.tmp}">
      <section name="${optional.package}/">
        <attribute name="Extension-name"
          value="org.apache.tools.ant"/>
        <attribute name="Specification-Title"
          value="Apache Ant"/>
        <attribute name="Specification-Version"
          value="${manifest-version}"/>
        <attribute name="Specification-Vendor"
          value="Apache Software Foundation"/>
        <attribute name="Implementation-Title"
          value="org.apache.tools.ant"/>
        <attribute name="Implementation-Version"
          value="${manifest-version}"/>
        <attribute name="Implementation-Vendor"
          value="Apache Software Foundation"/>
      </section>
    </manifest>

    <jar destfile="${build.lib}/${name}-launcher.jar"
      basedir="${build.classes}"
      whenmanifestonly="fail">
      <selector refid="ant.launcher"/>
      <manifest>
        <attribute name="Main-Class" value="org.apache.tools.ant.launch.Launcher"/>
      </manifest>
    </jar>

    <jar destfile="${build.lib}/${name}.jar"
      basedir="${build.classes}"
      manifest="${manifest}"
      whenmanifestonly="fail">
      <not>
        <selector id="non-core">
          <or>
            <filename name="${optional.package}/**"/>
            <filename name="${optional.type.package}/**"/>
            <filename name="${util.package}/depend/**"/>
            <filename name="${util.package}/optional/**"/>
            <selector refid="needs.apache-log4j"/>
            <selector refid="needs.commons-logging"/>
            <selector refid="needs.apache-bcel"/>
            <selector refid="needs.apache-bsf"/>
            <selector refid="needs.apache-regexp"/>
            <selector refid="needs.apache-resolver"/>
            <selector refid="needs.apache-oro"/>
            <selector refid="needs.jdk1.4+"/>
            <selector refid="needs.jdk1.5+"/>
            <selector refid="needs.javamail"/>
            <selector refid="ant.launcher"/>
          </or>
        </selector>
      </not>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>

      <manifest>
        <section name="${ant.package}/">
          <attribute name="Extension-name"
            value="org.apache.tools.ant"/>
          <attribute name="Specification-Title"
            value="Apache Ant"/>
          <attribute name="Specification-Version"
            value="${manifest-version}"/>
          <attribute name="Specification-Vendor"
            value="Apache Software Foundation"/>
          <attribute name="Implementation-Title"
            value="org.apache.tools.ant"/>
          <attribute name="Implementation-Version"
            value="${manifest-version}"/>
          <attribute name="Implementation-Vendor"
            value="Apache Software Foundation"/>
        </section>
      </manifest>

      <fileset dir="${docs.dir}">
        <include name="images/ant_logo_large.gif"/>
      </fileset>
    </jar>

    <jar destfile="${build.lib}/${bootstrap.jar}"
      basedir="${build.classes}"
      manifest="${manifest}"
      whenmanifestonly="fail">
      <include name="${ant.package}/Main.class"/>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
      <manifest>
        <attribute name="Class-Path"
          value="ant.jar xml-apis.jar xercesImpl.jar xalan.jar"/>
      </manifest>
    </jar>

    <jar destfile="${build.lib}/ant-nodeps.jar"
      basedir="${build.classes}"
      manifest="${manifest.tmp}"
      whenmanifestonly="${optional.jars.whenmanifestonly}">
      <and>
        <selector refid="non-core"/>
        <not>
          <or>
            <selector refid="ant.launcher"/>
            <selector refid="needs.trax"/>
            <selector refid="needs.apache-resolver"/>
            <selector refid="needs.junit"/>
            <selector refid="needs.apache-regexp"/>
            <selector refid="needs.apache-oro"/>
            <selector refid="needs.apache-bcel"/>
            <selector refid="needs.apache-log4j"/>
            <selector refid="needs.commons-logging"/>
            <selector refid="needs.apache-bsf"/>
            <selector refid="needs.stylebook"/>
            <selector refid="needs.javamail"/>
            <selector refid="needs.netrexx"/>
            <selector refid="needs.weblogic.ejbc"/>
            <selector refid="needs.weblogic.ddcreator"/>
            <selector refid="needs.weblogic.server"/>
            <selector refid="needs.commons-net"/>
            <selector refid="needs.starteam"/>
            <selector refid="needs.antlr"/>
            <selector refid="needs.jmf"/>
            <selector refid="needs.jai"/>
            <selector refid="needs.jdepend"/>
            <selector refid="needs.swing"/>
            <selector refid="needs.jsch"/>
          </or>
        </not>
      </and>
      <metainf dir="${build.dir}">
        <include name="LICENSE.txt"/>
        <include name="NOTICE.txt"/>
      </metainf>
    </jar>

    <macrodef name="optional-jar">
      <attribute name="dep"/>
      <sequential>
        <jar destfile="${build.lib}/${optional.jars.prefix}-@{dep}.jar"
          basedir="${build.classes}"
          manifest="${manifest.tmp}"
          whenmanifestonly="${optional.jars.whenmanifestonly}">
          <selector refid="needs.@{dep}"/>
        </jar>
      </sequential>
    </macrodef>

    <optional-jar dep="trax"/>
    <optional-jar dep="apache-resolver"/>
    <optional-jar dep="junit"/>
    <optional-jar dep="apache-regexp"/>
    <optional-jar dep="apache-oro"/>
    <optional-jar dep="apache-bcel"/>
    <optional-jar dep="apache-log4j"/>
    <optional-jar dep="commons-logging"/>
    <optional-jar dep="apache-bsf"/>
    <optional-jar dep="stylebook"/>
    <optional-jar dep="javamail"/>
    <optional-jar dep="netrexx"/>
    <optional-jar dep="commons-net"/>
    <optional-jar dep="starteam"/>
    <optional-jar dep="antlr"/>
    <optional-jar dep="jmf"/>
    <optional-jar dep="jai"/>
    <optional-jar dep="swing"/>
    <optional-jar dep="jsch"/>
    <optional-jar dep="jdepend"/>

    <jar destfile="${build.lib}/${optional.jars.prefix}-weblogic.jar"
      basedir="${build.classes}"
      manifest="${manifest.tmp}"
      whenmanifestonly="${optional.jars.whenmanifestonly}">
      <or>
        <selector refid="needs.weblogic.ejbc"/>
        <selector refid="needs.weblogic.ddcreator"/>
        <selector refid="needs.weblogic.server"/>
      </or>
    </jar>

  </target>

  <!--   Creates jar of test utility classes -->
  <target name="test-jar"
    depends="compile-tests"
    description="--> creates the Apache Ant Test Utilities jar">

    <fail unless="junit.present">
      We cannot build the test jar unless JUnit is present,
      as JUnit is needed to compile the test classes.
    </fail>
    <jar destfile="${build.lib}/${name}-testutil.jar"
      basedir="${build.tests}">
      <patternset refid="useful.tests"/>
    </jar>
  </target>

  <!--
       ===================================================================
         Create the essential distribution that can run Apache Ant
       ===================================================================
  -->
  <target name="dist-lite"
    depends="jars,test-jar"
    description="--> creates a minimum distribution to run Apache Ant">

    <mkdir dir="${dist.dir}"/>
    <mkdir dir="${dist.bin}"/>
    <mkdir dir="${dist.lib}"/>

    <copy todir="${dist.lib}">
      <fileset dir="${build.lib}">
        <exclude name="${bootstrap.jar}"/>
      </fileset>
    </copy>

    <copy todir="${dist.lib}">
      <fileset dir="${lib.dir}">
        <include name="*.jar"/>
        <include name="*.zip"/>
      </fileset>
    </copy>

    <copy todir="${dist.bin}">
      <fileset dir="${script.dir}"/>
    </copy>

    <fixcrlf srcdir="${dist.bin}" eol="dos" includes="*.bat,*.cmd"/>
    <fixcrlf srcdir="${dist.bin}" eol="unix">
      <include name="ant"/>
      <include name="antRun"/>
      <include name="*.pl"/>
    </fixcrlf>

    <chmod perm="ugo+rx" dir="${dist.dir}" type="dir" includes="**"
      failonerror="${chmod.fail}"/>
    <chmod perm="ugo+r" dir="${dist.dir}" type="file" includes="**"
      failonerror="${chmod.fail}" maxparallel="${chmod.maxparallel}"/>
    <chmod perm="ugo+x" type="file" failonerror="${chmod.fail}">
      <fileset dir="${dist.bin}">
        <include name="**/ant"/>
        <include name="**/antRun"/>
        <include name="**/*.pl"/>
        <include name="**/*.py"/>
      </fileset>
    </chmod>

  </target>

  <!--
        ===================================================================
          Create the complete distribution
        ===================================================================
   -->
  <target name="dist" description="--> creates a complete distribution">
    <antcall inheritAll="false" target="internal_dist">
      <param name="dist.dir" value="${dist.name}"/>
    </antcall>
  </target>

  <target name="dist_javadocs" depends="javadocs">
    <mkdir dir="${dist.javadocs}"/>
    <copy todir="${dist.javadocs}" overwrite="true">
      <fileset dir="${build.javadocs}"/>
    </copy>
  </target>


  <target name="internal_dist" depends="dist-lite,dist_javadocs">
    <mkdir dir="${dist.docs}"/>
    <mkdir dir="${dist.etc}"/>

    <copy todir="${dist.lib}" file="${lib.dir}/README"/>
    <copy todir="${dist.lib}" file="${lib.dir}/libraries.properties"/>

    <copy todir="${dist.lib}">
        <fileset dir="${src.dir}/etc/poms">
            <include name="*/pom.xml"/>
        </fileset>
        <mapper type="regexp" from="^(.*)[/\\]pom.xml" to="\1-${project.version}.pom"/>
        <filterchain>
            <tokenfilter>
                <replaceregex pattern="${pom.version}" replace="${project.version}"/>
            </tokenfilter>
        </filterchain>
    </copy>
    <copy todir="${dist.lib}">
        <fileset dir="${src.dir}/etc/poms">
            <include name="pom.xml"/>
        </fileset>
        <mapper type="glob" from="pom.xml" to="ant-parent-${project.version}.pom"/>
        <filterchain>
            <tokenfilter>
                <replaceregex pattern="${pom.version}" replace="${project.version}"/>
            </tokenfilter>
        </filterchain>
    </copy>
    <checksum algorithm="md5">
        <fileset dir="${dist.lib}">
            <include name="*.pom"/>
        </fileset>
    </checksum>
    <checksum algorithm="sha1">
        <fileset dir="${dist.lib}">
            <include name="*.pom"/>
        </fileset>
    </checksum>

    <copy todir="${dist.docs}">
      <fileset dir="${docs.dir}" excludes="${unfiltered.files}">
        <patternset refid="site.excludes"/>
      </fileset>
      <filterchain refid="ant.filters"/>
    </copy>

    <copy todir="${dist.docs}" filtering="false">
      <fileset dir="${docs.dir}" includes="${unfiltered.files}">
        <patternset refid="site.excludes"/>
      </fileset>
    </copy>

    <copy todir="${dist.dir}">
      <fileset dir="${basedir}">
        <include name="README"/>
        <include name="INSTALL"/>
        <include name="LICENSE"/>
        <include name="LICENSE.xerces"/>
        <include name="LICENSE.dom"/>
        <include name="LICENSE.sax"/>
        <include name="NOTICE"/>
        <include name="TODO"/>
        <include name="WHATSNEW"/>
        <include name="KEYS"/>
        <include name="fetch.xml"/>
	<include name="get-m2.xml"/>
      </fileset>
    </copy>

    <chmod perm="ugo+rx" dir="${dist.dir}" type="dir" includes="**"
      failonerror="${chmod.fail}"/>
    <chmod perm="ugo+r" dir="${dist.dir}" type="file" includes="**"
      failonerror="${chmod.fail}" maxparallel="${chmod.maxparallel}"/>
    <chmod perm="ugo+x" type="file" failonerror="${chmod.fail}">
      <fileset dir="${dist.bin}">
        <include name="**/ant"/>
        <include name="**/antRun"/>
        <include name="**/*.pl"/>
        <include name="**/*.py"/>
      </fileset>
    </chmod>

    <!-- publish some useful stylesheets -->
    <copy todir="${dist.etc}">
      <fileset dir="${etc.dir}">
        <include name="junit-frames.xsl"/>
        <include name="junit-noframes.xsl"/>
        <include name="junit-frames-xalan1.xsl"/>
        <include name="coverage-frames.xsl"/>
        <include name="maudit-frames.xsl"/>
        <include name="mmetrics-frames.xsl"/>
        <include name="changelog.xsl"/>
        <include name="jdepend.xsl"/>
        <include name="jdepend-frames.xsl"/>
        <include name="checkstyle/*.xsl"/>
        <include name="log.xsl"/>
        <include name="tagdiff.xsl"/>
      </fileset>
      <fileset dir="${build.lib}">
        <include name="${bootstrap.jar}"/>
      </fileset>
    </copy>

  </target>


  <!--
       ===================================================================
         Target to create bootstrap build
       ===================================================================
  -->
  <target name="bootstrap" description="--> creates a bootstrap build">
    <antcall inheritAll="false" target="dist-lite">
      <param name="dist.dir" value="${bootstrap.dir}"/>
    </antcall>
  </target>


  <!--
       ===================================================================
         Create the source distribution
       ===================================================================
  -->
  <target name="src-dist"
    description="--> creates a source distribution">

    <mkdir dir="${src.dist.dir}"/>

    <copy todir="${src.dist.lib}">
      <fileset dir="${lib.dir}">
        <include name="*.jar"/>
        <include name="*.zip"/>
        <include name="README"/>
        <include name="libraries.properties"/>
      </fileset>
    </copy>

    <copy todir="${src.dist.src}">
      <fileset dir="${src.dir}"/>
    </copy>

    <copy todir="${src.dist.docs}">
      <fileset dir="${docs.dir}">
        <exclude name="manual/api/**"/>
        <patternset refid="site.excludes"/>
      </fileset>
    </copy>

    <copy todir="${src.dist.dir}">
      <fileset dir="${basedir}">
        <include name="README"/>
        <include name="INSTALL"/>
        <include name="LICENSE"/>
        <include name="LICENSE.xerces"/>
        <include name="LICENSE.dom"/>
        <include name="LICENSE.sax"/>
        <include name="NOTICE"/>
        <include name="TODO"/>
        <include name="WHATSNEW"/>
        <include name="KEYS"/>
        <include name="build.bat"/>
        <include name="build.sh"/>
        <include name="bootstrap.bat"/>
        <include name="bootstrap.sh"/>
        <include name="build.xml"/>
        <include name="fetch.xml"/>
	<include name="get-m2.xml"/>
      </fileset>
    </copy>

    <fixcrlf srcdir="${src.dist.dir}" eol="dos" includes="*.bat,*.cmd"/>
    <fixcrlf srcdir="${src.dist.dir}" eol="unix">
      <include name="**/*.sh"/>
      <include name="**/*.pl"/>
      <include name="**/ant"/>
      <include name="**/antRun"/>
    </fixcrlf>
    <fixcrlf srcdir="${src.dist.dir}">
      <include name="**/*.java"/>
      <exclude name="${tests.etc.dir}/taskdefs/fixcrlf/expected/Junk?.java"/>
      <exclude name="${tests.etc.dir}/taskdefs/fixcrlf/input/Junk?.java"/>
    </fixcrlf>

    <chmod perm="ugo+x" dir="${src.dist.dir}" type="dir"
      failonerror="${chmod.fail}"/>
    <chmod perm="ugo+r" dir="${src.dist.dir}" failonerror="${chmod.fail}"/>
    <chmod perm="ugo+x" failonerror="${chmod.fail}">
      <fileset dir="${src.dist.dir}">
        <include name="**/.sh"/>
        <include name="**/.pl"/>
        <include name="**/.py"/>
        <include name="**/ant"/>
        <include name="**/antRun"/>
      </fileset>
    </chmod>

  </target>

  <!--
       ===================================================================
         Create the binary distribution
       ===================================================================
  -->
  <target name="main_distribution"
    description="--> creates the zip and tar distributions">
    <delete dir="${dist.base}"/>
    <delete dir="${dist.name}"/>
    <delete dir="${java-repository.dir}"/>
    <mkdir dir="${dist.base}"/>
    <mkdir dir="${dist.base.source}"/>
    <mkdir dir="${dist.base.binaries}"/>
    <mkdir dir="${java-repository.jars.dir}"/>
    <mkdir dir="${java-repository.poms.dir}"/>
    <antcall inheritAll="false" target="internal_dist">
      <param name="dist.dir" value="${dist.name}"/>
    </antcall>
    <zip destfile="${dist.base.binaries}/${dist.name}-bin.zip">
      <zipfileset dir="${dist.name}/.." filemode="755">
        <include name="${dist.name}/bin/ant"/>
        <include name="${dist.name}/bin/antRun"/>
        <include name="${dist.name}/bin/*.pl"/>
        <include name="${dist.name}/bin/*.py"/>
      </zipfileset>
      <fileset dir="${dist.name}/..">
        <include name="${dist.name}/**"/>
        <exclude name="${dist.name}/bin/ant"/>
        <exclude name="${dist.name}/bin/antRun"/>
        <exclude name="${dist.name}/bin/*.pl"/>
        <exclude name="${dist.name}/bin/*.py"/>
      </fileset>
    </zip>
    <tar longfile="gnu"
      destfile="${dist.base.binaries}/${dist.name}-bin.tar">
      <!-- removes redundant definition of permissions, but seems to
           drop dirs (and to be slow)
      <zipfileset src="${dist.base.binaries}/${dist.name}-bin.zip"/>
      -->
      <tarfileset dir="${dist.name}/.." mode="755" username="ant" group="ant">
        <include name="${dist.name}/bin/ant"/>
        <include name="${dist.name}/bin/antRun"/>
        <include name="${dist.name}/bin/*.pl"/>
        <include name="${dist.name}/bin/*.py"/>
      </tarfileset>
      <tarfileset dir="${dist.name}/.." username="ant" group="ant">
        <include name="${dist.name}/**"/>
        <exclude name="${dist.name}/bin/ant"/>
        <exclude name="${dist.name}/bin/antRun"/>
        <exclude name="${dist.name}/bin/*.pl"/>
        <exclude name="${dist.name}/bin/*.py"/>
      </tarfileset>
    </tar>
    <gzip destfile="${dist.base.binaries}/${dist.name}-bin.tar.gz"
      src="${dist.base.binaries}/${dist.name}-bin.tar"/>
    <bzip2 destfile="${dist.base.binaries}/${dist.name}-bin.tar.bz2"
      src="${dist.base.binaries}/${dist.name}-bin.tar"/>
    <delete file="${dist.base.binaries}/${dist.name}-bin.tar"/>

    <copy todir="${java-repository.jars.dir}">
      <fileset dir="${dist.name}/lib">
        <include name="ant*.jar"/>
      </fileset>
      <mapper type="glob" from="*.jar" to="*-${project.version}.jar"/>
    </copy>
    <copy todir="${java-repository.poms.dir}">
      <fileset dir="${dist.name}/lib">
        <include name="*.pom"/>
        <include name="*.sha1"/>
        <include name="*.md5"/>
      </fileset>
      <mapper>
        <mapper type="glob" from="*.pom" to="*.pom"/>
        <mapper type="glob" from="*.pom.sha1" to="*.pom.sha1"/>
        <mapper type="glob" from="*.pom.md5" to="*.pom.md5"/>
      </mapper>
    </copy>
    <checksum fileext=".md5">
      <fileset dir="${java-repository.jars.dir}" includes="*${project.version}.jar"/>
    </checksum>
    <checksum fileext=".sha1" algorithm="SHA">
      <fileset dir="${java-repository.jars.dir}" includes="*${project.version}.jar"/>
    </checksum>
    <delete dir="${dist.name}"/>
    <checksum fileext=".md5">
      <fileset dir="${dist.base.binaries}/">
        <include name="**/*"/>
        <exclude name="**/*.asc"/>
        <exclude name="**/*.md5"/>
      </fileset>
    </checksum>
    <checksum fileext=".sha1" algorithm="SHA">
      <fileset dir="${dist.base.binaries}/">
        <include name="**/*"/>
        <exclude name="**/*.asc"/>
        <exclude name="**/*.md5"/>
      </fileset>
    </checksum>

    <antcall inheritAll="false" target="src-dist">
      <param name="src.dist.dir" value="${dist.name}"/>
    </antcall>
    <zip destfile="${dist.base.source}/${dist.name}-src.zip">
      <zipfileset dir="${dist.name}/.." filemode="755">
        <include name="${dist.name}/bootstrap.sh"/>
        <include name="${dist.name}/build.sh"/>
      </zipfileset>
      <fileset dir="${dist.name}/..">
        <include name="${dist.name}/**"/>
        <exclude name="${dist.name}/bootstrap.sh"/>
        <exclude name="${dist.name}/build.sh"/>
      </fileset>
    </zip>
    <tar longfile="gnu"
      destfile="${dist.base.source}/${dist.name}-src.tar">
      <!--
      <zipfileset src="${dist.base.source}/${dist.name}-src.zip"/>
      -->
      <tarfileset dir="${dist.name}/.." mode="755" username="ant" group="ant">
        <include name="${dist.name}/bootstrap.sh"/>
        <include name="${dist.name}/build.sh"/>
      </tarfileset>
      <tarfileset dir="${dist.name}/.." username="ant" group="ant">
        <include name="${dist.name}/**"/>
        <exclude name="${dist.name}/bootstrap.sh"/>
        <exclude name="${dist.name}/build.sh"/>
      </tarfileset>
    </tar>
    <gzip destfile="${dist.base.source}/${dist.name}-src.tar.gz"
      src="${dist.base.source}/${dist.name}-src.tar"/>
    <bzip2 destfile="${dist.base.source}/${dist.name}-src.tar.bz2"
      src="${dist.base.source}/${dist.name}-src.tar"/>
    <delete file="${dist.base.source}/${dist.name}-src.tar"/>
    <delete dir="${dist.name}"/>
    <checksum fileext=".md5">
      <fileset dir="${dist.base.source}/">
        <include name="**/*"/>
        <exclude name="**/*.asc"/>
        <exclude name="**/*.md5"/>
      </fileset>
    </checksum>
    <checksum fileext=".sha1" algorithm="SHA">
      <fileset dir="${dist.base.source}/">
        <include name="**/*"/>
        <exclude name="**/*.asc"/>
        <exclude name="**/*.md5"/>
      </fileset>
    </checksum>
  </target>

  <target name="distribution" depends="main_distribution"
    description="--> creates the full Apache Ant distribution">
  </target>

  <!--
       ===================================================================
         Upload the distribution to cvs.apache.org for final releases
       ===================================================================
  -->

  <target name="init-upload" >
    <fail unless="apache.user" message="set a property apache.user with your apache user"/>
    <fail unless="ssh.passphrase" message="set a property with your ssh passphrase"/>
    <fail unless="ssh.keyfile" message="set a property with your ssh keyfile"/>
    <property name="ssh.knownhosts" location="${user.home}/.ssh/known_hosts" />
    <property name="ssh.host" value="cvs.apache.org"/>
    <property name="ssh.verbose" value="false"/>
    <property name="ssh.base.directory" value="/www/www.apache.org/dist"/>
    <property name="ssh.dist.directory" value="${ssh.base.directory}/ant"/>
    <property name="ssh.java-repository.directory" value="/www/people.apache.org/repo/m1-ibiblio-rsync-repository/ant"/>
    <echo >
      Uploading Ant version ${project.version}
      to host ${ssh.host} as ${apache.user}
      distribution to ${ssh.dist.directory}
      JAR files to ${ssh.java-repository.directory}/jars
      POM files to ${ssh.java-repository.directory}/poms
      Known hosts = ${ssh.knownhosts}
    </echo>
  </target>

  <!-- create the directories if absent-->
  <target name="ssh-mkdirs"
    depends="init-upload">
    <sshexec username="${apache.user}" host="${ssh.host}"
      keyfile="${ssh.keyfile}" passphrase="${ssh.passphrase}"
      knownhosts="${ssh.knownhosts}"
      command="mkdir -p ${ssh.dist.directory}" />
    <sshexec username="${apache.user}" host="${ssh.host}"
      keyfile="${ssh.keyfile}" passphrase="${ssh.passphrase}"
      knownhosts="${ssh.knownhosts}"
      command="mkdir -p ${ssh.java-repository.directory}/jars"/>
    <sshexec username="${apache.user}" host="${ssh.host}"
      keyfile="${ssh.keyfile}" passphrase="${ssh.passphrase}"
      knownhosts="${ssh.knownhosts}"
      command="mkdir -p ${ssh.java-repository.directory}/poms"/>
  </target>

  <target name="upload" description="--> uploads the distribution"
      depends="init-upload,ssh-mkdirs">
    <scp todir="${apache.user}@${ssh.host}:${ssh.dist.directory}"
      keyfile="${ssh.keyfile}" passphrase="${ssh.passphrase}"
      knownhosts="${ssh.knownhosts}"
      verbose="${ssh.verbose}" >
      <fileset dir="${dist.base}">
        <include name="**/*${project.version}*"/>
      </fileset>
     </scp>
    <scp todir="${apache.user}@${ssh.host}:${ssh.java-repository.directory}"
      keyfile="${ssh.keyfile}" passphrase="${ssh.passphrase}"
      knownhosts="${ssh.knownhosts}"
      verbose="${ssh.verbose}">
      <fileset dir="java-repository/ant">
        <include name="*/*${project.version}*"/>
      </fileset>
     </scp>
  </target>

  <!--
       ===================================================================
         Cleans up build and distribution directories
       ===================================================================
  -->
  <target name="clean"
    description="--> cleans up build and dist directories">
    <delete dir="${build.dir}"/>
    <delete dir="${dist.base}"/>
    <delete dir="${dist.dir}"/>
    <delete>
      <fileset dir="." includes="**/*~" defaultexcludes="no"/>
    </delete>
  </target>

  <!--
       ===================================================================
         Cleans everything
       ===================================================================
  -->
  <target name="allclean"
    depends="clean"
    description="--> cleans up everything">
    <delete file="${bootstrap.dir}/bin/antRun"/>
    <delete file="${bootstrap.dir}/bin/antRun.bat"/>
    <delete file="${bootstrap.dir}/bin/*.pl"/>
    <delete file="${bootstrap.dir}/bin/*.py"/>
  </target>

  <!--
       ===================================================================
         Installs Apache Ant
       ===================================================================
  -->
  <target name="install" if="ant.install">
    <antcall inheritAll="false" target="internal_dist">
      <param name="dist.dir" value="${ant.install}"/>
    </antcall>
  </target>

  <target name="install-lite" if="ant.install">
    <antcall inheritAll="false" target="dist-lite">
      <param name="dist.dir" value="${ant.install}"/>
    </antcall>
  </target>

  <!--
       ===================================================================
         Creates the API documentation
       ===================================================================
  -->
  <target name="javadoc_check">
    <uptodate property="javadoc.notrequired"
      targetfile="${build.javadocs}/packages.html">
      <srcfiles dir="${java.dir}" includes="**/*.java"/>
    </uptodate>
    <uptodate property="tests.javadoc.notrequired"
      targetfile="${build.tests.javadocs}/packages.html">
      <srcfiles dir="${src.junit}">
        <patternset refid="useful.tests"/>
      </srcfiles>
    </uptodate>
  </target>

  <target name="javadocs" depends="prepare, javadoc_check"
    unless="javadoc.notrequired"
    description="--> creates the API documentation">
    <mkdir dir="${build.javadocs}"/>
    <javadoc useexternalfile="yes"
      destdir="${build.javadocs}"
      author="true"
      version="true"
      locale="en"
      windowtitle="${Name} API"
      doctitle="${Name}"
      verbose="${javadoc.verbose}">

      <packageset dir="${java.dir}"/>

      <!-- hide some meta information for javadoc -->
      <tag name="todo" description="To do:" scope="all"/>
      <tag name="ant.task" enabled="false" description="Task:" scope="types"/>
      <tag name="ant.datatype" enabled="false" description="Data type:" scope="types"/>
      <tag name="ant.attribute" enabled="false" description="Attribute:" scope="types"/>
      <tag name="ant.attribute.group" enabled="false" description="Attribute group:" scope="types"/>
      <tag name="ant.element" enabled="false" description="Nested element:" scope="types"/>
      <group title="Apache Ant Core" packages="org.apache.tools.ant*"/>
      <group title="Core Tasks" packages="org.apache.tools.ant.taskdefs*"/>
      <group title="Core Types" packages="org.apache.tools.ant.types*"/>
      <group title="Optional Tasks" packages="org.apache.tools.ant.taskdefs.optional*"/>
      <group title="Optional Types" packages="org.apache.tools.ant.types.optional*"/>
      <group title="Ant Utilities" packages="org.apache.tools.ant.util*"/>

    </javadoc>
  </target>

  <target name="test-javadocs" depends="prepare, javadoc_check"
    unless="tests.javadoc.notrequired"
    description="--> creates the API documentation for test utilities">
    <mkdir dir="${build.tests.javadocs}"/>
    <javadoc useexternalfile="yes"
      destdir="${build.tests.javadocs}"
      author="true"
      version="true"
      locale="en"
      windowtitle="${Name} Test Utilities"
      doctitle="${Name}">

      <!-- hide some meta information for javadoc -->
      <tag name="pre" description="Precondition:" scope="all"/>

      <fileset dir="${src.junit}">
        <patternset refid="useful.tests"/>
      </fileset>

    </javadoc>
  </target>

  <!--
       ===================================================================
         Compile testcases
       ===================================================================
  -->
  <target name="compile-tests" depends="build" if="junit.present">
    <mkdir dir="${build.tests}"/>

    <javac srcdir="${src.junit}"
      destdir="${build.tests}"
      debug="${debug}"
      target="${javac.target}"
      source="${javac.source}"
      deprecation="${deprecation}">
      <classpath refid="tests-classpath"/>

      <selector refid="conditional-patterns"/>
    </javac>

    <!-- Used by AntlibTest.testAntlibResource: -->
    <jar jarfile="${build.tests}/org/apache/tools/ant/taskdefs/test2-antlib.jar">
      <zipfileset dir="${tests.etc.dir}" fullpath="taskdefs/test.antlib.xml">
        <include name="taskdefs/test2.antlib.xml"/>
      </zipfileset>
    </jar>
  </target>

  <target name="dump-info" depends="dump-sys-properties,run-which"/>

  <target name="dump-sys-properties" unless="which.present"
    depends="xml-check">
    <echo message="java.vm.info=${java.vm.info}"/>
    <echo message="java.vm.name=${java.vm.name}"/>
    <echo message="java.vm.vendor=${java.vm.vendor}"/>
    <echo message="java.vm.version=${java.vm.version}"/>
    <echo message="os.arch=${os.arch}"/>
    <echo message="os.name=${os.name}"/>
    <echo message="os.version=${os.version}"/>
    <echo message="file.encoding=${file.encoding}"/>
    <echo message="user.language=${user.language}"/>
  	<echo message="ant.version=${ant.version}"/>
  </target>

  <!-- helper class from Xalan2 to check for jar versioning of xml/xsl processors -->
  <target name="xml-check" depends="check_for_optional_packages"
    if="xalan.envcheck" unless="which.present">
    <java classname="org.apache.xalan.xslt.EnvironmentCheck"/>
  </target>

  <target name="run-which" depends="check_for_optional_packages"
    if="which.present">
    <java classname="org.apache.env.Which" taskname="which"/>
  </target>

  <!-- test to see if we are online or not. can take a while when we are off line, so
    setting the property is a good shortcut-->
  <target name="probe-offline">
    <condition property="offline">
      <or>
        <isset property="offline"/>
        <not>
          <http url="http://www.apache.org/"/>
        </not>
      </or>
    </condition>
    <echo level="verbose"> offline=${offline}
  </target>

  <!--
       ===================================================================
         Run testcase
       ===================================================================
  -->

  <target name="check-failed">
    <condition property="tests.failed">
      <or>
        <isset property="junit.failed" />
        <isset property="antunit.failed" />
      </or>
    </condition>
  </target>

  <target name="test" description="--> run unit tests and reports"
          depends="dump-info,junit-report,antunit-report,check-failed">
    <fail if="tests.failed">Unit tests failed;
see ${build.junit.reports} / ${antunit.reports}
    </fail>
  </target>

  <target name="run-tests" depends="dump-info,junit-tests,antunit-tests,check-failed"
          description="--> run unit tests without reports">
    <fail if="tests.failed" message="Unit tests failed" />
  </target>

  <target name="test-init" depends="probe-offline,check_for_optional_packages">
    <macrodef name="test-junit">
      <element name="junit-nested" implicit="true" />
      <sequential>
        <mkdir dir="${build.junit.xml}" />
        <property name="test.junit.vmargs" value=""/>
        <junit printsummary="${junit.summary}"
               haltonfailure="${test.haltonfailure}"
               fork="${junit.fork}"
               forkmode="${junit.forkmode}"
               failureproperty="junit.failed"
               errorproperty="junit.failed"
               filtertrace="${junit.filtertrace}">
          <sysproperty key="ant.home" value="${ant.home}"/>
          <sysproperty key="build.tests" file="${build.tests}"/>
          <sysproperty key="build.tests.value" value="${build.tests.value}"/>
          <sysproperty key="offline" value="${offline}"/>
          <sysproperty key="tests-classpath.value"
                       value="${tests-classpath.value}"/>
          <sysproperty key="root" file="${basedir}"/>
          <sysproperty key="build.compiler" value="${build.compiler}"/>
          <sysproperty key="tests.and.ant.share.classloader"
                       value="${tests.and.ant.share.classloader}"/>
          <classpath refid="tests-classpath"/>
          <formatter type="xml"/>
          <jvmarg line="${test.junit.vmargs}"/>
          <junit-nested />
        </junit>
      </sequential>
    </macrodef>

    <fail>"testcase" cannot be specified with "junit.testcase" or "antunit.testcase".
      <condition>
        <and>
          <isset property="testcase" />
          <or>
            <isset property="antunit.testcase" />
            <isset property="junit.testcase" />
          </or>
        </and>
      </condition>
    </fail>

    <condition property="antunit.testcase" value="${testcase}">
      <available file="${src.antunit}/${testcase}" />
    </condition>

    <condition property="junit.testcase" value="${testcase}">
      <available classname="${testcase}" classpathref="tests-classpath" />
    </condition>

    <fail>Cannot locate test ${testcase}
      <condition>
        <and>
          <isset property="testcase" />
          <not>
            <or>
              <isset property="antunit.testcase" />
              <isset property="junit.testcase" />
            </or>
          </not>
        </and>
      </condition>
    </fail>

    <condition property="run.junit">
      <and>
        <not>
        <isset property="junit.present" />
        <available file="${src.junit}" />
      </and>
    </condition>

    <condition property="junit.single">
      <and>
        <isset property="junit.testcase" />
        <isset property="run.junit" />
      </and>
    </condition>

    <condition property="junit.batch">
      <and>
        <not>
        <isset property="run.junit" />
      </and>
    </condition>

    <condition property="run.antunit">
      <and>
        <not>
        <isset property="antunit.present" />
        <available file="${src.antunit}" />
      </and>
    </condition>

    <condition property="run.antunit.report">
      <and>
        <isset property="run.antunit" />
        <isset property="trax.impl.present" />
      </and>
    </condition>

    <condition property="run.junit.report">
      <and>
        <isset property="run.junit" />
        <isset property="trax.impl.present" />
      </and>
    </condition>
  </target>

  <target name="junit-report" depends="junit-tests,junit-report-only" />

  <target name="junit-report-only" depends="test-init" if="run.junit.report">
    <mkdir dir="${build.junit.reports}" />
    <junitreport todir="${build.junit.reports}">
      <fileset dir="${build.junit.xml}">
        <include name="TEST-*.xml"/>
      </fileset>
      <report format="frames" todir="${build.junit.reports}"/>
    </junitreport>
  </target>

  <target name="junit-tests" depends="junit-batch,junit-single-test" />

  <target name="junit-batch" depends="compile-tests,test-init"
      if="junit.batch">

    <property name="junit.includes" value="**/*Test*" />
    <property name="junit.excludes" value="" />

    <test-junit>
      <formatter type="brief" usefile="false"/>

      <batchtest todir="${build.junit.xml}">
        <fileset dir="${src.junit}"
                 includes="${junit.includes}" excludes="${junit.excludes}">

          <!-- abstract classes, not testcases -->
          <exclude name="${taskdefs.package}/TaskdefsTest.java"/>
          <exclude name="${ant.package}/BuildFileTest.java"/>
          <exclude name="${regexp.package}/RegexpMatcherTest.java"/>
          <exclude name="${regexp.package}/RegexpTest.java"/>
          <exclude name="${optional.package}/AbstractXSLTLiaisonTest.java"/>
          <exclude name="${ant.package}/types/AbstractFileSetTest.java"/>
          <exclude name="${ant.package}/types/selectors/BaseSelectorTest.java"/>

          <!-- helper classes, not testcases -->
          <exclude name="org/example/**"/>
          <exclude name="${taskdefs.package}/TaskdefTest*Task.java"/>
          <exclude name="${optional.package}/junit/TestFormatter.java"/>

          <!-- interactive tests -->
          <exclude name="${taskdefs.package}/TestProcess.java"/>
          <exclude name="${optional.package}/splash/SplashScreenTest.java"/>

          <!-- only run these tests if their required libraries are
               installed -->
          <selector refid="conditional-patterns"/>

          <!-- tests excluded if the test is run in offline mode -->
          <patternset refid="onlinetests"/>

          <!-- failing tests excluded unless run.failing.tests is set -->
          <patternset refid="teststhatfail"/>

          <!-- runtime dependencies that are different from compile
               time dependencies -->
          <exclude name="${optional.package}/ReplaceRegExpTest.java"
            unless="some.regexp.support"/>
          <exclude name="${ant.package}/types/selectors/ContainsRegexpTest.java"
            unless="some.regexp.support"/>
          <exclude name="${ant.package}/types/mappers/RegexpPatternMapperTest.java"
            unless="some.regexp.support"/>

          <!-- needs BSF to work -->
          <exclude name="${optional.package}/Rhino*.java"
            unless="bsf.present"/>
          <exclude name="${optional.package}/Rhino*.java"
            unless="rhino.present"/>
          <exclude name="${optional.package}/script/*.java"
            unless="bsf.present"/>
          <exclude name="${optional.package}/script/*.java"
            unless="rhino.present"/>
          <exclude name="${optional.package}/BeanShellScriptTest.java"
            unless="bsf.present"/>
          <exclude name="${optional.package}/BeanShellScriptTest.java"
            unless="beanshell.present"/>
          <exclude name="${optional.type.package}/Script*.java"
            unless="bsf.present"/>
          <exclude name="${optional.type.package}/Script*.java"
            unless="rhino.present"/>

          <!-- fail if testcases can be loaded from the system classloader -->
          <exclude name="${ant.package}/AntClassLoaderDelegationTest.java"
            if="tests.are.on.system.classpath"/>
          <exclude name="${optional.package}/junit/JUnitClassLoaderTest.java"
            if="tests.are.on.system.classpath"/>

          <!-- these tests need to be localised before being ran???? -->
          <exclude name="${optional.package}/PvcsTest.java"/>

          <!-- These tests need a TraX implementation like xalan2 or saxon -->
          <exclude name="${optional.package}/TraXLiaisonTest.java"
            unless="trax.impl.present"/>
          <exclude name="${optional.package}/XsltTest.java"
            unless="trax.impl.present"/>
          <exclude name="${ant.package}/types/XMLCatalogBuildFileTest.java"
            unless="trax.impl.present"/>
          <exclude name="${optional.package}/junit/JUnitReportTest.java"
            unless="run.junitreport"/>
          <exclude name="${taskdefs.package}/StyleTest.java"
            unless="trax.impl.present"/>

          <!-- needs xerces to work -->
          <exclude name="${ant.package}/IncludeTest.java"
            unless="xerces1.present"/>
          <exclude name="${type.package}/selectors/ModifiedSelectorTest.java"
            unless="xerces1.present"/>

          <!-- needs resolver.jar to work -->
          <exclude name="${optional.package}/XmlValidateCatalogTest.java"
            unless="apache.resolver.present"/>

          <!-- needs jasperc -->
          <exclude name="${optional.package}/JspcTest.java"
            unless="jasper.present"/>

          <!-- misc oneoff tests -->
          <exclude name="${optional.package}/WsdlToDotnetTest.java"
            unless="dotnetapps.found"/>
          <exclude name="${optional.package}/DotnetTest.java"
            unless="dotnetapps.found"/>

          <!--  These tests only passes if testcases and Ant classes have
          been loaded by the same classloader - will throw
          IllegalAccessExceptions otherwise.  -->
          <exclude name="${taskdefs.package}/SQLExecTest.java"
            unless="tests.and.ant.share.classloader"/>
          <exclude name="${taskdefs.package}/cvslib/ChangeLogWriterTest.java"
            unless="tests.and.ant.share.classloader"/>
          <exclude name="${taskdefs.package}/cvslib/ChangeLogParserTest.java"
            unless="tests.and.ant.share.classloader"/>
          <exclude name="${optional.package}/sos/SOSTest.java"
            unless="tests.and.ant.share.classloader"/>
          <exclude name="${optional.package}/vss/MSVSSTest.java"
            unless="tests.and.ant.share.classloader"/>
          <exclude name="${optional.package}/TraXLiaisonTest.java"
            unless="tests.and.ant.share.classloader"/>
          <exclude name="${taskdefs.package}/ProcessDestroyerTest.java"
            unless="tests.and.ant.share.classloader"/>
          <exclude name="${taskdefs.package}/ProtectedJarMethodsTest.java"
            unless="tests.and.ant.share.classloader"/>

          <!-- can only run if cvs is installed on your machine
               enable by setting the property have.cvs
          -->
          <exclude name="${taskdefs.package}/AbstractCvsTaskTest.java"
            unless="have.cvs"/>

          <!-- needs a local ftp server and the entry of a user/password combination -->
          <exclude name="${optional.package}/net/FTPTest.java"/>

          <!-- test needs special setup -->
          <exclude name="${optional.package}/ssh/ScpTest.java"/>

          <!-- test fails if build/classes and ant.jar are using the same
               classloader  -->
          <exclude name="${ant.package}/util/ClasspathUtilsTest.java"
            if="tests.and.ant.share.classloader"/>
        </fileset>
      </batchtest>
    </test-junit>
  </target>

  <target name="junit-single-test" depends="compile-tests,junit-single-test-only"
    description="--> runs the single unit test at $${junit.testcase}" />

  <target name="junit-single-test-only" depends="test-init" if="junit.single"
    description="--> runs the single unit test at $${junit.testcase} (no compile)">
    <test-junit>
      <formatter type="plain" usefile="false"/>
      <test name="${junit.testcase}" todir="${build.junit.xml}"/>
    </test-junit>
  </target>

  <target name="interactive-tests" description="--> runs interactive tests"
    depends="compile-tests"
    if="jdk1.3+">
    <java classpathref="tests-classpath"
      classname="org.apache.tools.ant.taskdefs.TestProcess"
      fork="true"/>
  </target>

  <target name="antunit-tests" depends="dump-info,build,test-init"
          if="run.antunit" description="--> run the antunit tests">

    <condition property="antunit.includes" value="${antunit.testcase}"
               else="**/test.xml,**/*-test.xml">
      <isset property="antunit.testcase" />
    </condition>

    <property name="antunit.excludes" value="" />

    <mkdir dir="${antunit.xml}" />
    <au:antunit xmlns:au="antlib:org.apache.ant.antunit"
                failonerror="false" errorproperty="antunit.failed">
      <fileset dir="${src.antunit}" includes="${antunit.includes}"
               excludes="${antunit.excludes}" />
      <au:plainlistener />
      <au:xmllistener todir="${antunit.xml}" />
    </au:antunit>
  </target>

  <target name="antunit-report" depends="antunit-tests,antunit-report-only" />

  <target name="antunit-report-only" depends="test-init" if="run.antunit.report">
    <length>
      <fileset dir="${antunit.xml}" includes="TEST-*.xml" />
    </length>
    <mkdir dir="${antunit.reports}" />
    <junitreport todir="${antunit.reports}">
      <fileset dir="${antunit.xml}" includes="TEST-*.xml" />
      <report styledir="${src.antunit}" format="frames"
              todir="${antunit.reports}"/>
    </junitreport>
    <length>
      <fileset dir="${antunit.xml}" includes="TEST-*.xml" />
    </length>
  </target>

  <!--
       ===================================================================
         Main target - runs dist-lite by default
       ===================================================================
  -->
  <target name="main"
    description="--> creates a minimum distribution in ./dist"
    depends="dist-lite"/>


  <!--
       ===================================================================
         MSI target - creates an MSI installer file with the help of
                      the WiX toolset and the dotnet Antlib.
       ===================================================================
  -->
  <target name="msi"
    description="--> creates an MSI file for Ant, requires WiX and the dotnet Antlib"
    depends="internal_dist"
    xmlns:dn="antlib:org.apache.ant.dotnet">

    <property name="msi.dir" value="${build.dir}"/>
    <property name="msi.name" value="${name}-${project.version}.msi"/>
    <property name="msi.file" value="${msi.dir}/${msi.name}"/>
    <property name="wix.home" value="${user.home}/wix"/>
    <property name="wixobj.dir" value="${build.dir}/wix"/>

    <property name="dist.dir.resolved" location="${dist.dir}"/>

    <mkdir dir="${wixobj.dir}"/>

    <dn:wix target="${msi.file}"
      mode="both" wixHome="${wix.home}" wixobjDestDir="${wixobj.dir}">
      <sources dir="${etc.dir}" includes="*.wxs"/>
      <moresources dir="${dist.dir}"/>

      <candleParameter name="dist.dir" value="${dist.dir.resolved}"/>
      <candleParameter name="version" value="${manifest-version}"/>
    </dn:wix>
  </target>

</project>

Other Ant examples (source code examples)

Here is a short list of links related to this Ant build.xml source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.