Browse Source

> -> >

Submitted by:	Larry Shatzer


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277037 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 20 years ago
parent
commit
706bba41a5
9 changed files with 385 additions and 385 deletions
  1. +2
    -2
      docs/manual/CoreTasks/changelog.html
  2. +2
    -2
      docs/manual/CoreTasks/chmod.html
  3. +12
    -12
      docs/manual/CoreTypes/filterchain.html
  4. +2
    -2
      docs/manual/CoreTypes/selectors-program.html
  5. +44
    -44
      docs/manual/CoreTypes/selectors.html
  6. +1
    -1
      docs/manual/OptionalTasks/replaceregexp.html
  7. +1
    -1
      docs/manual/running.html
  8. +176
    -176
      docs/manual/tutorial-tasks-filesets-properties.html
  9. +145
    -145
      docs/manual/tutorial-writing-tasks.html

+ 2
- 2
docs/manual/CoreTasks/changelog.html View File

@@ -213,9 +213,9 @@ how to generate a HTML report from the XML report.</p>
&lt;revision&gt;1.3&lt;/revision&gt;
&lt;prevrevision&gt;1.2&lt;/prevrevision&gt;
&lt;/file&gt;
&lt;msg&gt;&lt;![CDATA[Use URLs directly rather than go via a FIle.
&lt;msg&gt;&lt;![CDATA[Use URLs directly rather than go via a File.

This allows temp[lates to be stored inside jar]]&gt;&lt;/msg&gt;
This allows templates to be stored inside jar]]&gt;&lt;/msg&gt;
&lt;/entry&gt;
&lt;/changelog&gt;
</pre>


+ 2
- 2
docs/manual/CoreTasks/chmod.html View File

@@ -147,8 +147,8 @@ permissions.</p>
</blockquote>

<p>keeps non-owners from touching cgi scripts, files with a <code>.old</code>
extension or directories begining with <code>private_</code>. A directory
ending in <code>.old</code> or a file begining with private_ would remain
extension or directories beginning with <code>private_</code>. A directory
ending in <code>.old</code> or a file beginning with private_ would remain
unaffected.</p>

<hr>


+ 12
- 12
docs/manual/CoreTypes/filterchain.html View File

@@ -648,34 +648,34 @@ This graphic shows the dependencies:
<TABLE>
<TR>
<TD bgcolor="#C0C0C0">&nbsp;</TD>
<TD><PRE>&lt;filterchain>
<TD><PRE>&lt;filterchain&gt;
&lt;headfilter lines="2"/&gt;
&lt;/filterchain></PRE></TD>
&lt;/filterchain&gt;</PRE></TD>
</TR>
<TR>
<TD bgcolor="#FF00FF">&nbsp;</TD>
<TD><PRE>&lt;filterchain>
<TD><PRE>&lt;filterchain&gt;
&lt;tailfilter lines="-1" skip="2"/&gt;
&lt;/filterchain></PRE></TD>
&lt;/filterchain&gt;</PRE></TD>
</TR>
<TR>
<TD bgcolor="#008000">&nbsp;</TD>
<TD><PRE>&lt;filterchain>
<TD><PRE>&lt;filterchain&gt;
&lt;headfilter lines="-1" skip="2"/&gt;
&lt;/filterchain></PRE></TD>
&lt;/filterchain&gt;</PRE></TD>
</TR>
<TR>
<TD bgcolor="#0000FF">&nbsp;</TD>
<TD><PRE>&lt;filterchain>
&lt;headfilter lines="-1" skip="2"/>
&lt;tailfilter lines="-1" skip="2"/>
&lt;/filterchain></PRE></TD>
<TD><PRE>&lt;filterchain&gt;
&lt;headfilter lines="-1" skip="2"/&gt;
&lt;tailfilter lines="-1" skip="2"/&gt;
&lt;/filterchain&gt;</PRE></TD>
</TR>
<TR>
<TD bgcolor="#00FF00">&nbsp;</TD>
<TD><PRE>&lt;filterchain>
<TD><PRE>&lt;filterchain&gt;
&lt;tailfilter lines="2"/&gt;
&lt;/filterchain></PRE></TD>
&lt;/filterchain&gt;</PRE></TD>
</TR>
</TABLE>
</TD>


+ 2
- 2
docs/manual/CoreTypes/selectors-program.html View File

@@ -201,9 +201,9 @@ public class MySelectorTest extends BaseSelectorTest {
As an example of an error JUnit could log<pre>
[junit] FAILED
[junit] Error for files: <font color=blue>.;copy.filterset.filtered;tar/gz/asf-logo.gif.tar.gz</font>
[junit] expected:&lt;<font color=blue>FTTTFTTTF...</font>> but was:&lt;TTTTTTTTT...>
[junit] expected:&lt;<font color=blue>FTTTFTTTF...</font>&gt; but was:&lt;TTTTTTTTT...&gt;
[junit] junit.framework.ComparisonFailure: Error for files: .;copy.filterset.filtered;tar/gz/asf-logo.gif.tar.gz
[junit] expected:&lt;FTTTFTTTF...> but was:&lt;TTTTTTTTT...>
[junit] expected:&lt;FTTTFTTTF...&gt; but was:&lt;TTTTTTTTT...&gt;
[junit] at junit.framework.Assert.assertEquals(Assert.java:81)
[junit] at org.apache.tools.ant.types.selectors.BaseSelectorTest.performTest(BaseSelectorTest.java:194)
</pre></p>


+ 44
- 44
docs/manual/CoreTypes/selectors.html View File

@@ -613,7 +613,7 @@

<blockquote><pre>
&lt;fileset dir=&quot;${src}&quot;&gt;
&lt;type type="dir"/>
&lt;type type="dir"/&gt;
&lt;/fileset&gt;
</pre></blockquote>

@@ -622,12 +622,12 @@
directory, but avoid selecting empty directories, use:

<blockquote><pre>
&lt;fileset dir="${src}">
&lt;and>
&lt;present targetdir="template"/>
&lt;type type="file"/>
&lt;/and>
&lt;/fileset>
&lt;fileset dir="${src}"&gt;
&lt;and&gt;
&lt;present targetdir="template"/&gt;
&lt;type type="file"/&gt;
&lt;/and&gt;
&lt;/fileset&gt;
</pre></blockquote>


@@ -816,62 +816,62 @@
<p>Here are some examples of how to use the Modified Selector:</p>

<blockquote><pre>
&lt;copy todir="dest">
&lt;fileset dir="src">
&lt;modified/>
&lt;/fileset>
&lt;/copy
&lt;copy todir="dest"&gt;
&lt;fileset dir="src"&gt;
&lt;modified/&gt;
&lt;/fileset&gt;
&lt;/copy&gt;
</pre></blockquote>
<p>This will copy all files from <i>src</i> to <i>dest</i> which content has changed.
Using an updating PropertyfileCache with cache.properties and
MD5-DigestAlgorithm.</p>

<blockquote><pre>
&lt;copy todir="dest">
&lt;fileset dir="src">
&lt;copy todir="dest"&gt;
&lt;fileset dir="src"&gt;
&lt;modified update="true"
seldirs="true"
cache="propertyfile"
algorithm="digest"
comparator="equal">
&lt;param name="cache.cachefile" value="cache.properties"/>
&lt;param name="algorithm.algorithm" value="MD5"/>
&lt;/modified>
&lt;/fileset>
&lt;/copy>
comparator="equal"&gt;
&lt;param name="cache.cachefile" value="cache.properties"/&gt;
&lt;param name="algorithm.algorithm" value="MD5"/&gt;
&lt;/modified&gt;
&lt;/fileset&gt;
&lt;/copy&gt;
</pre></blockquote>
<p>This is the same example rewritten as CoreSelector with setting the all the values
(same as defaults are).</p>

<blockquote><pre>
&lt;copy todir="dest">
&lt;fileset dir="src">
&lt;custom class="org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector">
&lt;param name="update" value="true"/>
&lt;param name="seldirs" value="true"/>
&lt;param name="cache" value="propertyfile"/>
&lt;param name="algorithm" value="digest"/>
&lt;param name="comparator" value="equal"/>
&lt;param name="cache.cachefile" value="cache.properties"/>
&lt;param name="algorithm.algorithm" value="MD5"/>
&lt;/custom>
&lt;/fileset>
&lt;/copy>
&lt;copy todir="dest"&gt;
&lt;fileset dir="src"&gt;
&lt;custom class="org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector"&gt;
&lt;param name="update" value="true"/&gt;
&lt;param name="seldirs" value="true"/&gt;
&lt;param name="cache" value="propertyfile"/&gt;
&lt;param name="algorithm" value="digest"/&gt;
&lt;param name="comparator" value="equal"/&gt;
&lt;param name="cache.cachefile" value="cache.properties"/&gt;
&lt;param name="algorithm.algorithm" value="MD5"/&gt;
&lt;/custom&gt;
&lt;/fileset&gt;
&lt;/copy&gt;
</pre></blockquote>
<p>And this is the same rewritten as CustomSelector.</p>

<blockquote><pre>
&lt;target name="generate-and-upload-site">
&lt;echo> generate the site using forrest &lt;/echo>
&lt;antcall target="site"/>
&lt;echo> upload the changed file &lt;/echo>
&lt;ftp server="${ftp.server}" userid="${ftp.user}" password="${ftp.pwd}">
&lt;fileset dir="htdocs/manual">
&lt;modified/>
&lt;/fileset>
&lt;/ftp>
&lt;/target>
&lt;target name="generate-and-upload-site"&gt;
&lt;echo&gt; generate the site using forrest &lt;/echo&gt;
&lt;antcall target="site"/&gt;
&lt;echo&gt; upload the changed file &lt;/echo&gt;
&lt;ftp server="${ftp.server}" userid="${ftp.user}" password="${ftp.pwd}"&gt;
&lt;fileset dir="htdocs/manual"&gt;
&lt;modified/&gt;
&lt;/fileset&gt;
&lt;/ftp&gt;
&lt;/target&gt;
</pre></blockquote>
<p>A useful scenario for this selector inside a build environment
for homepage generation (e.g. with <a href="http://xml.apache.org/forrest/">


+ 1
- 1
docs/manual/OptionalTasks/replaceregexp.html View File

@@ -123,7 +123,7 @@ line separator. So with input

<blockquote>
<pre>
&lt;html> &lt;body&gt;
&lt;html&gt; &lt;body&gt;
&lt;&lt;TAB&gt;&gt;&lt;h1&gt; T E S T &lt;/h1&gt; &lt;&lt;TAB&gt;&gt;
&lt;&lt;TAB&gt;&gt; &lt;/body&gt;&lt;/html&gt;
</pre></blockquote>


+ 1
- 1
docs/manual/running.html View File

@@ -217,7 +217,7 @@ set):</p>
<p>So here the result of a search through the codebase. Because system properties are
available via Project instance, I searched for them with a
<pre>
grep -r -n "getPropert" * > ..\grep.txt
grep -r -n "getPropert" * &gt; ..\grep.txt
</pre>
command. After that I filtered out the often-used but not-so-important values (most of them
read-only values): <i>path.separator, ant.home, basedir, user.dir, os.name, ant.file,


+ 176
- 176
docs/manual/tutorial-tasks-filesets-properties.html View File

@@ -41,16 +41,16 @@ location of that file in a property.</p>
<p>We can use the buildfile from the other tutorial and modify it a little bit.
That´s the advantage of using properties - we can reuse nearly the whole script. :-)</p>
<pre class="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?>
&lt;project name="<b>FindTask</b>" basedir="." default="test">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;project name="<b>FindTask</b>" basedir="." default="test"&gt;
...
&lt;target name="use.init" description="Taskdef´ the <b>Find</b>-Task" depends="jar">
&lt;taskdef name="<b>find</b>" classname="<b>Find</b>" classpath="${ant.project.name}.jar"/>
&lt;/target>
&lt;target name="use.init" description="Taskdef´ the <b>Find</b>-Task" depends="jar"&gt;
&lt;taskdef name="<b>find</b>" classname="<b>Find</b>" classpath="${ant.project.name}.jar"/&gt;
&lt;/target&gt;

<b>&lt;!-- the other use.* targets are deleted --&gt;</b>
...
&lt;/project>
&lt;/project&gt;
</pre>

<p>The buildfile is in the archive <a href="tutorial-tasks-filesets-properties.zip">
@@ -63,13 +63,13 @@ tutorial-tasks-filesets-properties.zip [2]</a> in <tt>/build.xml.01-propertyacce
<p>Our first step is to set a property to a value and print the value of that property.
So our scenario would be
<pre class="code">
&lt;find property="test" value="test-value"/>
&lt;find print="test"/>
&lt;find property="test" value="test-value"/&gt;
&lt;find print="test"/&gt;
</pre>
ok, can be rewritten with the core tasks
<pre class="code">
&lt;property name="test" value="test-value"/>
&lt;echo message="${test}"/>
&lt;property name="test" value="test-value"/&gt;
&lt;echo message="${test}"/&gt;
</pre>
but I have to start on known ground :-)</p>
<p>So what to do? Handling three attributes (property, value, print) and an execute method.
@@ -117,7 +117,7 @@ name. Otherwise a message is logged.</p>

