<!--
   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.
-->
<html>

<head>
<meta http-equiv="Content-Language" content="en-us">
<link rel="stylesheet" type="text/css" href="stylesheets/style.css">
<title>Apache Ant 1.9.17 User Manual</title>
</head>

<body bgcolor="#FFFFFF">
<div align="center"> 
  <h1><img src="images/ant_logo_large.gif" width="190" height="120"></h1>
  <h1>Apache Ant&trade; 1.9.17 Manual</h1>
  <p align="left">This is the manual for version 1.9.17 of
  <a target="_top" href="http://ant.apache.org/index.html">Apache Ant</a>. 
    If your version 
    of Ant (as verified with <tt>ant -version</tt>) is older or newer than this 
    version then this is not the correct manual set. Please use the documentation 
    appropriate to your current version. Also, if you are using a version
    older than the most recent release, we recommend an upgrade to fix bugs
    as well as provide new functionality. </p>
  <p>&nbsp;</p>

  <p align="left">Ant's manual and API documentation is part of
    the <a href="http://ant.apache.org/bindownload.cgi">binary</a>
    distributions or available as a
    separate <a href="http://ant.apache.org/manualdownload.cgi">archive</a>.
    Manuals for older releases are available for
    download
    <a href="http://ant.apache.org/bindownload.cgi#Old Ant Releases">as
      well</a>.</p>

  <p>Apache Ant, Apache Ivy, Ant, Ivy, Apache, the Apache feather logo, and the Apache Ant project logos are trademarks of The Apache Software Foundation.</p>
</div>


</body>
</html>
