aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/manual/using.html
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/manual/using.html')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/manual/using.html579
1 files changed, 579 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/manual/using.html b/framework/src/ant/apache-ant-1.9.6/manual/using.html
new file mode 100644
index 00000000..d3b9a567
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/manual/using.html
@@ -0,0 +1,579 @@
+<!--
+ 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>Writing a Simple Buildfile</title>
+</head>
+
+<body>
+<h1>Using Apache Ant</h1>
+<h2><a name="buildfile">Writing a Simple Buildfile</a></h2>
+<p>Apache Ant's buildfiles are written in XML. Each buildfile contains one project
+and at least one (default) target. Targets contain task elements.
+Each task element of the buildfile can have an <code>id</code> attribute and
+can later be referred to by the value supplied to this. The value has
+to be unique. (For additional information, see the
+<a href="#tasks"> Tasks</a> section below.)</p>
+<h3><a name="projects">Projects</a></h3>
+<p>A <i>project</i> has three attributes:</p>
+<table border="1" cellpadding="2" cellspacing="0">
+ <tr>
+ <td valign="top"><b>Attribute</b></td>
+ <td valign="top"><b>Description</b></td>
+ <td align="center" valign="top"><b>Required</b></td>
+ </tr>
+ <tr>
+ <td valign="top">name</td>
+ <td valign="top">the name of the project.</td>
+ <td align="center" valign="top">No</td>
+ </tr>
+ <tr>
+ <td valign="top">default</td>
+ <td valign="top">the default target to use when no target is supplied.</td>
+ <td align="center" valign="top">No; however, <b>since Ant 1.6.0</b>,
+ every project includes an implicit target that contains any and
+ all top-level tasks and/or types. This target will always be
+ executed as part of the project's initialization, even when Ant is
+ run with the <a href="running.html#options">-projecthelp</a> option.
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">basedir</td>
+ <td valign="top">the base directory from which all path calculations are
+ done. This attribute might be overridden by setting
+ the &quot;basedir&quot;
+ property beforehand. When this is done, it must be omitted in the
+ project tag. If neither the attribute nor the property have
+ been set, the parent directory of the buildfile will be used.<br/>
+ A relative path is resolved relative to the directory containing
+ the build file.
+ </td>
+ <td align="center" valign="top">No</td>
+ </tr>
+</table>
+<p>Optionally, a description for the project can be provided as a
+top-level <code>&lt;description&gt;</code> element (see the <a
+href="Types/description.html">description</a> type).</p>
+
+<p>Each project defines one or more <i>targets</i>.
+A target is a set of <i>tasks</i> you want
+to be executed. When starting Ant, you can select which target(s) you
+want to have executed. When no target is given,
+the project's default is used.</p>
+
+<h3><a name="targets">Targets</a></h3>
+<p>A target can depend on other targets. You might have a target for compiling,
+for example, and a target for creating a distributable. You can only build a
+distributable when you have compiled first, so the distribute target
+<i>depends on</i> the compile target. Ant resolves these dependencies.</p>
+<p>It should be noted, however, that Ant's <code>depends</code> attribute
+only specifies the <i>order</i> in which targets should be executed - it
+does not affect whether the target that specifies the dependency(s) gets
+executed if the dependent target(s) did not (need to) run.
+</p>
+
+<p>More information can be found in the
+ dedicated <a href="targets.html">manual page</a>.</p>
+
+<h3><a name="tasks">Tasks</a></h3>
+<p>A task is a piece of code that can be executed.</p>
+<p>A task can have multiple attributes (or arguments, if you prefer). The value
+of an attribute might contain references to a property. These references will be
+resolved before the task is executed.</p>
+<p>Tasks have a common structure:</p>
+<blockquote>
+ <pre>&lt;<i>name</i> <i>attribute1</i>=&quot;<i>value1</i>&quot; <i>attribute2</i>=&quot;<i>value2</i>&quot; ... /&gt;</pre>
+</blockquote>
+<p>where <i>name</i> is the name of the task,
+<i>attributeN</i> is the attribute name, and
+<i>valueN</i> is the value for this attribute.</p>
+<p>There is a set of <a href="tasklist.html" target="navFrame">built-in tasks</a>, but it is also very
+easy to <a href="develop.html#writingowntask">write your own</a>.</p>
+<p>All tasks share a task name attribute. The value of
+this attribute will be used in the logging messages generated by
+Ant.</p>
+Tasks can be assigned an <code>id</code> attribute:
+<blockquote>
+<pre>&lt;<i>taskname</i> id="<i>taskID</i>" ... /&gt;</pre>
+</blockquote>
+where <i>taskname</i> is the name of the task, and <i>taskID</i> is
+a unique identifier for this task.
+You can refer to the
+corresponding task object in scripts or other tasks via this name.
+For example, in scripts you could do:
+<blockquote>
+<pre>
+&lt;script ... &gt;
+ task1.setFoo("bar");
+&lt;/script&gt;
+</pre>
+</blockquote>
+to set the <code>foo</code> attribute of this particular task instance.
+In another task (written in Java), you can access the instance via
+<code>project.getReference("task1")</code>.
+<p>
+Note<sup>1</sup>: If &quot;task1&quot; has not been run yet, then
+it has not been configured (ie., no attributes have been set), and if it is
+going to be configured later, anything you've done to the instance may
+be overwritten.
+</p>
+<p>
+Note<sup>2</sup>: Future versions of Ant will most likely <i>not</i>
+be backward-compatible with this behaviour, since there will likely be no
+task instances at all, only proxies.
+</p>
+
+<h3><a name="properties">Properties</a></h3>
+
+<p>Properties are an important way to customize a build process or
+ to just provide shortcuts for strings that are used repeatedly
+ inside a build file.</p>
+
+<p>In its most simple form properties are defined in the build file
+ (for example by the <a href="Tasks/property.html">property</a>
+ task) or might be set outside Ant. A property has a name and a
+ value; the name is case-sensitive. Properties may be used in the
+ value of task attributes or in the nested text of tasks that support
+ them. This is done by placing the property name between
+ &quot;<code>${</code>&quot; and &quot;<code>}</code>&quot; in the
+ attribute value. For example, if there is a &quot;builddir&quot;
+ property with the value &quot;build&quot;, then this could be used
+ in an attribute like this: <code>${builddir}/classes</code>. This
+ is resolved at run-time as <code>build/classes</code>.</p>
+
+<p>With Ant 1.8.0 property expansion has become much more powerful
+ than simple key value pairs, more details can be
+ found <a href="properties.html">in the concepts section</a> of this
+ manual.</p>
+
+<h3><a name="example">Example Buildfile</a></h3>
+<pre>
+&lt;project name=&quot;MyProject&quot; default=&quot;dist&quot; basedir=&quot;.&quot;&gt;
+ &lt;description&gt;
+ simple example build file
+ &lt;/description&gt;
+ &lt;!-- set global properties for this build --&gt;
+ &lt;property name=&quot;src&quot; location=&quot;src&quot;/&gt;
+ &lt;property name=&quot;build&quot; location=&quot;build&quot;/&gt;
+ &lt;property name=&quot;dist&quot; location=&quot;dist&quot;/&gt;
+
+ &lt;target name=&quot;init&quot;&gt;
+ &lt;!-- Create the time stamp --&gt;
+ &lt;tstamp/&gt;
+ &lt;!-- Create the build directory structure used by compile --&gt;
+ &lt;mkdir dir=&quot;${build}&quot;/&gt;
+ &lt;/target&gt;
+
+ &lt;target name=&quot;compile&quot; depends=&quot;init&quot;
+ description=&quot;compile the source&quot;&gt;
+ &lt;!-- Compile the java code from ${src} into ${build} --&gt;
+ &lt;javac srcdir=&quot;${src}&quot; destdir=&quot;${build}&quot;/&gt;
+ &lt;/target&gt;
+
+ &lt;target name=&quot;dist&quot; depends=&quot;compile&quot;
+ description=&quot;generate the distribution&quot;&gt;
+ &lt;!-- Create the distribution directory --&gt;
+ &lt;mkdir dir=&quot;${dist}/lib&quot;/&gt;
+
+ &lt;!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --&gt;
+ &lt;jar jarfile=&quot;${dist}/lib/MyProject-${DSTAMP}.jar&quot; basedir=&quot;${build}&quot;/&gt;
+ &lt;/target&gt;
+
+ &lt;target name=&quot;clean&quot;
+ description=&quot;clean up&quot;&gt;
+ &lt;!-- Delete the ${build} and ${dist} directory trees --&gt;
+ &lt;delete dir=&quot;${build}&quot;/&gt;
+ &lt;delete dir=&quot;${dist}&quot;/&gt;
+ &lt;/target&gt;
+&lt;/project&gt;
+</pre>
+
+<p>Notice that we are declaring properties outside any target. As of
+Ant 1.6 all tasks can be declared outside targets (earlier version
+only allowed <tt>&lt;property&gt;</tt>,<tt>&lt;typedef&gt;</tt> and
+<tt>&lt;taskdef&gt;</tt>). When you do this they are evaluated before
+any targets are executed. Some tasks will generate build failures if
+they are used outside of targets as they may cause infinite loops
+otherwise (<code>&lt;antcall&gt;</code> for example).</p>
+
+<p>
+We have given some targets descriptions; this causes the <tt>projecthelp</tt>
+invocation option to list them as public targets with the descriptions; the
+other target is internal and not listed.
+<p>
+Finally, for this target to work the source in the <tt>src</tt> subdirectory
+should be stored in a directory tree which matches the package names. Check the
+<tt>&lt;javac&gt;</tt> task for details.
+
+<h3><a name="filters">Token Filters</a></h3>
+<p>A project can have a set of tokens that might be automatically expanded if
+found when a file is copied, when the filtering-copy behavior is selected in the
+tasks that support this. These might be set in the buildfile
+by the <a href="Tasks/filter.html">filter</a> task.</p>
+<p>Since this can potentially be a very harmful behavior,
+the tokens in the files <b>must</b>
+be of the form <code>@</code><i>token</i><code>@</code>, where
+<i>token</i> is the token name that is set
+in the <code>&lt;filter&gt;</code> task. This token syntax matches the syntax of other build systems
+that perform such filtering and remains sufficiently orthogonal to most
+programming and scripting languages, as well as with documentation systems.</p>
+<p>Note: If a token with the format <code>@</code><i>token</i><code>@</code>
+is found in a file, but no
+filter is associated with that token, no changes take place;
+therefore, no escaping
+method is available - but as long as you choose appropriate names for your
+tokens, this should not cause problems.</p>
+<p><b>Warning:</b> If you copy binary files with filtering turned on, you can corrupt the
+files. This feature should be used with text files <em>only</em>.</p>
+
+<h3><a name="path">Path-like Structures</a></h3>
+<p>You can specify <code>PATH</code>- and <code>CLASSPATH</code>-type
+references using both
+&quot;<code>:</code>&quot; and &quot;<code>;</code>&quot; as separator
+characters. Ant will
+convert the separator to the correct character of the current operating
+system.</p>
+<p>Wherever path-like values need to be specified, a nested element can
+be used. This takes the general form of:</p>
+<pre>
+ &lt;classpath&gt;
+ &lt;pathelement path=&quot;${classpath}&quot;/&gt;
+ &lt;pathelement location=&quot;lib/helper.jar&quot;/&gt;
+ &lt;/classpath&gt;
+</pre>
+<p>The <code>location</code> attribute specifies a single file or
+directory relative to the project's base directory (or an absolute
+filename), while the <code>path</code> attribute accepts colon-
+or semicolon-separated lists of locations. The <code>path</code>
+attribute is intended to be used with predefined paths - in any other
+case, multiple elements with <code>location</code> attributes should be
+preferred.</p>
+<p><em>Since Ant 1.8.2</em> the location attribute can also contain a
+ wildcard in its last path component (i.e. it can end in a
+ &quot;*&quot;) in order to support wildcard CLASSPATHs introduced
+ with Java6. Ant will not expand or evaluate the wildcards and the
+ resulting path may not work as anything else but a CLASSPATH - or
+ even as a CLASSPATH for a Java VM prior to Java6.</p>
+<p>As a shortcut, the <code>&lt;classpath&gt;</code> tag
+supports <code>path</code> and
+<code>location</code> attributes of its own, so:</p>
+<pre>
+ &lt;classpath&gt;
+ &lt;pathelement path=&quot;${classpath}&quot;/&gt;
+ &lt;/classpath&gt;
+</pre>
+<p>can be abbreviated to:</p>
+<pre>
+ &lt;classpath path=&quot;${classpath}&quot;/&gt;
+</pre>
+<p>In addition, one or more
+<a href="Types/resources.html#collection">Resource Collection</a>s
+can be specified as nested elements (these must consist of
+<a href="Types/resources.html#file">file</a>-type resources only).
+Additionally, it should be noted that although resource collections are
+processed in the order encountered, certain resource collection types
+such as <a href="Types/fileset.html">fileset</a>,
+<a href="Types/dirset.html">dirset</a> and
+<a href="Types/resources.html#files">files</a>
+are undefined in terms of order.</p>
+<pre>
+ &lt;classpath&gt;
+ &lt;pathelement path=&quot;${classpath}&quot;/&gt;
+ &lt;fileset dir=&quot;lib&quot;&gt;
+ &lt;include name=&quot;**/*.jar&quot;/&gt;
+ &lt;/fileset&gt;
+ &lt;pathelement location=&quot;classes&quot;/&gt;
+ &lt;dirset dir=&quot;${build.dir}&quot;&gt;
+ &lt;include name=&quot;apps/**/classes&quot;/&gt;
+ &lt;exclude name=&quot;apps/**/*Test*&quot;/&gt;
+ &lt;/dirset&gt;
+ &lt;filelist refid=&quot;third-party_jars&quot;/&gt;
+ &lt;/classpath&gt;
+</pre>
+<p>This builds a path that holds the value of <code>${classpath}</code>,
+followed by all jar files in the <code>lib</code> directory,
+the <code>classes</code> directory, all directories named
+<code>classes</code> under the <code>apps</code> subdirectory of
+<code>${build.dir}</code>, except those
+that have the text <code>Test</code> in their name, and
+the files specified in the referenced FileList.</p>
+<p>If you want to use the same path-like structure for several tasks,
+you can define them with a <code>&lt;path&gt;</code> element at the
+same level as <i>target</i>s, and reference them via their
+<i>id</i> attribute--see <a href="#references">References</a> for an
+example.</p>
+
+<p>By default a path like structure will re-evaluate all nested
+ resource collections whenever it is used, which may lead to
+ unnecessary re-scanning of the filesystem. Since Ant 1.8.0 path has
+ an optional <i>cache</i> attribute, if it is set to true, the path
+ instance will only scan its nested resource collections once and
+ assume it doesn't change during the build anymore (the default
+ for <i>cache</i> still is <i>false</i>). Even if you are using the
+ path only in a single task it may improve overall performance to set
+ <i>cache</i> to <i>true</i> if you are using complex nested
+ constructs.</p>
+
+<p>A path-like structure can include a reference to another path-like
+structure (a path being itself a resource collection)
+via nested <code>&lt;path&gt;</code> elements:</p>
+<pre>
+ &lt;path id=&quot;base.path&quot;&gt;
+ &lt;pathelement path=&quot;${classpath}&quot;/&gt;
+ &lt;fileset dir=&quot;lib&quot;&gt;
+ &lt;include name=&quot;**/*.jar&quot;/&gt;
+ &lt;/fileset&gt;
+ &lt;pathelement location=&quot;classes&quot;/&gt;
+ &lt;/path&gt;
+
+ &lt;path id=&quot;tests.path&quot; cache=&quot;true&quot;&gt;
+ &lt;path refid=&quot;base.path&quot;/&gt;
+ &lt;pathelement location=&quot;testclasses&quot;/&gt;
+ &lt;/path&gt;
+</pre>
+ The shortcuts previously mentioned for <code>&lt;classpath&gt;</code> are also valid for <code>&lt;path&gt;</code>.For example:
+<pre>
+ &lt;path id=&quot;base.path&quot;&gt;
+ &lt;pathelement path=&quot;${classpath}&quot;/&gt;
+ &lt;/path&gt;
+</pre>
+can be written as:
+<pre>
+ &lt;path id=&quot;base.path&quot; path=&quot;${classpath}&quot;/&gt;
+</pre>
+
+ <h4><a name="pathshortcut">Path Shortcut</a></h4>
+ <p>
+ In Ant 1.6 a shortcut for converting paths to OS specific strings
+ in properties has been added. One can use the expression
+ ${toString:<em>pathreference</em>} to convert a path element
+ reference to a string that can be used for a path argument.
+ For example:
+ </p>
+<pre>
+ &lt;path id="lib.path.ref"&gt;
+ &lt;fileset dir="lib" includes="*.jar"/&gt;
+ &lt;/path&gt;
+ &lt;javac srcdir="src" destdir="classes"&gt;
+ &lt;compilerarg arg="-Xbootclasspath/p:${toString:lib.path.ref}"/&gt;
+ &lt;/javac&gt;
+</pre>
+
+
+<h3><a name="arg">Command-line Arguments</a></h3>
+<p>Several tasks take arguments that will be passed to another
+process on the command line. To make it easier to specify arguments
+that contain space characters, nested <code>arg</code> elements can be used.</p>
+<table border="1" cellpadding="2" cellspacing="0">
+<tr>
+ <td width="12%" valign="top"><b>Attribute</b></td>
+ <td width="78%" valign="top"><b>Description</b></td>
+ <td width="10%" valign="top"><b>Required</b></td>
+</tr>
+ <tr>
+ <td valign="top">value</td>
+ <td valign="top">a single command-line argument; can contain space
+ characters.</td>
+ <td align="center" rowspan="5">Exactly one of these.</td>
+ </tr>
+ <tr>
+ <td valign="top">file</td>
+ <td valign="top">The name of a file as a single command-line
+ argument; will be replaced with the absolute filename of the file.</td>
+ </tr>
+ <tr>
+ <td valign="top">path</td>
+ <td valign="top">A string that will be treated as a path-like
+ string as a single command-line argument; you can use <code>;</code>
+ or <code>:</code> as
+ path separators and Ant will convert it to the platform's local
+ conventions.</td>
+ </tr>
+ <tr>
+ <td valign="top">pathref</td>
+ <td valign="top"><a href="#references">Reference</a> to a path
+ defined elsewhere. Ant will convert it to the platform's local
+ conventions.</td>
+ </tr>
+ <tr>
+ <td valign="top">line</td>
+ <td valign="top">a space-delimited list of command-line arguments.</td>
+ </tr>
+ <tr>
+ <td valign="top">prefix</td>
+ <td valign="top">A fixed string to be placed in front of the
+ argument. In the case of a line broken into parts, it will be
+ placed in front of every part. <em>Since Ant 1.8.</em></td>
+ <td valign="top" align="center">No</td>
+ </tr>
+ <tr>
+ <td valign="top">suffix</td>
+ <td valign="top">A fixed string to be placed immediately after the
+ argument. In the case of a line broken into parts, it will be
+ placed after every part. <em>Since Ant 1.8.</em></td>
+ <td valign="top" align="center">No</td>
+ </tr>
+</table>
+
+<p>It is highly recommended to avoid the <code>line</code> version
+when possible. Ant will try to split the command line in a way
+similar to what a (Unix) shell would do, but may create something that
+is very different from what you expect under some circumstances.</p>
+
+<h4>Examples</h4>
+<blockquote><pre>
+ &lt;arg value=&quot;-l -a&quot;/&gt;
+</pre></blockquote>
+<p>is a single command-line argument containing a space character,
+<i>not</i> separate commands "-l" and "-a".</p>
+<blockquote><pre>
+ &lt;arg line=&quot;-l -a&quot;/&gt;
+</pre></blockquote>
+<p>This is a command line with two separate arguments, "-l" and "-a".</p>
+<blockquote><pre>
+ &lt;arg path=&quot;/dir;/dir2:\dir3&quot;/&gt;
+</pre></blockquote>
+<p>is a single command-line argument with the value
+<code>\dir;\dir2;\dir3</code> on DOS-based systems and
+<code>/dir:/dir2:/dir3</code> on Unix-like systems.</p>
+
+<h3><a name="references">References</a></h3>
+
+<p>Any project element can be assigned an identifier using its
+<code>id</code> attribute. In most cases the element can subsequently
+be referenced by specifying the <code>refid</code> attribute on an
+element of the same type. This can be useful if you are going to
+replicate the same snippet of XML over and over again--using a
+<code>&lt;classpath&gt;</code> structure more than once, for example.</p>
+<p>The following example:</p>
+<blockquote><pre>
+&lt;project ... &gt;
+ &lt;target ... &gt;
+ &lt;rmic ...&gt;
+ &lt;classpath&gt;
+ &lt;pathelement location=&quot;lib/&quot;/&gt;
+ &lt;pathelement path=&quot;${java.class.path}/&quot;/&gt;
+ &lt;pathelement path=&quot;${additional.path}&quot;/&gt;
+ &lt;/classpath&gt;
+ &lt;/rmic&gt;
+ &lt;/target&gt;
+
+ &lt;target ... &gt;
+ &lt;javac ...&gt;
+ &lt;classpath&gt;
+ &lt;pathelement location=&quot;lib/&quot;/&gt;
+ &lt;pathelement path=&quot;${java.class.path}/&quot;/&gt;
+ &lt;pathelement path=&quot;${additional.path}&quot;/&gt;
+ &lt;/classpath&gt;
+ &lt;/javac&gt;
+ &lt;/target&gt;
+&lt;/project&gt;
+</pre></blockquote>
+<p>could be rewritten as:</p>
+<blockquote><pre>
+&lt;project ... &gt;
+ &lt;path id=&quot;project.class.path&quot;&gt;
+ &lt;pathelement location=&quot;lib/&quot;/&gt;
+ &lt;pathelement path=&quot;${java.class.path}/&quot;/&gt;
+ &lt;pathelement path=&quot;${additional.path}&quot;/&gt;
+ &lt;/path&gt;
+
+ &lt;target ... &gt;
+ &lt;rmic ...&gt;
+ &lt;classpath refid=&quot;project.class.path&quot;/&gt;
+ &lt;/rmic&gt;
+ &lt;/target&gt;
+
+ &lt;target ... &gt;
+ &lt;javac ...&gt;
+ &lt;classpath refid=&quot;project.class.path&quot;/&gt;
+ &lt;/javac&gt;
+ &lt;/target&gt;
+&lt;/project&gt;
+</pre></blockquote>
+<p>All tasks that use nested elements for
+<a href="Types/patternset.html">PatternSet</a>s,
+<a href="Types/fileset.html">FileSet</a>s,
+<a href="Types/zipfileset.html">ZipFileSet</a>s or
+<a href="#path">path-like structures</a> accept references to these structures
+as shown in the examples. Using <code>refid</code> on a task will ordinarily
+have the same effect (referencing a task already declared), but the user
+should be aware that the interpretation of this attribute is dependent on the
+implementation of the element upon which it is specified. Some tasks (the
+<a href="Tasks/property.html">property</a> task is a handy example)
+deliberately assign a different meaning to <code>refid</code>.</p>
+
+
+<h3><a name="external-tasks">Use of external tasks</a></h3>
+Ant supports a plugin mechanism for using third party tasks. For using them you
+have to do two steps:
+<ol>
+ <li>place their implementation somewhere where Ant can find them</li>
+ <li>declare them.</li>
+</ol>
+Don't add anything to the CLASSPATH environment variable - this is often the
+reason for very obscure errors. Use Ant's own <a href="install.html#optionalTasks">mechanisms</a>
+for adding libraries:
+<ul>
+ <li>via command line argument <code>-lib</code></li>
+ <li>adding to <code>${user.home}/.ant/lib</code></li>
+ <li>adding to <code>${ant.home}/lib</code></li>
+</ul>
+For the declaration there are several ways:
+<ul>
+ <li>declare a single task per using instruction using
+ <code>&lt;<a href="Tasks/taskdef.html">taskdef</a> name=&quot;taskname&quot;
+ classname=&quot;ImplementationClass&quot;/&gt;</code>
+ <br>
+ <code>&lt;taskdef name=&quot;for&quot; classname=&quot;net.sf.antcontrib.logic.For&quot; /&gt;
+ &lt;for ... /&gt;</code>
+ </li>
+ <li>declare a bundle of tasks using a properties-file holding these
+ taskname-ImplementationClass-pairs and <code>&lt;taskdef&gt;</code>
+ <br>
+ <code>&lt;taskdef resource=&quot;net/sf/antcontrib/antcontrib.properties&quot; /&gt;
+ &lt;for ... /&gt;</code>
+ </li>
+ <li>declare a bundle of tasks using a <a href="Types/antlib.html">xml-file</a> holding these
+ taskname-ImplementationClass-pairs and <code>&lt;taskdef&gt;</code>
+ <br>
+ <code>&lt;taskdef resource=&quot;net/sf/antcontrib/antlib.xml&quot; /&gt;
+ &lt;for ... /&gt;</code>
+ </li>
+ <li>declare a bundle of tasks using a xml-file named antlib.xml, XML-namespace and
+ <a href="Types/antlib.html#antlibnamespace"><code>antlib:</code> protocol handler</a>
+ <br>
+ <code>&lt;project xmlns:ac=&quot;antlib:net.sf.antcontrib&quot;/&gt;
+ &lt;ac:for ... /&gt;</code>
+ </li>
+</ul>
+
+If you need a special function, you should
+<ol>
+ <li>have a look at this manual, because Ant provides lot of tasks</li>
+ <li>have a look at the external task page <a href="http://ant.apache.org/external.html">online</a></li>
+ <li>have a look at the external task <a href="http://wiki.apache.org/ant/AntExternalTaskdefs">wiki
+ page</a></li>
+ <li>ask on the <a href="http://ant.apache.org/mail.html#User%20List">Ant user</a> list</li>
+ <li><a href="tutorial-writing-tasks.html">implement </a>(and share) your own</li>
+</ol>
+
+</body>
+</html>