<p><i>(by the way: a short word to ants "namespaces" (don´t
be confused with xml namespaces which will be also introduces in the future (1.6 or 1.7):
an &lt;antcall> creates a new space for property names. All properties from the caller
an &lt;antcall&gt; creates a new space for property names. All properties from the caller
are passed to the callee, but the callee can set its own properties without notice by the
caller.)</i></p>

@@ -158,9 +158,9 @@ their usage in buildfiles. Our goal is to search a file in path. And on this ste
path is simply a fileset (or more precise: a collection of filesets). So our usage
would be
<pre class="code">
&lt;find file="ant.jar" location="location.ant-jar">
&lt;fileset dir="${ant.home}" includes="**/*.jar"/>
&lt;/find>
&lt;find file="ant.jar" location="location.ant-jar"&gt;
&lt;fileset dir="${ant.home}" includes="**/*.jar"/&gt;
&lt;/find&gt;
</pre>
</p>

@@ -315,30 +315,30 @@ whithout being complex :-)</p>
environment we have to set that value for our own. And we use the &lt;junit&gt; task in fork-mode.
Therefore we have do modify our buildfile:
<pre class="code">
&lt;target name="junit" description="Runs the unit tests" depends="jar">
&lt;delete dir="${junit.out.dir.xml}" />
&lt;mkdir dir="${junit.out.dir.xml}" />
&lt;junit printsummary="yes" haltonfailure="no">
&lt;classpath refid="classpath.test"/>
<b>&lt;sysproperty key="ant.home" value="${ant.home}"/></b>
&lt;formatter type="xml"/>
&lt;batchtest fork="yes" todir="${junit.out.dir.xml}">
&lt;fileset dir="${src.dir}" includes="**/*Test.java"/>
&lt;/batchtest>
&lt;/junit>
&lt;/target>
&lt;target name="junit" description="Runs the unit tests" depends="jar"&gt;
&lt;delete dir="${junit.out.dir.xml}"/&gt;
&lt;mkdir dir="${junit.out.dir.xml}"/&gt;
&lt;junit printsummary="yes" haltonfailure="no"&gt;
&lt;classpath refid="classpath.test"/&gt;
<b>&lt;sysproperty key="ant.home" value="${ant.home}"/&gt;</b>
&lt;formatter type="xml"/&gt;
&lt;batchtest fork="yes" todir="${junit.out.dir.xml}"&gt;
&lt;fileset dir="${src.dir}" includes="**/*Test.java"/&gt;
&lt;/batchtest&gt;
&lt;/junit&gt;
&lt;/target&gt;
</pre>


