Submitted by: Larry Shatzer git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277037 13f79535-47bb-0310-9956-ffa450edef68master
@@ -213,9 +213,9 @@ how to generate a HTML report from the XML report.</p> | |||
<revision>1.3</revision> | |||
<prevrevision>1.2</prevrevision> | |||
</file> | |||
<msg><![CDATA[Use URLs directly rather than go via a FIle. | |||
<msg><![CDATA[Use URLs directly rather than go via a File. | |||
This allows temp[lates to be stored inside jar]]></msg> | |||
This allows templates to be stored inside jar]]></msg> | |||
</entry> | |||
</changelog> | |||
</pre> | |||
@@ -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> | |||
@@ -648,34 +648,34 @@ This graphic shows the dependencies: | |||
<TABLE> | |||
<TR> | |||
<TD bgcolor="#C0C0C0"> </TD> | |||
<TD><PRE><filterchain> | |||
<TD><PRE><filterchain> | |||
<headfilter lines="2"/> | |||
</filterchain></PRE></TD> | |||
</filterchain></PRE></TD> | |||
</TR> | |||
<TR> | |||
<TD bgcolor="#FF00FF"> </TD> | |||
<TD><PRE><filterchain> | |||
<TD><PRE><filterchain> | |||
<tailfilter lines="-1" skip="2"/> | |||
</filterchain></PRE></TD> | |||
</filterchain></PRE></TD> | |||
</TR> | |||
<TR> | |||
<TD bgcolor="#008000"> </TD> | |||
<TD><PRE><filterchain> | |||
<TD><PRE><filterchain> | |||
<headfilter lines="-1" skip="2"/> | |||
</filterchain></PRE></TD> | |||
</filterchain></PRE></TD> | |||
</TR> | |||
<TR> | |||
<TD bgcolor="#0000FF"> </TD> | |||
<TD><PRE><filterchain> | |||
<headfilter lines="-1" skip="2"/> | |||
<tailfilter lines="-1" skip="2"/> | |||
</filterchain></PRE></TD> | |||
<TD><PRE><filterchain> | |||
<headfilter lines="-1" skip="2"/> | |||
<tailfilter lines="-1" skip="2"/> | |||
</filterchain></PRE></TD> | |||
</TR> | |||
<TR> | |||
<TD bgcolor="#00FF00"> </TD> | |||
<TD><PRE><filterchain> | |||
<TD><PRE><filterchain> | |||
<tailfilter lines="2"/> | |||
</filterchain></PRE></TD> | |||
</filterchain></PRE></TD> | |||
</TR> | |||
</TABLE> | |||
</TD> | |||
@@ -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:<<font color=blue>FTTTFTTTF...</font>> but was:<TTTTTTTTT...> | |||
[junit] expected:<<font color=blue>FTTTFTTTF...</font>> but was:<TTTTTTTTT...> | |||
[junit] junit.framework.ComparisonFailure: Error for files: .;copy.filterset.filtered;tar/gz/asf-logo.gif.tar.gz | |||
[junit] expected:<FTTTFTTTF...> but was:<TTTTTTTTT...> | |||
[junit] expected:<FTTTFTTTF...> but was:<TTTTTTTTT...> | |||
[junit] at junit.framework.Assert.assertEquals(Assert.java:81) | |||
[junit] at org.apache.tools.ant.types.selectors.BaseSelectorTest.performTest(BaseSelectorTest.java:194) | |||
</pre></p> | |||
@@ -613,7 +613,7 @@ | |||
<blockquote><pre> | |||
<fileset dir="${src}"> | |||
<type type="dir"/> | |||
<type type="dir"/> | |||
</fileset> | |||
</pre></blockquote> | |||
@@ -622,12 +622,12 @@ | |||
directory, but avoid selecting empty directories, use: | |||
<blockquote><pre> | |||
<fileset dir="${src}"> | |||
<and> | |||
<present targetdir="template"/> | |||
<type type="file"/> | |||
</and> | |||
</fileset> | |||
<fileset dir="${src}"> | |||
<and> | |||
<present targetdir="template"/> | |||
<type type="file"/> | |||
</and> | |||
</fileset> | |||
</pre></blockquote> | |||
@@ -816,62 +816,62 @@ | |||
<p>Here are some examples of how to use the Modified Selector:</p> | |||
<blockquote><pre> | |||
<copy todir="dest"> | |||
<fileset dir="src"> | |||
<modified/> | |||
</fileset> | |||
</copy | |||
<copy todir="dest"> | |||
<fileset dir="src"> | |||
<modified/> | |||
</fileset> | |||
</copy> | |||
</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> | |||
<copy todir="dest"> | |||
<fileset dir="src"> | |||
<copy todir="dest"> | |||
<fileset dir="src"> | |||
<modified update="true" | |||
seldirs="true" | |||
cache="propertyfile" | |||
algorithm="digest" | |||
comparator="equal"> | |||
<param name="cache.cachefile" value="cache.properties"/> | |||
<param name="algorithm.algorithm" value="MD5"/> | |||
</modified> | |||
</fileset> | |||
</copy> | |||
comparator="equal"> | |||
<param name="cache.cachefile" value="cache.properties"/> | |||
<param name="algorithm.algorithm" value="MD5"/> | |||
</modified> | |||
</fileset> | |||
</copy> | |||
</pre></blockquote> | |||
<p>This is the same example rewritten as CoreSelector with setting the all the values | |||
(same as defaults are).</p> | |||
<blockquote><pre> | |||
<copy todir="dest"> | |||
<fileset dir="src"> | |||
<custom class="org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector"> | |||
<param name="update" value="true"/> | |||
<param name="seldirs" value="true"/> | |||
<param name="cache" value="propertyfile"/> | |||
<param name="algorithm" value="digest"/> | |||
<param name="comparator" value="equal"/> | |||
<param name="cache.cachefile" value="cache.properties"/> | |||
<param name="algorithm.algorithm" value="MD5"/> | |||
</custom> | |||
</fileset> | |||
</copy> | |||
<copy todir="dest"> | |||
<fileset dir="src"> | |||
<custom class="org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector"> | |||
<param name="update" value="true"/> | |||
<param name="seldirs" value="true"/> | |||
<param name="cache" value="propertyfile"/> | |||
<param name="algorithm" value="digest"/> | |||
<param name="comparator" value="equal"/> | |||
<param name="cache.cachefile" value="cache.properties"/> | |||
<param name="algorithm.algorithm" value="MD5"/> | |||
</custom> | |||
</fileset> | |||
</copy> | |||
</pre></blockquote> | |||
<p>And this is the same rewritten as CustomSelector.</p> | |||
<blockquote><pre> | |||
<target name="generate-and-upload-site"> | |||
<echo> generate the site using forrest </echo> | |||
<antcall target="site"/> | |||
<echo> upload the changed file </echo> | |||
<ftp server="${ftp.server}" userid="${ftp.user}" password="${ftp.pwd}"> | |||
<fileset dir="htdocs/manual"> | |||
<modified/> | |||
</fileset> | |||
</ftp> | |||
</target> | |||
<target name="generate-and-upload-site"> | |||
<echo> generate the site using forrest </echo> | |||
<antcall target="site"/> | |||
<echo> upload the changed file </echo> | |||
<ftp server="${ftp.server}" userid="${ftp.user}" password="${ftp.pwd}"> | |||
<fileset dir="htdocs/manual"> | |||
<modified/> | |||
</fileset> | |||
</ftp> | |||
</target> | |||
</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/"> | |||
@@ -123,7 +123,7 @@ line separator. So with input | |||
<blockquote> | |||
<pre> | |||
<html> <body> | |||
<html> <body> | |||
<<TAB>><h1> T E S T </h1> <<TAB>> | |||
<<TAB>> </body></html> | |||
</pre></blockquote> | |||
@@ -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" * > ..\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, | |||
@@ -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"> | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<project name="<b>FindTask</b>" basedir="." default="test"> | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<project name="<b>FindTask</b>" basedir="." default="test"> | |||
... | |||
<target name="use.init" description="Taskdef´ the <b>Find</b>-Task" depends="jar"> | |||
<taskdef name="<b>find</b>" classname="<b>Find</b>" classpath="${ant.project.name}.jar"/> | |||
</target> | |||
<target name="use.init" description="Taskdef´ the <b>Find</b>-Task" depends="jar"> | |||
<taskdef name="<b>find</b>" classname="<b>Find</b>" classpath="${ant.project.name}.jar"/> | |||
</target> | |||
<b><!-- the other use.* targets are deleted --></b> | |||
... | |||
</project> | |||
</project> | |||
</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"> | |||
<find property="test" value="test-value"/> | |||
<find print="test"/> | |||
<find property="test" value="test-value"/> | |||
<find print="test"/> | |||
</pre> | |||
ok, can be rewritten with the core tasks | |||
<pre class="code"> | |||
<property name="test" value="test-value"/> | |||
<echo message="${test}"/> | |||
<property name="test" value="test-value"/> | |||
<echo message="${test}"/> | |||
</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 <antcall> creates a new space for property names. All properties from the caller | |||
an <antcall> 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"> | |||
<find file="ant.jar" location="location.ant-jar"> | |||
<fileset dir="${ant.home}" includes="**/*.jar"/> | |||
</find> | |||
<find file="ant.jar" location="location.ant-jar"> | |||
<fileset dir="${ant.home}" includes="**/*.jar"/> | |||
</find> | |||
</pre> | |||
</p> | |||
@@ -315,30 +315,30 @@ whithout being complex :-)</p> | |||
environment we have to set that value for our own. And we use the <junit> task in fork-mode. | |||
Therefore we have do modify our buildfile: | |||
<pre class="code"> | |||
<target name="junit" description="Runs the unit tests" depends="jar"> | |||
<delete dir="${junit.out.dir.xml}" /> | |||
<mkdir dir="${junit.out.dir.xml}" /> | |||
<junit printsummary="yes" haltonfailure="no"> | |||
<classpath refid="classpath.test"/> | |||
<b><sysproperty key="ant.home" value="${ant.home}"/></b> | |||
<formatter type="xml"/> | |||
<batchtest fork="yes" todir="${junit.out.dir.xml}"> | |||
<fileset dir="${src.dir}" includes="**/*Test.java"/> | |||
</batchtest> | |||
</junit> | |||
</target> | |||
<target name="junit" description="Runs the unit tests" depends="jar"> | |||
<delete dir="${junit.out.dir.xml}"/> | |||
<mkdir dir="${junit.out.dir.xml}"/> | |||
<junit printsummary="yes" haltonfailure="no"> | |||
<classpath refid="classpath.test"/> | |||
<b><sysproperty key="ant.home" value="${ant.home}"/></b> | |||
<formatter type="xml"/> | |||
<batchtest fork="yes" todir="${junit.out.dir.xml}"> | |||
<fileset dir="${src.dir}" includes="**/*Test.java"/> | |||
</batchtest> | |||
</junit> | |||
</target> | |||
</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 <path>. Fileset are easy if the files are all under | |||
possibility of bundling files: the <path>. 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 | |||
<filelist> instead? <path>s combines these datatypes in that way that a path contains | |||
<filelist> instead? <path>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> <foreach> task is modified to support paths instead of filesets. So we want that, | |||
Ant-Contribs [4]</a> <foreach> 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> | |||
<find file="ant.jar" location="location.ant-jar"> | |||
<fileset dir="${ant.home}" includes="**/*.jar"/> | |||
</find> | |||
<find file="ant.jar" location="location.ant-jar"> | |||
<fileset dir="${ant.home}" includes="**/*.jar"/> | |||
</find> | |||
<i><b>to:</b></i> | |||
<find file="ant.jar" location="location.ant-jar"> | |||
<b><path></b> *3 | |||
<fileset dir="${ant.home}" includes="**/*.jar"/> | |||
</path> | |||
</find> | |||
<find file="ant.jar" location="location.ant-jar"> | |||
<b><path></b> *3 | |||
<fileset dir="${ant.home}" includes="**/*.jar"/> | |||
</path> | |||
</find> | |||
</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 <foreach>. All list | |||
tasks use lists. The most famous task using lists is Ant-Contribs <foreach>. All list | |||
elements are concatenated and separated with a customizable separator (default ',').</p> | |||
<p>So we do the following:</p> | |||
<pre class="code"> | |||
<find ... <b>delimiter=""</b>/> ... </find> | |||
<find ... <b>delimiter=""</b>/> ... </find> | |||
</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> | |||
<target name="test.init"> | |||
<mkdir dir="test1/dir11/dir111"/> *1 | |||
<mkdir dir="test1/dir11/dir112"/> | |||
<target name="test.init"> | |||
<mkdir dir="test1/dir11/dir111"/> *1 | |||
<mkdir dir="test1/dir11/dir112"/> | |||
... | |||
<touch file="test1/dir11/dir111/test"/> | |||
<touch file="test1/dir11/dir111/not"/> | |||
<touch file="test1/dir11/dir111/test"/> | |||
<touch file="test1/dir11/dir111/not"/> | |||
... | |||
<touch file="test1/dir13/dir131/not2"/> | |||
<touch file="test1/dir13/dir132/test"/> | |||
<touch file="test1/dir13/dir132/not"/> | |||
<touch file="test1/dir13/dir132/not2"/> | |||
<mkdir dir="test2"/> | |||
<copy todir="test2"> *2 | |||
<fileset dir="test1"/> | |||
</copy> | |||
</target> | |||
<target name="testMultipleFiles" depends="use.init,<b>test.init</b>"> *3 | |||
<find file="test" location="location.test" <b>delimiter=";"</b>> | |||
<path> | |||
<fileset dir="test1"/> | |||
<fileset dir="test2"/> | |||
</path> | |||
</find> | |||
<delete> *4 | |||
<fileset dir="test1"/> | |||
<fileset dir="test2"/> | |||
</delete> | |||
</target> | |||
<touch file="test1/dir13/dir131/not2"/> | |||
<touch file="test1/dir13/dir132/test"/> | |||
<touch file="test1/dir13/dir132/not"/> | |||
<touch file="test1/dir13/dir132/not2"/> | |||
<mkdir dir="test2"/> | |||
<copy todir="test2"> *2 | |||
<fileset dir="test1"/> | |||
</copy> | |||
</target> | |||
<target name="testMultipleFiles" depends="use.init,<b>test.init</b>"> *3 | |||
<find file="test" location="location.test" <b>delimiter=";"</b>> | |||
<path> | |||
<fileset dir="test1"/> | |||
<fileset dir="test2"/> | |||
</path> | |||
</find> | |||
<delete> *4 | |||
<fileset dir="test1"/> | |||
<fileset dir="test2"/> | |||
</delete> | |||
</target> | |||
<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"> | |||
<html> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Language" content="en-us"> | |||
<title> <b>Taskname</b> Task</title> | |||
</head> | |||
<head> | |||
<meta http-equiv="Content-Language" content="en-us"> | |||
<title> <b>Taskname</b> Task</title> | |||
</head> | |||
<body> | |||
<body> | |||
<h2><a name="<i>taskname</i>"><b>Taskname</b></a></h2> | |||
<h3>Description</h3> | |||
<p> <b>Describe the task.</b></p> | |||
<h2><a name="<i>taskname</i>"><b>Taskname</b></a></h2> | |||
<h3>Description</h3> | |||
<p> <b>Describe the task.</b></p> | |||
<h3>Parameters</h3> | |||
<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> | |||
<h3>Parameters</h3> | |||
<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> | |||
<b>do this html row for each attribute (including inherited attributes)</b> | |||
<tr> | |||
<td valign="top">classname</td> | |||
<td valign="top">the Java class to execute.</td> | |||
<td align="center" valign="top">Either jar or classname</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">classname</td> | |||
<td valign="top">the Java class to execute.</td> | |||
<td align="center" valign="top">Either jar or classname</td> | |||
</tr> | |||
</table> | |||
</table> | |||
<h3>Parameters specified as nested elements</h3> | |||
<h3>Parameters specified as nested elements</h3> | |||
<b>Describe each nested element (including inherited)</b> | |||
<h4><b>your nested element</b></h4> | |||
<p> <b>description</b> </p> | |||
<p><em>since Ant 1.6</em>.</p> | |||
<h4>your nested element</b></h4> | |||
<p> <b>description</b> </p> | |||
<p><em>since Ant 1.6</em>.</p> | |||
<h3>Examples</h3> | |||
<pre> | |||
<h3>Examples</h3> | |||
<pre> | |||
<b>A code sample; don´t forget to escape the < of the tags with &lt;</b> | |||
</pre> | |||
</pre> | |||
<b>what should that example do?</b> | |||
</body> | |||
</html> | |||
</body> | |||
</html> | |||
</pre> | |||
<p>For our task we have <a href="CoreTasks/find.html">that [6]</a>:</p> | |||
<pre class="code"> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Language" content="en-us"> | |||
<title> Find Task</title> | |||
</head> | |||
<body> | |||
<h2><a name="find">Find</a></h2> | |||
<h3>Description</h3> | |||
<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.</p> | |||
<h3>Parameters</h3> | |||
<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">file</td> | |||
<td valign="top">The name of the file to search.</td> | |||
<td align="center" valign="top">yes</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">location</td> | |||
<td valign="top">The name of the property where to store the location</td> | |||
<td align="center" valign="top">yes</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">delimiter</td> | |||
<td valign="top">A delimiter to use when returning the list</td> | |||
<td align="center" valign="top">only if the list is required</td> | |||
</tr> | |||
</table> | |||
<h3>Parameters specified as nested elements</h3> | |||
<h4>path</h4> | |||
<p>The path where to search the file.</p> | |||
<h3>Examples</h3> | |||
<pre> | |||
<find file="ant.jar" location="loc"> | |||
<path> | |||
<fileset dir="${ant.home}"/> | |||
<path> | |||
</find> | |||
</pre> | |||
Searches in Ants home directory for a file <i>ant.jar</i> and stores its location in | |||
property <i>loc</i> (should be ANT_HOME/bin/ant.jar). | |||
<pre> | |||
<find file="ant.jar" location="loc" delimiter=";"> | |||
<path> | |||
<fileset dir="C:/"/> | |||
<path> | |||
</find> | |||
<echo>ant.jar found in: ${loc}</echo> | |||
</pre> | |||
Searches in Windows C: drive for all <i>ant.jar</i> and stores their locations in | |||
property <i>loc</i> delimited with <i>';'</i>. (should need a long time :-) | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Language" content="en-us"> | |||
<title> Find Task</title> | |||
</head> | |||
<body> | |||
<h2><a name="find">Find</a></h2> | |||
<h3>Description</h3> | |||
<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.</p> | |||
<h3>Parameters</h3> | |||
<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">file</td> | |||
<td valign="top">The name of the file to search.</td> | |||
<td align="center" valign="top">yes</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">location</td> | |||
<td valign="top">The name of the property where to store the location</td> | |||
<td align="center" valign="top">yes</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">delimiter</td> | |||
<td valign="top">A delimiter to use when returning the list</td> | |||
<td align="center" valign="top">only if the list is required</td> | |||
</tr> | |||
</table> | |||
<h3>Parameters specified as nested elements</h3> | |||
<h4>path</h4> | |||
<p>The path where to search the file.</p> | |||
<h3>Examples</h3> | |||
<pre> | |||
<find file="ant.jar" location="loc"> | |||
<path> | |||
<fileset dir="${ant.home}"/> | |||
<path> | |||
</find> | |||
</pre> | |||
Searches in Ants home directory for a file <i>ant.jar</i> and stores its location in | |||
property <i>loc</i> (should be ANT_HOME/bin/ant.jar). | |||
<pre> | |||
<find file="ant.jar" location="loc" delimiter=";"> | |||
<path> | |||
<fileset dir="C:/"/> | |||
<path> | |||
</find> | |||
<echo>ant.jar found in: ${loc}</echo> | |||
</pre> | |||
Searches in Windows C: drive for all <i>ant.jar</i> and stores their locations in | |||
property <i>loc</i> delimited with <i>';'</i>. (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). | |||
</body> | |||
</html> | |||
</body> | |||
</html> | |||
</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> build // 1 | |||
ANTHOME> set ANT_HOME=%CD%\dist // 2 | |||
ANTHOME> 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><a href="CoreTasks/find.html">Find</a><br></tt> | |||
<li>add a <tt><a href="CoreTasks/find.html">Find</a><br></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> build | |||
ANTHOME> 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 <find> task (remember the | |||
<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 <find> task (remember the | |||
<taskdef> 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> build // 1 | |||
ANTHOME> 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> 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> 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 <path/> for occurrences of a file and stores | |||
<td>This new task looks inside a nested <path/> for occurrences of a file and stores | |||
all locations as a property. See the included manual for details.</td> | |||
</tr> | |||
<tr> | |||
@@ -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"> | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<project name="MyTask" basedir="." default="jar"> | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<project name="MyTask" basedir="." default="jar"> | |||
<target name="clean" description="Delete all generated files"> | |||
<delete dir="classes"/> | |||
<delete file="MyTasks.jar"/> | |||
</target> | |||
<target name="clean" description="Delete all generated files"> | |||
<delete dir="classes"/> | |||
<delete file="MyTasks.jar"/> | |||
</target> | |||
<target name="compile" description="Compiles the Task"> | |||
<javac srcdir="src" destdir="classes"/> | |||
</target> | |||
<target name="compile" description="Compiles the Task"> | |||
<javac srcdir="src" destdir="classes"/> | |||
</target> | |||
<target name="jar" description="JARs the Task"> | |||
<jar destfile="MyTask.jar" basedir="classes"/> | |||
</target> | |||
<target name="jar" description="JARs the Task"> | |||
<jar destfile="MyTask.jar" basedir="classes"/> | |||
</target> | |||
</project> | |||
</project> | |||
</pre> | |||
This buildfile uses often the same value (src, classes, MyTask.jar), so we should rewrite that | |||
using <property>s. On second there are some handicaps: <javac> requires that the destination | |||
using <property>s. On second there are some handicaps: <javac> 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"> | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<project name="MyTask" basedir="." default="jar"> | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<project name="MyTask" basedir="." default="jar"> | |||
<b><property name="src.dir" value="src"/></b> | |||
<b><property name="classes.dir" value="classes"/></b> | |||
<b><property name="src.dir" value="src"/></b> | |||
<b><property name="classes.dir" value="classes"/></b> | |||
<target name="clean" description="Delete all generated files"> | |||
<delete dir="<b>${classes.dir}</b>" <b>failonerror="false"</b>/> | |||
<delete file="<b>${ant.project.name}.jar</b>"/> | |||
</target> | |||
<target name="clean" description="Delete all generated files"> | |||
<delete dir="<b>${classes.dir}</b>" <b>failonerror="false"</b>/> | |||
<delete file="<b>${ant.project.name}.jar</b>"/> | |||
</target> | |||
<target name="compile" description="Compiles the Task"> | |||
<b><mkdir dir="${classes.dir}"/></b> | |||
<javac srcdir="<b>${src.dir}</b>" destdir="${classes.dir}"/> | |||
</target> | |||
<target name="compile" description="Compiles the Task"> | |||
<b><mkdir dir="${classes.dir}"/></b> | |||
<javac srcdir="<b>${src.dir}</b>" destdir="${classes.dir}"/> | |||
</target> | |||
<target name="jar" description="JARs the Task" <b>depends="compile"</b>> | |||
<jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/> | |||
</target> | |||
<target name="jar" description="JARs the Task" <b>depends="compile"</b>> | |||
<jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/> | |||
</target> | |||
</project> | |||
</project> | |||
</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"> | |||
<taskdef> [2]</a>. And for easier process we change the default clause: | |||
<taskdef> [2]</a>. And for easier process we change the default clause: | |||
<pre class="code"> | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<project name="MyTask" basedir="." default="<b>use</b>"> | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<project name="MyTask" basedir="." default="<b>use</b>"> | |||
... | |||
<b><target name="use" description="Use the Task" depends="jar"> | |||
<taskdef name="helloworld" classname="HelloWorld" classpath="${ant.project.name}.jar"/> | |||
<helloworld/> | |||
</target></b> | |||
<b><target name="use" description="Use the Task" depends="jar"> | |||
<taskdef name="helloworld" classname="HelloWorld" classpath="${ant.project.name}.jar"/> | |||
<helloworld/> | |||
</target></b> | |||
</project> | |||
</project> | |||
</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 <echo/> task :-). First we well do that with an attribute. | |||
It is very easy - for each attribute provide a <tt>public void set<attributename>(<type> | |||
rewriting the <echo/> task :-). First we well do that with an attribute. | |||
It is very easy - for each attribute provide a <tt>public void set<attributename>(<type> | |||
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"> | |||
<target name="use" description="Use the Task" depends="jar"> | |||
<target name="use" description="Use the Task" depends="jar"> | |||
<taskdef name="helloworld" | |||
classname="HelloWorld" | |||
classpath="${ant.project.name}.jar"/> | |||
<helloworld <b>message="Hello World"</b>/> | |||
</target> | |||
classpath="${ant.project.name}.jar"/> | |||
<helloworld <b>message="Hello World"</b>/> | |||
</target> | |||
</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><helloworld message="${msg}"/></tt> | |||
Before calling the set-method all properties are resolved. So a <tt><helloworld message="${msg}"/></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 <echo> task in a way like <tt><echo>Hello World</echo></tt>. | |||
<p>Maybe you have used the <echo> task in a way like <tt><echo>Hello World</echo></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<attributename>() methods). </li> | |||
as for the task (set<attributename>() 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"> | |||
<helloworld> | |||
<message msg="Nested Element 1"/> | |||
<message msg="Nested Element 2"/> | |||
</helloworld> | |||
<helloworld> | |||
<message msg="Nested Element 1"/> | |||
<message msg="Nested Element 2"/> | |||
</helloworld> | |||
</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"> | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<project name="MyTask" basedir="." default="use"> | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<project name="MyTask" basedir="." default="use"> | |||
<property name="src.dir" value="src"/> | |||
<property name="classes.dir" value="classes"/> | |||
<property name="src.dir" value="src"/> | |||
<property name="classes.dir" value="classes"/> | |||
<target name="clean" description="Delete all generated files"> | |||
<delete dir="${classes.dir}" failonerror="false"/> | |||
<delete file="${ant.project.name}.jar"/> | |||
</target> | |||
<target name="clean" description="Delete all generated files"> | |||
<delete dir="${classes.dir}" failonerror="false"/> | |||
<delete file="${ant.project.name}.jar"/> | |||
</target> | |||
<target name="compile" description="Compiles the Task"> | |||
<mkdir dir="${classes.dir}"/> | |||
<javac srcdir="${src.dir}" destdir="${classes.dir}"/> | |||
</target> | |||
<target name="compile" description="Compiles the Task"> | |||
<mkdir dir="${classes.dir}"/> | |||
<javac srcdir="${src.dir}" destdir="${classes.dir}"/> | |||
</target> | |||
<target name="jar" description="JARs the Task" depends="compile"> | |||
<jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/> | |||
</target> | |||
<target name="jar" description="JARs the Task" depends="compile"> | |||
<jar destfile="${ant.project.name}.jar" basedir="${classes.dir}"/> | |||
</target> | |||
<target name="use.init" | |||
description="Taskdef the HelloWorld-Task" | |||
depends="jar"> | |||
depends="jar"> | |||
<taskdef name="helloworld" | |||
classname="HelloWorld" | |||
classpath="${ant.project.name}.jar"/> | |||
</target> | |||
classpath="${ant.project.name}.jar"/> | |||
</target> | |||
<target name="use.without" | |||
description="Use without any" | |||
depends="use.init"> | |||
<helloworld/> | |||
</target> | |||
depends="use.init"> | |||
<helloworld/> | |||
</target> | |||
<target name="use.message" | |||
description="Use with attribute 'message'" | |||
depends="use.init"> | |||
<helloworld message="attribute-text"/> | |||
</target> | |||
depends="use.init"> | |||
<helloworld message="attribute-text"/> | |||
</target> | |||
<target name="use.fail" | |||
description="Use with attribute 'fail'" | |||
depends="use.init"> | |||
<helloworld fail="true"/> | |||
</target> | |||
depends="use.init"> | |||
<helloworld fail="true"/> | |||
</target> | |||
<target name="use.nestedText" | |||
description="Use with nested text" | |||
depends="use.init"> | |||
<helloworld>nested-text</helloworld> | |||
</target> | |||
depends="use.init"> | |||
<helloworld>nested-text</helloworld> | |||
</target> | |||
<target name="use.nestedElement" | |||
description="Use with nested 'message'" | |||
depends="use.init"> | |||
<helloworld> | |||
<message msg="Nested Element 1"/> | |||
<message msg="Nested Element 2"/> | |||
</helloworld> | |||
</target> | |||
depends="use.init"> | |||
<helloworld> | |||
<message msg="Nested Element 1"/> | |||
<message msg="Nested Element 2"/> | |||
</helloworld> | |||
</target> | |||
<target name="use" | |||
description="Try all (w/out use.fail)" | |||
depends="use.without,use.message,use.nestedText,use.nestedElement" | |||
/> | |||
/> | |||
</project> | |||
</project> | |||
</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>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>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> | |||
</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 <junit> | |||
and <junitreport>. So we add to the buildfile: | |||
<p>For executing the test and creating a report we need the optional tasks <junit> | |||
and <junitreport>. So we add to the buildfile: | |||
<pre class="code"> | |||
... | |||
<font color="#9F9F9F"><project name="MyTask" basedir="." </font>default="test"<font color="#9F9F9F">></font> | |||
... | |||
<property name="ant.test.lib" value="ant-testutil.jar"/> | |||
<property name="report.dir" value="report"/> | |||
<property name="junit.out.dir.xml" value="${report.dir}/junit/xml"/> | |||
<property name="junit.out.dir.html" value="${report.dir}/junit/html"/> | |||
<path id="classpath.run"> | |||
<path path="${java.class.path}"/> | |||
<path location="${ant.project.name}.jar"/> | |||
</path> | |||
<path id="classpath.test"> | |||
<path refid="classpath.run"/> | |||
<path location="${ant.test.lib}"/> | |||
</path> | |||
<target name="clean" description="Delete all generated files"> | |||
<delete failonerror="false" includeEmptyDirs="true"> | |||
<fileset dir="." includes="${ant.project.name}.jar"/> | |||
<fileset dir="${classes.dir}"/> | |||
<fileset dir="${report.dir}"/> | |||
</delete> | |||
</target> | |||
<font color="#9F9F9F"><target name="compile" description="Compiles the Task"> | |||
<mkdir dir="${classes.dir}"/> | |||
<javac srcdir="${src.dir}" destdir="${classes.dir}" </font>classpath="${ant.test.lib}"<font color="#9F9F9F">/> | |||
</target></font> | |||
<property name="ant.test.lib" value="ant-testutil.jar"/> | |||
<property name="report.dir" value="report"/> | |||
<property name="junit.out.dir.xml" value="${report.dir}/junit/xml"/> | |||
<property name="junit.out.dir.html" value="${report.dir}/junit/html"/> | |||
<path id="classpath.run"> | |||
<path path="${java.class.path}"/> | |||
<path location="${ant.project.name}.jar"/> | |||
</path> | |||
<path id="classpath.test"> | |||
<path refid="classpath.run"/> | |||
<path location="${ant.test.lib}"/> | |||
</path> | |||
<target name="clean" description="Delete all generated files"> | |||
<delete failonerror="false" includeEmptyDirs="true"> | |||
<fileset dir="." includes="${ant.project.name}.jar"/> | |||
<fileset dir="${classes.dir}"/> | |||
<fileset dir="${report.dir}"/> | |||
</delete> | |||
</target> | |||
<font color="#9F9F9F"><target name="compile" description="Compiles the Task"> | |||
<mkdir dir="${classes.dir}"/> | |||
<javac srcdir="${src.dir}" destdir="${classes.dir}" </font>classpath="${ant.test.lib}"<font color="#9F9F9F">/> | |||
</target></font> | |||
... | |||
<target name="junit" description="Runs the unit tests" depends="jar"> | |||
<delete dir="${junit.out.dir.xml}" /> | |||
<mkdir dir="${junit.out.dir.xml}" /> | |||
<junit printsummary="yes" haltonfailure="no"> | |||
<classpath refid="classpath.test"/> | |||
<formatter type="xml"/> | |||
<batchtest fork="yes" todir="${junit.out.dir.xml}"> | |||
<fileset dir="${src.dir}" includes="**/*Test.java"/> | |||
</batchtest> | |||
</junit> | |||
</target> | |||
<target name="junitreport" description="Create a report for the rest result"> | |||
<mkdir dir="${junit.out.dir.html}" /> | |||
<junitreport todir="${junit.out.dir.html}"> | |||
<fileset dir="${junit.out.dir.xml}"> | |||
<include name="*.xml"/> | |||
</fileset> | |||
<report format="frames" todir="${junit.out.dir.html}"/> | |||
</junitreport> | |||
</target> | |||
<target name="junit" description="Runs the unit tests" depends="jar"> | |||
<delete dir="${junit.out.dir.xml}"/> | |||
<mkdir dir="${junit.out.dir.xml}"/> | |||
<junit printsummary="yes" haltonfailure="no"> | |||
<classpath refid="classpath.test"/> | |||
<formatter type="xml"/> | |||
<batchtest fork="yes" todir="${junit.out.dir.xml}"> | |||
<fileset dir="${src.dir}" includes="**/*Test.java"/> | |||
</batchtest> | |||
</junit> | |||
</target> | |||
<target name="junitreport" description="Create a report for the rest result"> | |||
<mkdir dir="${junit.out.dir.html}"/> | |||
<junitreport todir="${junit.out.dir.html}"> | |||
<fileset dir="${junit.out.dir.xml}"> | |||
<include name="*.xml"/> | |||
</fileset> | |||
<report format="frames" todir="${junit.out.dir.html}"/> | |||
</junitreport> | |||
</target> | |||
<target name="test" | |||
depends="junit,junitreport" | |||
description="Runs unit tests and creates a report" | |||
/> | |||
/> | |||
... | |||
</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>ant | |||
Buildfile: build.xml | |||
compile: | |||
@@ -719,7 +719,7 @@ test: | |||
BUILD SUCCESSFUL | |||
Total time: 7 seconds | |||
C:\tmp\anttests\MyFirstTask> | |||
C:\tmp\anttests\MyFirstTask> | |||
</pre></p> | |||