<a name="path"/>
<h2>Using nested paths</h2>
<p>A task providing support for filesets is a very comfortable one. But there is another
possibility of bundling files: the &lt;path>. Fileset are easy if the files are all under
possibility of bundling files: the &lt;path&gt;. Fileset are easy if the files are all under
a common base directory. But if this is not the case you have a problem. Another disadvantage
is its speed: if you have only a few files in a huge directory structure, why not use a
&lt;filelist> instead? &lt;path>s combines these datatypes in that way that a path contains
&lt;filelist&gt; instead? &lt;path&gt;s combines these datatypes in that way that a path contains
other paths, filesets, dirsets and filelists. This is why <a href="http://ant-contrib.sourceforge.net/">
Ant-Contribs [4]</a> &lt;foreach> task is modified to support paths instead of filesets. So we want that,
Ant-Contribs [4]</a> &lt;foreach&gt; task is modified to support paths instead of filesets. So we want that,
too.</p>

<p>Changing from fileset to path support is very easy:</p>
@@ -354,15 +354,15 @@ too.</p>
paths.add(path);
}
<i><b>and build file from:</b></i>
&lt;find file="ant.jar" location="location.ant-jar">
&lt;fileset dir="${ant.home}" includes="**/*.jar"/>
&lt;/find>
&lt;find file="ant.jar" location="location.ant-jar"&gt;
&lt;fileset dir="${ant.home}" includes="**/*.jar"/&gt;
&lt;/find&gt;
<i><b>to:</b></i>
&lt;find file="ant.jar" location="location.ant-jar">
<b>&lt;path></b> *3
&lt;fileset dir="${ant.home}" includes="**/*.jar"/>
&lt;/path>
&lt;/find>
&lt;find file="ant.jar" location="location.ant-jar"&gt;
<b>&lt;path&gt;</b> *3
&lt;fileset dir="${ant.home}" includes="**/*.jar"/&gt;
&lt;/path&gt;
&lt;/find&gt;
</pre>
<p>On <b>*1</b> we rename only the vector. It´s just for better reading the source. On <b>*2</b>
we have to provide the right method: an add<i>Name</i>(<i>Type</i> t). Therefore replace the
@@ -414,13 +414,13 @@ And would it be good to get all of them? - It depends on ...<p>

<p>In this section we will extend that task to support returning a list of all files.
Lists as property values are not supported by Ant natively. So we have to see how other
tasks use lists. The most famous task using lists is Ant-Contribs &lt;foreach>. All list
tasks use lists. The most famous task using lists is Ant-Contribs &lt;foreach&gt;. All list
elements are concatenated and separated with a customizable separator (default ',').</p>

<p>So we do the following:</p>

<pre class="code">
&lt;find ... <b>delimiter=""</b>/> ... &lt;/find>
&lt;find ... <b>delimiter=""</b>/&gt; ... &lt;/find&gt;
</pre>

<p>If the delimiter is set we will return all found files as list with that delimiter.</p>
@@ -436,35 +436,35 @@ elements are concatenated and separated with a customizable separator (default '
<p>So we add as testcase:</p>
<pre class="code">
<b><i>in the buildfile:</i></b>
&lt;target name="test.init">
&lt;mkdir dir="test1/dir11/dir111"/> *1
&lt;mkdir dir="test1/dir11/dir112"/>
&lt;target name="test.init"&gt;
&lt;mkdir dir="test1/dir11/dir111"/&gt; *1
&lt;mkdir dir="test1/dir11/dir112"/&gt;
...
&lt;touch file="test1/dir11/dir111/test"/>
&lt;touch file="test1/dir11/dir111/not"/>
&lt;touch file="test1/dir11/dir111/test"/&gt;
&lt;touch file="test1/dir11/dir111/not"/&gt;
...
&lt;touch file="test1/dir13/dir131/not2"/>
&lt;touch file="test1/dir13/dir132/test"/>
&lt;touch file="test1/dir13/dir132/not"/>
&lt;touch file="test1/dir13/dir132/not2"/>
&lt;mkdir dir="test2"/>
&lt;copy todir="test2"> *2
&lt;fileset dir="test1"/>
&lt;/copy>
&lt;/target>
&lt;target name="testMultipleFiles" depends="use.init,<b>test.init</b>"> *3
&lt;find file="test" location="location.test" <b>delimiter=";"</b>>
&lt;path>
&lt;fileset dir="test1"/>
&lt;fileset dir="test2"/>
&lt;/path>
&lt;/find>
&lt;delete> *4
&lt;fileset dir="test1"/>
&lt;fileset dir="test2"/>
&lt;/delete>
&lt;/target>
&lt;touch file="test1/dir13/dir131/not2"/&gt;
&lt;touch file="test1/dir13/dir132/test"/&gt;
&lt;touch file="test1/dir13/dir132/not"/&gt;
&lt;touch file="test1/dir13/dir132/not2"/&gt;
&lt;mkdir dir="test2"/&gt;
&lt;copy todir="test2"&gt; *2
&lt;fileset dir="test1"/&gt;
&lt;/copy&gt;
&lt;/target&gt;
&lt;target name="testMultipleFiles" depends="use.init,<b>test.init</b>"&gt; *3
&lt;find file="test" location="location.test" <b>delimiter=";"</b>&gt;
&lt;path&gt;
&lt;fileset dir="test1"/&gt;
&lt;fileset dir="test2"/&gt;
&lt;/path&gt;
&lt;/find&gt;
&lt;delete&gt; *4
&lt;fileset dir="test1"/&gt;
&lt;fileset dir="test2"/&gt;
&lt;/delete&gt;
&lt;/target&gt;

<b><i>in the test class:</i></b>
public void testMultipleFiles() {
@@ -563,123 +563,123 @@ important :-) examples</li>
As a template we have:

<pre class="code">
&lt;html>
&lt;html&gt;

&lt;head>
&lt;meta http-equiv="Content-Language" content="en-us">
&lt;title> <b>Taskname</b> Task&lt;/title>
&lt;/head>
&lt;head&gt;
&lt;meta http-equiv="Content-Language" content="en-us"&gt;
&lt;title&gt; <b>Taskname</b> Task&lt;/title&gt;
&lt;/head&gt;

&lt;body>
&lt;body&gt;

&lt;h2>&lt;a name="<i>taskname</i>"><b>Taskname</b>&lt;/a>&lt;/h2>
&lt;h3>Description&lt;/h3>
&lt;p> <b>Describe the task.</b>&lt;/p>
&lt;h2&gt;&lt;a name="<i>taskname</i>"&gt;<b>Taskname</b>&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt; <b>Describe the task.</b>&lt;/p&gt;

&lt;h3>Parameters&lt;/h3>
&lt;table border="1" cellpadding="2" cellspacing="0">
&lt;tr>
&lt;td valign="top">&lt;b>Attribute&lt;/b>&lt;/td>
&lt;td valign="top">&lt;b>Description&lt;/b>&lt;/td>
&lt;td align="center" valign="top">&lt;b>Required&lt;/b>&lt;/td>
&lt;/tr>
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table border="1" cellpadding="2" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;&lt;b&gt;Attribute&lt;/b&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/td&gt;
&lt;td align="center" valign="top"&gt;&lt;b&gt;Required&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;

<b>do this html row for each attribute (including inherited attributes)</b>
&lt;tr>
&lt;td valign="top">classname&lt;/td>
&lt;td valign="top">the Java class to execute.&lt;/td>
&lt;td align="center" valign="top">Either jar or classname&lt;/td>
&lt;/tr>
&lt;tr&gt;
&lt;td valign="top"&gt;classname&lt;/td&gt;
&lt;td valign="top"&gt;the Java class to execute.&lt;/td&gt;
&lt;td align="center" valign="top"&gt;Either jar or classname&lt;/td&gt;
&lt;/tr&gt;

&lt;/table>
&lt;/table&gt;

&lt;h3>Parameters specified as nested elements&lt;/h3>
&lt;h3&gt;Parameters specified as nested elements&lt;/h3&gt;

<b>Describe each nested element (including inherited)</b>
&lt;h4><b>your nested element</b>&lt;/h4>
&lt;p> <b>description</b> &lt;/p>
&lt;p>&lt;em>since Ant 1.6&lt;/em>.&lt;/p>
&lt;h4&gt;your nested element</b>&lt;/h4&gt;
&lt;p&gt; <b>description</b> &lt;/p&gt;
&lt;p&gt;&lt;em&gt;since Ant 1.6&lt;/em&gt;.&lt;/p&gt;

&lt;h3>Examples&lt;/h3>
&lt;pre>
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;pre&gt;
<b>A code sample; don´t forget to escape the &lt; of the tags with &amp;lt;</b>
&lt;/pre>
&lt;/pre&gt;
<b>what should that example do?</b>

&lt;/body>
&lt;/html>
&lt;/body&gt;
&lt;/html&gt;
</pre>

<p>For our task we have <a href="CoreTasks/find.html">that [6]</a>:</p>
<pre class="code">
&lt;html>
&lt;head>
&lt;meta http-equiv="Content-Language" content="en-us">
&lt;title> Find Task&lt;/title>
&lt;/head>
&lt;body>
&lt;h2>&lt;a name="find">Find&lt;/a>&lt;/h2>
&lt;h3>Description&lt;/h3>
&lt;p>Searchs in a given path for a file and returns the absolute to it as property.
If delimiter is set this task returns all found locations.&lt;/p>
&lt;h3>Parameters&lt;/h3>
&lt;table border="1" cellpadding="2" cellspacing="0">
&lt;tr>
&lt;td valign="top">&lt;b>Attribute&lt;/b>&lt;/td>
&lt;td valign="top">&lt;b>Description&lt;/b>&lt;/td>
&lt;td align="center" valign="top">&lt;b>Required&lt;/b>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td valign="top">file&lt;/td>
&lt;td valign="top">The name of the file to search.&lt;/td>
&lt;td align="center" valign="top">yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td valign="top">location&lt;/td>
&lt;td valign="top">The name of the property where to store the location&lt;/td>
&lt;td align="center" valign="top">yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td valign="top">delimiter&lt;/td>
&lt;td valign="top">A delimiter to use when returning the list&lt;/td>
&lt;td align="center" valign="top">only if the list is required&lt;/td>
&lt;/tr>
&lt;/table>
&lt;h3>Parameters specified as nested elements&lt;/h3>
&lt;h4>path&lt;/h4>
&lt;p>The path where to search the file.&lt;/p>
&lt;h3>Examples&lt;/h3>
&lt;pre>
&lt;find file="ant.jar" location="loc">
&lt;path>
&lt;fileset dir="${ant.home}"/>
&lt;path>
&lt;/find>
&lt;/pre>
Searches in Ants home directory for a file &lt;i>ant.jar&lt;/i> and stores its location in
property &lt;i>loc&lt;/i> (should be ANT_HOME/bin/ant.jar).
&lt;pre>
&lt;find file="ant.jar" location="loc" delimiter=";">
&lt;path>
&lt;fileset dir="C:/"/>
&lt;path>
&lt;/find>
&lt;echo>ant.jar found in: ${loc}&lt;/echo>
&lt;/pre>
Searches in Windows C: drive for all &lt;i>ant.jar&lt;/i> and stores their locations in
property &lt;i>loc&lt;/i> delimited with &lt;i>';'&lt;/i>. (should need a long time :-)
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Language" content="en-us"&gt;
&lt;title&gt; Find Task&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h2&gt;&lt;a name="find"&gt;Find&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;Searchs in a given path for a file and returns the absolute to it as property.
If delimiter is set this task returns all found locations.&lt;/p&gt;
&lt;h3&gt;Parameters&lt;/h3&gt;
&lt;table border="1" cellpadding="2" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;&lt;b&gt;Attribute&lt;/b&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;b&gt;Description&lt;/b&gt;&lt;/td&gt;
&lt;td align="center" valign="top"&gt;&lt;b&gt;Required&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;file&lt;/td&gt;
&lt;td valign="top"&gt;The name of the file to search.&lt;/td&gt;
&lt;td align="center" valign="top"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;location&lt;/td&gt;
&lt;td valign="top"&gt;The name of the property where to store the location&lt;/td&gt;
&lt;td align="center" valign="top"&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;delimiter&lt;/td&gt;
&lt;td valign="top"&gt;A delimiter to use when returning the list&lt;/td&gt;
&lt;td align="center" valign="top"&gt;only if the list is required&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h3&gt;Parameters specified as nested elements&lt;/h3&gt;
&lt;h4&gt;path&lt;/h4&gt;
&lt;p&gt;The path where to search the file.&lt;/p&gt;
&lt;h3&gt;Examples&lt;/h3&gt;
&lt;pre&gt;
&lt;find file="ant.jar" location="loc"&gt;
&lt;path&gt;
&lt;fileset dir="${ant.home}"/&gt;
&lt;path&gt;
&lt;/find&gt;
&lt;/pre&gt;
Searches in Ants home directory for a file &lt;i&gt;ant.jar&lt;/i&gt; and stores its location in
property &lt;i&gt;loc&lt;/i&gt; (should be ANT_HOME/bin/ant.jar).
&lt;pre&gt;
&lt;find file="ant.jar" location="loc" delimiter=";"&gt;
&lt;path&gt;
&lt;fileset dir="C:/"/&gt;
&lt;path&gt;
&lt;/find&gt;
&lt;echo&gt;ant.jar found in: ${loc}&lt;/echo&gt;
&lt;/pre&gt;
Searches in Windows C: drive for all &lt;i&gt;ant.jar&lt;/i&gt; and stores their locations in
property &lt;i&gt;loc&lt;/i&gt; delimited with &lt;i&gt;';'&lt;/i&gt;. (should need a long time :-)
After that it prints out the result (e.g. C:/ant-1.5.4/bin/ant.jar;C:/ant-1.6/bin/ant.jar).

&lt;/body>
&lt;/html>
&lt;/body&gt;
&lt;/html&gt;
</pre>


@@ -755,9 +755,9 @@ on <b>//4</b>.</p>
are any tests failing on our machine. (We can ignore these failing tests on later
steps; windows syntax used here- translate to xNIX if needed):
<pre class="output">
ANTHOME> build // 1
ANTHOME> set ANT_HOME=%CD%\dist // 2
ANTHOME> ant test -Dtest.haltonfailure=false // 3
ANTHOME&gt; build // 1
ANTHOME&gt; set ANT_HOME=%CD%\dist // 2
ANTHOME&gt; ant test -Dtest.haltonfailure=false // 3
</pre>

First we have to build our Ant distribution (<b>//1</b>). On <b>//2</b> we set the ANT_HOME
@@ -782,14 +782,14 @@ necessary and saves a lot of work if you modify existing source :-)</i>.
<li>in FindTest.java change the line <tt>configureProject("build.xml");</tt> to
<tt>configureProject("src/etc/testcases/taskdefs/find.xml");</tt> </li>
<li>move the find.html to ANTHOME/docs/manual/CoreTasks/find.html </li>
<li>add a <tt>&lt;a href="CoreTasks/find.html">Find&lt;/a>&lt;br></tt>
<li>add a <tt>&lt;a href="CoreTasks/find.html"&gt;Find&lt;/a&gt;&lt;br&gt;</tt>
in the ANTHOME/docs/manual/coretasklist.html </li>
</ul>

Now our modifications are done and we will retest it:
<pre class="output">
ANTHOME> build
ANTHOME> ant run-single-test // 1
ANTHOME&gt; build
ANTHOME&gt; ant run-single-test // 1
-Dtestcase=org.apache.tools.ant.taskdefs.FindTest // 2
-Dtest.haltonfailure=false
</pre>
@@ -799,15 +799,15 @@ failures of our own test (<b>//1 + 2</b>).</p>

<p>And ... oh, all tests fail: <i>Ant could not find the task or a class this task relies upon.</i></p>

<p>Ok: in the earlier steps we told Ant to use the Find class for the &lt;find> task (remember the
&lt;taskdef> statement in the "use.init" target). But now we want to introduce that task as
<p>Ok: in the earlier steps we told Ant to use the Find class for the &lt;find&gt; task (remember the
&lt;taskdef&gt; statement in the "use.init" target). But now we want to introduce that task as
a core task. And nobody wants to taskdef the javac, echo, ... So what to do? The answer is the
src/main/.../taskdefs/default.properties. Here is the mapping between taskname and implementing
class done. So we add a <tt>find=org.apache.tools.ant.taskdefs.Find</tt> as the last core
task (just before the <tt># optional tasks</tt> line). Now a second try:
<pre class="output">
ANTHOME> build // 1
ANTHOME> ant run-single-test
ANTHOME&gt; build // 1
ANTHOME&gt; ant run-single-test
-Dtestcase=org.apache.tools.ant.taskdefs.FindTest
-Dtest.haltonfailure=false
</pre>
@@ -816,7 +816,7 @@ We have to rebuild (<b>//1</b>) Ant because the test look in the %ANT_HOME%\lib\
source path. So we have to rebuild that jar. But now all tests pass and we check whether our class
breaks some other tests.
<pre class="output">
ANTHOME> ant test -Dtest.haltonfailure=false
ANTHOME&gt; ant test -Dtest.haltonfailure=false
</pre>
Because there are a lot of tests this step requires a little bit of time. So use the <i>run-single-test</i>
during development and do the <i>test</i> only at the end (maybe sometimes during development too).
@@ -863,7 +863,7 @@ directory (this feature was added with Ant 1.6).</p>

<p>So we will run the tests with
<pre class="output">
ANTHOME> ant -f check.xml checkstyle htmlreport
ANTHOME&gt; ant -f check.xml checkstyle htmlreport
</pre>
I prefer the HTML report because there are lots of messages and we can navigate faster.
Open the ANTHOME/build/reports/checkstyle/html/index.html and navigate to the Find.java. Now we
@@ -900,7 +900,7 @@ entry. For both we need some information:</p>
<tr>
<th>body</th>
<td><i>more details about the path</i></td>
<td>This new task looks inside a nested &lt;path/> for occurrences of a file and stores
<td>This new task looks inside a nested &lt;path/&gt; for occurrences of a file and stores
all locations as a property. See the included manual for details.</td>
</tr>
<tr>


+ 145
- 145
docs/manual/tutorial-writing-tasks.html View File

@@ -44,52 +44,52 @@ create a text file names <i>build.xml</i>. What should Ant do for us?
</ul>
So the buildfile contains three targets.
<pre class="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?>
&lt;project name="MyTask" basedir="." default="jar">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;project name="MyTask" basedir="." default="jar"&gt;

&lt;target name="clean" description="Delete all generated files">
&lt;delete dir="classes"/>
&lt;delete file="MyTasks.jar"/>
&lt;/target>
&lt;target name="clean" description="Delete all generated files"&gt;
&lt;delete dir="classes"/&gt;
&lt;delete file="MyTasks.jar"/&gt;
&lt;/target&gt;

&lt;target name="compile" description="Compiles the Task">
&lt;javac srcdir="src" destdir="classes"/>
&lt;/target>
&lt;target name="compile" description="Compiles the Task"&gt;
&lt;javac srcdir="src" destdir="classes"/&gt;
&lt;/target&gt;

&lt;target name="jar" description="JARs the Task">
&lt;jar destfile="MyTask.jar" basedir="classes"/>
&lt;/target>
&lt;target name="jar" description="JARs the Task"&gt;
&lt;jar destfile="MyTask.jar" basedir="classes"/&gt;
&lt;/target&gt;

&lt;/project>
&lt;/project&gt;
</pre>

This buildfile uses often the same value (src, classes, MyTask.jar), so we should rewrite that
using &lt;property>s. On second there are some handicaps: &lt;javac> requires that the destination
using &lt;property&gt;s. On second there are some handicaps: &lt;javac&gt; requires that the destination
directory exists; a call of "clean" with a non existing classes directory will fail; "jar" requires
the execution of some steps bofore. So the refactored code is:

<pre class="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?>
&lt;project name="MyTask" basedir="." default="jar">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;project name="MyTask" basedir="." default="jar"&gt;

<b>&lt;property name="src.dir" value="src"/></b>
<b>&lt;property name="classes.dir" value="classes"/></b>
<b>&lt;property name="src.dir" value="src"/&gt;</b>
<b>&lt;property name="classes.dir" value="classes"/&gt;</b>

&lt;target name="clean" description="Delete all generated files">
&lt;delete dir="<b>${classes.dir}</b>" <b>failonerror="false"</b>/>
&lt;delete file="<b>${ant.project.name}.jar</b>"/>
&lt;/target>
&lt;target name="clean" description="Delete all generated files"&gt;
&lt;delete dir="<b>${classes.dir}</b>" <b>failonerror="false"</b>/&gt;
&lt;delete file="<b>${ant.project.name}.jar</b>"/&gt;
&lt;/target&gt;

&lt;target name="compile" description="Compiles the Task">
<b>&lt;mkdir dir="${classes.dir}"/></b>
&lt;javac srcdir="<b>${src.dir}</b>" destdir="${classes.dir}"/>
&lt;/target>
&lt;target name="compile" description="Compiles the Task"&gt;
<b>&lt;mkdir dir="${classes.dir}"/&gt;</b>
&lt;javac srcdir="<b>${src.dir}</b>" destdir="${classes.dir}"/&gt;
&lt;/target&gt;

&lt;target name="jar" description="JARs the Task" <b>depends="compile"</b>>
&lt;jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/>
&lt;/target>
&lt;target name="jar" description="JARs the Task" <b>depends="compile"</b>&gt;
&lt;jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/&gt;
&lt;/target&gt;

&lt;/project>
&lt;/project&gt;
</pre>
<i>ant.project.name</i> is one of the
<a href="http://ant.apache.org/manual/using.html#built-in-props" target="_blank">
@@ -118,19 +118,19 @@ its <i>depends</i>-clause the "compile" is executed before).
<p>But after creating the jar we want to use our new Task. Therefore we need a
new target "use". Before we can use our new task we have to declare it with
<a href="http://ant.apache.org/manual/CoreTasks/taskdef.html" target="_blank">
&lt;taskdef> [2]</a>. And for easier process we change the default clause:
&lt;taskdef&gt; [2]</a>. And for easier process we change the default clause:
<pre class="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?>
&lt;project name="MyTask" basedir="." default="<b>use</b>">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;project name="MyTask" basedir="." default="<b>use</b>"&gt;

...

<b>&lt;target name="use" description="Use the Task" depends="jar">
&lt;taskdef name="helloworld" classname="HelloWorld" classpath="${ant.project.name}.jar"/>
&lt;helloworld/>
&lt;/target></b>
<b>&lt;target name="use" description="Use the Task" depends="jar"&gt;
&lt;taskdef name="helloworld" classname="HelloWorld" classpath="${ant.project.name}.jar"/&gt;
&lt;helloworld/&gt;
&lt;/target&gt;</b>

&lt;/project>
&lt;/project&gt;
</pre>

Important is the <i>classpath</i>-attribute. Ant searches in its /lib directory for
@@ -226,8 +226,8 @@ use:
<a name="attributes">
<h2>Attributes</h2>
<p>Now we want to specify the text of our message (it seems that we are
rewriting the &lt;echo/> task :-). First we well do that with an attribute.
It is very easy - for each attribute provide a <tt>public void set&lt;attributename>(&lt;type>
rewriting the &lt;echo/&gt; task :-). First we well do that with an attribute.
It is very easy - for each attribute provide a <tt>public void set&lt;attributename&gt;(&lt;type&gt;
newValue)</tt> method and Ant will do the rest via reflection.</p>
<pre class="code">
import org.apache.tools.ant.Task;
@@ -257,12 +257,12 @@ the log() method can't handle a <i>null</i> value as parameter and throws a Null

<p>After that we have to modify our buildfile:
<pre class="code">
&lt;target name="use" description="Use the Task" depends="jar">
&lt;target name="use" description="Use the Task" depends="jar"&gt;
&lt;taskdef name="helloworld"
classname="HelloWorld"
classpath="${ant.project.name}.jar"/>
&lt;helloworld <b>message="Hello World"</b>/>
&lt;/target>
classpath="${ant.project.name}.jar"/&gt;
&lt;helloworld <b>message="Hello World"</b>/&gt;
&lt;/target&gt;
</pre>
That's all.</p>

@@ -275,13 +275,13 @@ arguments of the set-method:<ul>
<a href="http://ant.apache.org/manual/develop.html#set-magic">Manual
'Writing Your Own Task' [3]</a>)</li>
</ul>
Before calling the set-method all properties are resolved. So a <tt>&lt;helloworld message="${msg}"/></tt>
Before calling the set-method all properties are resolved. So a <tt>&lt;helloworld message="${msg}"/&gt;</tt>
would not set the message string to "${msg}" if there is a property "msg" with a set value.


<a name="NestedText"></a>
<h2>Nested Text</h2>
<p>Maybe you have used the &lt;echo> task in a way like <tt>&lt;echo>Hello World&lt;/echo></tt>.
<p>Maybe you have used the &lt;echo&gt; task in a way like <tt>&lt;echo&gt;Hello World&lt;/echo&gt;</tt>.
For that you have to provide a <tt>public void addText(String text)</tt> method.
<pre class="code">
...
@@ -305,7 +305,7 @@ the <a href="http://ant.apache.org/manual/develop.html#nested-elements">Manual [
We use the first way of the three described ways. There are several steps for that:<ol>
<li>We create a class for collecting all the infos the nested element should contain.
This class is created by the same rules for attributes and nested elements
as for the task (set&lt;attributename>() methods). </li>
as for the task (set&lt;attributename&gt;() methods). </li>
<li>The task holds multiple instances of this class in a list.</li>
<li>A factory method instantiates an object, saves the reference in the list
and returns it to Ant Core.</li>
@@ -346,10 +346,10 @@ The mapping XML-name : classname is defined in the factory method:
<tt>public <i>classname</i> create<i>XML-name</i>()</tt>. Therefore we write in
the buildfile
<pre class="code">
&lt;helloworld>
&lt;message msg="Nested Element 1"/>
&lt;message msg="Nested Element 2"/>
&lt;/helloworld>
&lt;helloworld&gt;
&lt;message msg="Nested Element 1"/&gt;
&lt;message msg="Nested Element 2"/&gt;
&lt;/helloworld&gt;
</pre>


@@ -357,76 +357,76 @@ the buildfile
<h2>Our task in a little more complex version</h2>
<p>For recapitulation now a little refactored buildfile:
<pre class="code">
&lt;?xml version="1.0" encoding="ISO-8859-1"?>
&lt;project name="MyTask" basedir="." default="use">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;project name="MyTask" basedir="." default="use"&gt;

&lt;property name="src.dir" value="src"/>
&lt;property name="classes.dir" value="classes"/>
&lt;property name="src.dir" value="src"/&gt;
&lt;property name="classes.dir" value="classes"/&gt;

&lt;target name="clean" description="Delete all generated files">
&lt;delete dir="${classes.dir}" failonerror="false"/>
&lt;delete file="${ant.project.name}.jar"/>
&lt;/target>
&lt;target name="clean" description="Delete all generated files"&gt;
&lt;delete dir="${classes.dir}" failonerror="false"/&gt;
&lt;delete file="${ant.project.name}.jar"/&gt;
&lt;/target&gt;

&lt;target name="compile" description="Compiles the Task">
&lt;mkdir dir="${classes.dir}"/>
&lt;javac srcdir="${src.dir}" destdir="${classes.dir}"/>
&lt;/target>
&lt;target name="compile" description="Compiles the Task"&gt;
&lt;mkdir dir="${classes.dir}"/&gt;
&lt;javac srcdir="${src.dir}" destdir="${classes.dir}"/&gt;
&lt;/target&gt;

&lt;target name="jar" description="JARs the Task" depends="compile">
&lt;jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/>
&lt;/target>
&lt;target name="jar" description="JARs the Task" depends="compile"&gt;
&lt;jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/&gt;
&lt;/target&gt;


&lt;target name="use.init"
description="Taskdef the HelloWorld-Task"
depends="jar">
depends="jar"&gt;
&lt;taskdef name="helloworld"
classname="HelloWorld"
classpath="${ant.project.name}.jar"/>
&lt;/target>
classpath="${ant.project.name}.jar"/&gt;
&lt;/target&gt;


&lt;target name="use.without"
description="Use without any"
depends="use.init">
&lt;helloworld/>
&lt;/target>
depends="use.init"&gt;
&lt;helloworld/&gt;
&lt;/target&gt;

&lt;target name="use.message"
description="Use with attribute 'message'"
depends="use.init">
&lt;helloworld message="attribute-text"/>
&lt;/target>
depends="use.init"&gt;
&lt;helloworld message="attribute-text"/&gt;
&lt;/target&gt;

&lt;target name="use.fail"
description="Use with attribute 'fail'"
depends="use.init">
&lt;helloworld fail="true"/>
&lt;/target>
depends="use.init"&gt;
&lt;helloworld fail="true"/&gt;
&lt;/target&gt;

&lt;target name="use.nestedText"
description="Use with nested text"
depends="use.init">
&lt;helloworld>nested-text&lt;/helloworld>
&lt;/target>
depends="use.init"&gt;
&lt;helloworld&gt;nested-text&lt;/helloworld&gt;
&lt;/target&gt;

&lt;target name="use.nestedElement"
description="Use with nested 'message'"
depends="use.init">
&lt;helloworld>
&lt;message msg="Nested Element 1"/>
&lt;message msg="Nested Element 2"/>
&lt;/helloworld>
&lt;/target>
depends="use.init"&gt;
&lt;helloworld&gt;
&lt;message msg="Nested Element 1"/&gt;
&lt;message msg="Nested Element 2"/&gt;
&lt;/helloworld&gt;
&lt;/target&gt;


&lt;target name="use"
description="Try all (w/out use.fail)"
depends="use.without,use.message,use.nestedText,use.nestedElement"
/>
/&gt;

&lt;/project>
&lt;/project&gt;
</pre>

And the code of the task:
@@ -505,7 +505,7 @@ public class HelloWorld extends Task {

And it works:
<pre class="output">
C:\tmp\anttests\MyFirstTask>ant
C:\tmp\anttests\MyFirstTask&gt;ant
Buildfile: build.xml

compile:
@@ -537,7 +537,7 @@ use:

BUILD SUCCESSFUL
Total time: 3 seconds
C:\tmp\anttests\MyFirstTask>ant use.fail
C:\tmp\anttests\MyFirstTask&gt;ant use.fail
Buildfile: build.xml

compile:
@@ -552,7 +552,7 @@ BUILD FAILED
C:\tmp\anttests\MyFirstTask\build.xml:36: Fail requested.

Total time: 1 second
C:\tmp\anttests\MyFirstTask>
C:\tmp\anttests\MyFirstTask&gt;
</pre>
Next step: test ...

@@ -580,66 +580,66 @@ target "test-jar" or you can download a nightly build from
<a href="http://gump.covalent.net/jars/latest/ant/ant-testutil.jar">
http://gump.covalent.net/jars/latest/ant/ant-testutil.jar [5]</a>.</p>

<p>For executing the test and creating a report we need the optional tasks &lt;junit>
and &lt;junitreport>. So we add to the buildfile:
<p>For executing the test and creating a report we need the optional tasks &lt;junit&gt;
and &lt;junitreport&gt;. So we add to the buildfile:
<pre class="code">
...
<font color="#9F9F9F">&lt;project name="MyTask" basedir="." </font>default="test"<font color="#9F9F9F">&gt;</font>
...
&lt;property name="ant.test.lib" value="ant-testutil.jar"/>
&lt;property name="report.dir" value="report"/>
&lt;property name="junit.out.dir.xml" value="${report.dir}/junit/xml"/>
&lt;property name="junit.out.dir.html" value="${report.dir}/junit/html"/>
&lt;path id="classpath.run">
&lt;path path="${java.class.path}"/>
&lt;path location="${ant.project.name}.jar"/>
&lt;/path>
&lt;path id="classpath.test">
&lt;path refid="classpath.run"/>
&lt;path location="${ant.test.lib}"/>
&lt;/path>
&lt;target name="clean" description="Delete all generated files">
&lt;delete failonerror="false" includeEmptyDirs="true">
&lt;fileset dir="." includes="${ant.project.name}.jar"/>
&lt;fileset dir="${classes.dir}"/>
&lt;fileset dir="${report.dir}"/>
&lt;/delete>
&lt;/target>
<font color="#9F9F9F">&lt;target name="compile" description="Compiles the Task">
&lt;mkdir dir="${classes.dir}"/>
&lt;javac srcdir="${src.dir}" destdir="${classes.dir}" </font>classpath="${ant.test.lib}"<font color="#9F9F9F">/>
&lt;/target></font>
&lt;property name="ant.test.lib" value="ant-testutil.jar"/&gt;
&lt;property name="report.dir" value="report"/&gt;
&lt;property name="junit.out.dir.xml" value="${report.dir}/junit/xml"/&gt;
&lt;property name="junit.out.dir.html" value="${report.dir}/junit/html"/&gt;
&lt;path id="classpath.run"&gt;
&lt;path path="${java.class.path}"/&gt;
&lt;path location="${ant.project.name}.jar"/&gt;
&lt;/path&gt;
&lt;path id="classpath.test"&gt;
&lt;path refid="classpath.run"/&gt;
&lt;path location="${ant.test.lib}"/&gt;
&lt;/path&gt;
&lt;target name="clean" description="Delete all generated files"&gt;
&lt;delete failonerror="false" includeEmptyDirs="true"&gt;
&lt;fileset dir="." includes="${ant.project.name}.jar"/&gt;
&lt;fileset dir="${classes.dir}"/&gt;
&lt;fileset dir="${report.dir}"/&gt;
&lt;/delete&gt;
&lt;/target&gt;
<font color="#9F9F9F">&lt;target name="compile" description="Compiles the Task"&gt;
&lt;mkdir dir="${classes.dir}"/&gt;
&lt;javac srcdir="${src.dir}" destdir="${classes.dir}" </font>classpath="${ant.test.lib}"<font color="#9F9F9F">/&gt;
&lt;/target&gt;</font>
...
&lt;target name="junit" description="Runs the unit tests" depends="jar">
&lt;delete dir="${junit.out.dir.xml}" />
&lt;mkdir dir="${junit.out.dir.xml}" />
&lt;junit printsummary="yes" haltonfailure="no">
&lt;classpath refid="classpath.test"/>
&lt;formatter type="xml"/>
&lt;batchtest fork="yes" todir="${junit.out.dir.xml}">
&lt;fileset dir="${src.dir}" includes="**/*Test.java"/>
&lt;/batchtest>
&lt;/junit>
&lt;/target>
&lt;target name="junitreport" description="Create a report for the rest result">
&lt;mkdir dir="${junit.out.dir.html}" />
&lt;junitreport todir="${junit.out.dir.html}">
&lt;fileset dir="${junit.out.dir.xml}">
&lt;include name="*.xml"/>
&lt;/fileset>
&lt;report format="frames" todir="${junit.out.dir.html}"/>
&lt;/junitreport>
&lt;/target>
&lt;target name="junit" description="Runs the unit tests" depends="jar"&gt;
&lt;delete dir="${junit.out.dir.xml}"/&gt;
&lt;mkdir dir="${junit.out.dir.xml}"/&gt;
&lt;junit printsummary="yes" haltonfailure="no"&gt;
&lt;classpath refid="classpath.test"/&gt;
&lt;formatter type="xml"/&gt;
&lt;batchtest fork="yes" todir="${junit.out.dir.xml}"&gt;
&lt;fileset dir="${src.dir}" includes="**/*Test.java"/&gt;
&lt;/batchtest&gt;
&lt;/junit&gt;
&lt;/target&gt;
&lt;target name="junitreport" description="Create a report for the rest result"&gt;
&lt;mkdir dir="${junit.out.dir.html}"/&gt;
&lt;junitreport todir="${junit.out.dir.html}"&gt;
&lt;fileset dir="${junit.out.dir.xml}"&gt;
&lt;include name="*.xml"/&gt;
&lt;/fileset&gt;
&lt;report format="frames" todir="${junit.out.dir.html}"/&gt;
&lt;/junitreport&gt;
&lt;/target&gt;

&lt;target name="test"
depends="junit,junitreport"
description="Runs unit tests and creates a report"
/>
/&gt;
...
</pre></p>

@@ -693,7 +693,7 @@ public class HelloWorldTest extends BuildFileTest {
<p>When starting <tt>ant</tt> we'll get a short message to STDOUT and
a nice HTML-report.
<pre class="output">
C:\tmp\anttests\MyFirstTask>ant
C:\tmp\anttests\MyFirstTask&gt;ant
Buildfile: build.xml

compile:
@@ -719,7 +719,7 @@ test:

BUILD SUCCESSFUL
Total time: 7 seconds
C:\tmp\anttests\MyFirstTask>
C:\tmp\anttests\MyFirstTask&gt;
</pre></p>




Loading…
Cancel
Save