﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-学习--共同努力-随笔分类-ant</title><link>http://www.blogjava.net/rendong/category/13664.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 07:17:09 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 07:17:09 GMT</pubDate><ttl>60</ttl><item><title>Ant指南(转载)</title><link>http://www.blogjava.net/rendong/archive/2006/08/01/61187.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Tue, 01 Aug 2006 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/08/01/61187.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/61187.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/08/01/61187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/61187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/61187.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<h2>
						<a id="viewpost1_TitleUrl" href="http://sunsonbaby.cnblogs.com/archive/2004/11/22/67251.html">
								<font color="#223355">Ant指南 </font>
						</a>
				</h2>
				<div class="postbody">1. <a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#whatisant"><font color="#223355">Ant是什么？</font></a><br />2. <a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#installAnt"><font color="#223355">安装Ant</font></a><br />3. <a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#runAnt"><font color="#223355">运行Ant</font></a><br />4. <a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#writeBuild.xml"><font color="#223355">编写build.xml</font></a><br />5. <a href="http://jakarta.apache.org/ant/manual/coretasklist.html"><font color="#223355">内置task</font></a>(internet)<br />6. <a href="http://jakarta.apache.org/ant/manual/CoreTasks/ear.html"><font color="#223355">EAR task</font></a>(internet)<br />7. <a href="http://jakarta.apache.org/ant/manual/CoreTasks/war.html"><font color="#223355">WAR task</font></a>(internet)<br />8. <a href="http://jakarta.apache.org/ant/manual/OptionalTasks/junit.html"><font color="#223355">JUnit task</font></a>(internet)<br /><hr /><font color="#000000"><br />1. <a name="whatisant"></a><b>Ant是什么？</b></font><hr /><blockquote><font color="#000000">Ant是一种基于Java的build工具。理论上来说，它有些类似于（Unix）C中的make ，但没有make的缺陷。<br /><br />既然我们已经有了make, gnumake, nmake, jam以及其他的build工具为什么还要要一种新的build工具呢？因为Ant的原作者在多种(硬件)平台上开发软件时，无法忍受这些工具的限制和不便。类似于make的工具本质上是基于shell（语言）的：他们计算依赖关系，然后执行命令（这些命令与你在命令行敲的命令没太大区别）。这就意味着你可以很容易地通过使用OS特有的或编写新的（命令）程序扩展该工具；然而，这也意味着你将自己限制在了特定的OS，或特定的OS类型上，如Unix。<br /><br />Makefile也很可恶。任何使用过他们的人都碰到过可恶的tab问题。Ant的原作者经常这样问自己：“是否我的命令不执行只是因为在我的tab前有一个空格？！！”。类似于jam的工具很好地处理了这类问题，但是（用户）必须记住和使用一种新的格式。<br /><br />Ant就不同了。与基于shell命令的扩展模式不同，Ant用Java的类来扩展。（用户）不必编写shell命令，配置文件是基于XML的，通过调用target树，就可执行各种task。每个task由实现了一个实现了特定Task接口的对象来运行。（如果你对Ant一点概念都没有的话，可能看不懂这一节，没有关系，后面会对target,task做详细的介绍。你如果没有太多的时间甚至可以略过这一节，然后再回来浏览一下这里的介绍，那时你就会看懂了。同样，如果你对make之类的工具不熟悉也没关系，下面的介绍根本不会用到make中的概念。）<br /><br />必须承认，这样做，在构造shell命令时会失去一些特有的表达能力。如`find . -name foo -exec rm {}`，但却给了你跨平台的能力－你可以在任何地方工作。如果你真的需要执行一些shell命令，Ant有一个&lt;exec&gt; task，这个task允许执行特定OS上的命令。<br /><br /><a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#content"><font color="#223355">返回</font></a><br /></font></blockquote><font color="#000000">2. <a name="installAnt"></a><b>安装Ant</b></font><hr /><blockquote><font color="#000000">由于Ant是一个Open Source的软件，所以有两种安装Ant的方式，一种是用已编译好的binary 文件安装Ant，另一种是用源代码自己build Ant。<br /><br />binary 形式的Ant可以从<a href="http://jakarta.apache.org/builds/ant/release/v1.4.1/bin/"><font color="#223355">http://jakarta.apache.org/builds/ant/release/v1.4.1/bin</font></a>下载。如果你希望你能自己编译Ant，则可从<a href="http://jakarta.apache.org/builds/ant/release/v1.4.1/src/"><font color="#223355"> http://jakarta.apache.org/builds/ant/release/v1.4.1/src</font></a>。注意所列出的连接都是最新发行版的Ant。如果你读到此文时，发现已经有了更新的版本，那么请用新版本。如果你是一个疯狂的技术追求者，你也可以从<a href="http://cvs.apache.org/viewcvs/jakarta-ant/" target="_top"><font color="#223355">Ant CVS repository</font></a>下载最新版本的Ant。<br /><br /><b><i>系统需求</i></b><br /><br />要想自己build Ant。你需要一个JAXP兼容的XML解析器（parser）放在你的CLASSPATH系统变量中。<br /><br />binary 形式的Ant包括最新版的<a href="http://xml.apache.org/crimson/index.html"><font color="#223355">Apache Crimson</font></a> XML解析器。你可以从<a href="http://java.sun.com/xml/"><font color="#223355">http://java.sun.com/xml/</font></a> 得到更多的关于JAXP的信息。如果你希望使用其他的JAXP兼容的解析器。你要从Ant的lib目录中删掉jaxp.jar以及crimson.jar。然后你可将你心爱的解析器的jar文件放到Ant的lib目录中或放在你的CLASSPATH系统变量中。<br /><br />对于当前版本的Ant，需要你的系统中有JDK，1.1版或更高。未来的Ant版本会要求使用JDK 1.2或更高版本。<br /><br /><i><b><a name="installAnt"></a>安装Ant</b></i><br /><br />binary 版的Ant包括三个目录:bin, docs 和lib。只有bin和lib目录是运行Ant所需的。要想安装Ant，选择一个目录并将发行版的文件拷贝到该目录下。这个目录被称作ANT_HOME。<br /><br />在你运行Ant之前需要做一些配置工作。<br /></font><ul><li><font color="#000000">将bin目录加入PATH环境变量。</font></li><li><font color="#000000">设定ANT_HOME环境变量，指向你安装Ant的目录。在一些OS上，Ant的脚本可以猜测ANT_HOME（Unix和Windos NT/2000）－但最好不要依赖这一特性。</font></li><li><font color="#000000">可选地，设定JAVA_HOME环境变量（参考下面的<a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#installAdvantage"><font color="#223355">高级</font></a>小节），该变量应该指向你安装JDK的目录。<br /></font></li></ul><font color="#000000">注意：不要将Ant的ant.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序，而lib/ext目录是为JDK扩展使用的（如JCE，JSSE扩展）。而且通过扩展装入的类会有安全方面的限制。<br /><br /><i>可选Task</i><br /><br />Ant支持一些可选task。一个可选task一般需要额外的库才能工作。可选task与Ant的内置task分开，单独打包。这个可选包可以从你下载Ant的同一个地方下载。目前包含可选task的jar文件名叫jakarta-ant-1.4.1-optional.jar。这个jar文件应该放到Ant安装目录的lib目录下。<br /><br />每个可选task所需的外部库可参看<a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#installDepLib"><font color="#223355">依赖库</font></a>小节。这些外部库可以放到Ant的lib目录下，这样Ant就能自动装入，或者将其放入环境变量中。<br /><br /><i>Windows</i><br /><br />假定Ant安装在c:\ant\目录下。下面是设定环境的命令：<br /></font><blockquote><font color="#000000">set ANT_HOME=c:\ant<br />set JAVA_HOME=c:\jdk1.2.2<br />set PATH=%PATH%;%ANT_HOME%\bin</font></blockquote><font color="#000000"><i>Unix (bash)</i><br /><br />假定Ant安装在/usr/local/ant目录下。下面是设定环境的命令：<br /></font><blockquote><font color="#000000">export ANT_HOME=/usr/local/ant<br />export JAVA_HOME=/usr/local/jdk-1.2.2<br />export PATH=${PATH}:${ANT_HOME}/bin</font></blockquote><font color="#000000"><a name="installAdvantage"></a><i>高级</i><br /><br />要想运行Ant必须使用很多的变量。你至少参考需要下面的内容：<br /></font><ul><li><font color="#000000">Ant的CLASSPATH必须包含ant.jar以及你所选的JAXP兼容的XML解析器的jar文件。</font></li><li><font color="#000000">当你需要JDK的功能（如javac或rmic task）时，对于JDK 1.1，JDK的classes.zip文件必须放入CLASSPATH中；对于JDK 1.2或JDK 1.3，则必须加入tools.jar。如果设定了正确的JAVA_HOME环境变量，Ant所带的脚本，在bin目录下，会自动加入所需的JDK类。</font></li><li><font color="#000000">当你执行特定平台的程序（如exec task或cvs task）时，必须设定ant.home属性指向Ant的安装目录。同样，Ant所带的脚本利用ANT_HOME环境变量自动设置该属性。</font></li></ul><font color="#000000"><b>Building Ant</b><br /><br />要想从源代码build Ant，你要先安装Ant源代码发行版或从CVS中checkout jakarta-ant模块。<br /><br />安装好源代码后，进入安装目录。<br /><br />设定JAVA_HOME环境变量指向JDK的安装目录。要想知道怎么做请参看<i><b><a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#installAnt"><font color="#223355">安装Ant</font></a></b></i>小节。<br /><br />确保你已下载了任何辅助jar文件，以便build你所感兴趣的task。这些jar文件可以放在CLASSPATH中，也可以放在lib/optional目录下。参看<a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#installDepLib"><font color="#223355">依赖库</font></a>小节可知不同的task需要那些jar文件。注意这些jar文件只是用作build Ant之用。要想运行Ant，你还要像<i><b><a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#installAnt"><font color="#223355">安装Ant</font></a></b></i>小节中所做的那样设定这些jar文件。<br /><br />现在你可以build Ant了：<br /></font><blockquote><font color="#000000">build -Ddist.dir=&lt;directory_to_contain_Ant_distribution&gt; dist (Windows)<br />build.sh -Ddist.dir=&lt;directory_to_contain_Ant_distribution&gt; dist (Unix)<br /></font></blockquote><font color="#000000">这样就可你指定的目录中创建一个binary版本。<br /><br />上面的命令执行下面的动作：<br /></font><ul><li><font color="#000000">如果有必要可以bootstrap Ant的代码。bootstrap 包括手工编辑一些Ant代码以便运行Ant。bootstrap 用于下面的build步骤。</font></li><li><font color="#000000">向build脚本传递参数以调用bootstrap Ant。参数定义了Ant的属性值并指定了Ant自己的build.xml文件的"dist" target。<br /></font></li></ul><font color="#000000">大多数情况下，你不必直接bootstrap Ant，因为build脚本为你完成这一切。运行bootstrap.bat (Windows) 或 bootstrap.sh (UNIX) 可以build一个新的bootstrap版Ant。<br /><br />如果你希望将Ant安装到ANT_HOME目录下，你可以使用：<br /></font><blockquote><font color="#000000">build install (Windows)<br />build.sh install (Unix)<br /></font></blockquote><font color="#000000">如果你希望跳过冗长的Javadoc步骤，可以用：<br /></font><blockquote><font color="#000000">build install-lite (Windows)<br />build.sh install-lite (Unix)<br /></font></blockquote><font color="#000000">这样就只会安装bin和lib目录。<br /><br />注意install和install-lite都会覆盖ANT_HOME中的当前Ant版本。<br /><br /><a name="installDepLib"></a><b>依赖库</b><br /><br />如果你需要执行特定的task，你需要将对应的库放入CLASSPATH或放到Ant安装目录的lib目录下。注意使用mapper时只需要一个regexp库。同时，你也要安装Ant的可选jar包，它包含了task的定义。参考上面的<i><b><a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#installAnt"><font color="#223355">安装Ant</font></a></b></i>小节。<br /><br /></font><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td><b><font color="#000000">Jar Name</font></b></td><td><b><font color="#000000">Needed For</font></b></td><td><b><font color="#000000">Available At</font></b></td></tr><tr><td><font color="#000000">An XSL transformer like Xalan or XSL:P</font></td><td><font color="#000000">style task</font></td><td><font color="#000000"><a href="http://xml.apache.org/xalan-j/index.html" target="_top"><font color="#223355">http://xml.apache.org/xalan-j/index.html</font></a> or <a href="http://www.clc-marketing.com/xslp/" target="_top"><font color="#223355">http://www.clc-marketing.com/xslp/</font></a></font></td></tr><tr><td><font color="#000000">jakarta-regexp-1.2.jar</font></td><td><font color="#000000">regexp type with mappers</font></td><td><a href="http://jakarta.apache.org/regexp/" target="_top"><font color="#000000">jakarta.apache.org/regexp/</font></a></td></tr><tr><td><font color="#000000">jakarta-oro-2.0.1.jar</font></td><td><font color="#000000">regexp type with mappers and the perforce tasks</font></td><td><a href="http://jakarta.apache.org/oro/" target="_top"><font color="#000000">jakarta.apache.org/oro/</font></a></td></tr><tr><td><font color="#000000">junit.jar</font></td><td><font color="#000000">junit tasks</font></td><td><a href="http://www.junit.org/" target="_top"><font color="#000000">www.junit.org</font></a></td></tr><tr><td><font color="#000000">stylebook.jar</font></td><td><font color="#000000">stylebook task</font></td><td><font color="#000000">CVS repository of <a href="http://xml.apache.org/" target="_top"><font color="#223355">xml.apache.org</font></a></font></td></tr><tr><td><font color="#000000">testlet.jar</font></td><td><font color="#000000">test task</font></td><td><a href="http://java.apache.org/framework" target="_top"><font color="#000000">java.apache.org/framework</font></a></td></tr><tr><td><font color="#000000">antlr.jar</font></td><td><font color="#000000">antlr task</font></td><td><a href="http://www.antlr.org/" target="_top"><font color="#000000">www.antlr.org</font></a></td></tr><tr><td><font color="#000000">bsf.jar</font></td><td><font color="#000000">script task</font></td><td><a href="http://oss.software.ibm.com/developerworks/projects/bsf" target="_top"><font color="#000000">oss.software.ibm.com/developerworks/projects/bsf</font></a></td></tr><tr><td><font color="#000000">netrexx.jar</font></td><td><font color="#000000">netrexx task</font></td><td><a href="http://www2.hursley.ibm.com/netrexx" target="_top"><font color="#000000">www2.hursley.ibm.com/netrexx</font></a></td></tr><tr><td><font color="#000000">rhino.jar</font></td><td><font color="#000000">javascript with script task</font></td><td><a href="http://www.mozilla.org/" target="_top"><font color="#000000">www.mozilla.org</font></a></td></tr><tr><td><font color="#000000">jpython.jar</font></td><td><font color="#000000">python with script task</font></td><td><a href="http://www.jpython.org/" target="_top"><font color="#000000">www.jpython.org</font></a></td></tr><tr><td><font color="#000000">netcomponents.jar</font></td><td><font color="#000000">ftp and telnet tasks</font></td><td><a href="http://www.savarese.org/oro/downloads/index.html#NetComponents" target="_top"><font color="#000000">www.savarese.org/oro/downloads</font></a></td></tr></tbody></table><font color="#000000"><br /><a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#content"><font color="#223355">返回</font></a><br /></font></blockquote><font color="#000000">3. <a name="runAnt"></a><b>运行Ant</b></font><hr /><blockquote><font color="#000000">运行Ant非常简单，当你正确地<a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#installAnt"><font color="#223355">安装Ant</font></a>后，只要输入ant就可以了。<br /><br />没有指定任何参数时，Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 <i>-find</i> 选项。Ant就会在上级目录中寻找buildfile，直至到达文件系统的根。要想让Ant使用其他的buildfile，可以用参数 <i>-buildfile file</i>，这里<i>file</i>指定了你想使用的buildfile。<br /><br />你也可以设定一些属性，以覆盖buildfile中指定的属性值（参看property task）。可以用 <i>-Dproperty=value</i> 选项，这里<i>property</i>是指属性的名称，而<i>value</i>则是指属性的值。也可以用这种办法来指定一些环境变量的值。你也可以用property task来存取环境变量。只要将 <i>-DMYVAR=%MYVAR% (Windows)</i> 或 <i>-DMYVAR=$MYVAR (Unix)</i> 传递给Ant －你就可以在你的buildfile中用${MYVAR}来存取这些环境变量。<br /><br />还有两个选项 <i>-quite</i>，告诉Ant运行时只输出少量的必要信息。而 <i>-verbose</i>，告诉Ant运行时要输出更多的信息。<br /><br />可以指定执行一个或多个target。当省略target时，Ant使用标签&lt;project&gt;的default属性所指定的target。<br /><br />如果有的话，-projecthelp 选项输出项目的描述信息和项目target的列表。先列出那些有描述的，然后是没有描述的target。<br /><br />命令行选项总结：<br /></font><blockquote><font color="#000000">ant [options] [target [target2 [target3] ...]]<br /><b>Options</b>:<br /><b><i>-help</i></b> print this message<br /><i><b>-projecthel</b></i><b><i>p</i></b> print project help information<br /><i><b>-version</b></i> print the version information and exit<br /><i><b>-quiet</b></i> be extra quiet<br /><b><i>-verbose</i></b> be extra verbose<br /><i><b>-debug</b></i> print debugging information<br /><i><b>-emacs</b></i> produce logging information without adornments<br /><i><b>-logfile</b></i> file use given file for log output<br /><i><b>-logger</b></i> classname the class that is to perform logging<br /><i><b>-listener</b></i> classname add an instance of class as a project listener<br /><i><b>-buildfile</b></i> file use specified buildfile<br /><i><b>-find</b></i> file search for buildfile towards the root of the filesystem and use the first one found<br /><i><b>-Dproperty=value</b></i> set property to value</font></blockquote><b><font color="#000000">例子</font></b><font color="#000000"><br /></font><blockquote><font color="#000000">ant<br /></font></blockquote><font color="#000000">使用当前目录下的build.xml运行Ant，执行缺省的target。<br /></font><blockquote><font color="#000000">ant -buildfile test.xml<br /></font></blockquote><font color="#000000">使用当前目录下的test.xml运行Ant，执行缺省的target。<br /></font><blockquote><font color="#000000">ant -buildfile test.xml dist<br /></font></blockquote><font color="#000000">使用当前目录下的test.xml运行Ant，执行一个叫做dist的target。<br /></font><blockquote><font color="#000000">ant -buildfile test.xml -Dbuild=build/classes dist<br /></font></blockquote><font color="#000000">使用当前目录下的test.xml运行Ant，执行一个叫做dist的target，并设定build属性的值为build/classes。<br /><b><br />文件</b><br /><br />在Unix上，Ant的执行脚本在做任何事之前都会source（读并计算值）~/.antrc 文件；在Windows上，Ant的批处理文件会在开始时调用%HOME%\antrc_pre.bat，在结束时调用%HOME%\antrc_post.bat。你可以用这些文件配置或取消一些只有在运行Ant时才需要的环境变量。看下面的例子。<br /><br />环境变量<br /><br />包裹脚本（wrapper scripts）使用下面的环境变量（如果有的话）：<br /></font><ul><li><font color="#000000">JAVACMD Java可执行文件的绝对路径。用这个值可以指定一个不同于JAVA_HOME/bin/java(.exe)的JVM。</font></li><li><font color="#000000">ANT_OPTS 传递给JVM的命令行变量－例如，你可以定义属性或设定Java堆的最大值<br /></font></li></ul><font color="#000000"><b>手工运行Ant</b><br /><br />如果你自己动手安装（DIY）Ant，你可以用下面的命令启动Ant:<br /></font><blockquote><font color="#000000">java -Dant.home=c:\ant org.apache.tools.ant.Main [options] [target]<br /></font></blockquote><font color="#000000">这个命令与前面的ant命令一样。选项和target也和用ant命令时一样。这个例子假定你的CLASSPATH包含:<br /></font><ul><li><font color="#000000">ant.jar<br /></font></li><li><font color="#000000">jars/classes for your XML parser<br /></font></li><li><font color="#000000">the JDK's required jar/zip files<br /></font></li></ul><a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#content"><font color="#000000">返回</font></a></blockquote><font color="#000000">4. <a name="writeBuild.xml"></a><b>编写build.xml</b></font><hr /><blockquote><font color="#000000">Ant的buildfile是用XML写的。每个buildfile含有一个project。<br /><br />buildfile中每个task元素可以有一个id属性，可以用这个id值引用指定的任务。这个值必须是唯一的。（详情请参考下面的Task小节）<br /><br /><b>Projects</b><br /><br />project有下面的属性：<br /><br /></font><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td valign="top"><b><font color="#000000">Attribute</font></b></td><td valign="top"><b><font color="#000000">Description</font></b></td><td valign="top" align="middle"><b><font color="#000000">Required</font></b></td></tr><tr><td valign="top"><font color="#000000">name</font></td><td valign="top"><font color="#000000">项目名称.</font></td><td valign="top" align="middle"><font color="#000000">No</font></td></tr><tr><td valign="top"><font color="#000000">default</font></td><td valign="top"><font color="#000000">当没有指定target时使用的缺省target</font></td><td valign="top" align="middle"><font color="#000000">Yes</font></td></tr><tr><td valign="top"><font color="#000000">basedir</font></td><td valign="top"><font color="#000000">用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时，该属性被忽略。如果属性和basedir property都没有设定，就使用buildfile文件的父目录。</font></td><td valign="top" align="middle"><font color="#000000">No</font></td></tr></tbody></table><font color="#000000">项目的描述以一个顶级的&lt;description&gt;元素的形式出现（参看<a href="http://jakarta.apache.org/ant/manual/CoreTypes/description.html"><font color="#223355">description</font></a>小节）。<br /><br />一个项目可以定义一个或多个target。一个target是一系列你想要执行的。执行Ant时，你可以选择执行那个target。当没有给定target时，使用project的default属性所确定的target。<br /><br /><b>Targets</b><br /><br />一个target可以依赖于其他的target。例如，你可能会有一个target用于编译程序，一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过，所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。<br /><br />然而，应当注意到，Ant的depends属性只指定了target应该被执行的顺序－如果被依赖的target无法运行，这种depends对于指定了依赖关系的target就没有影响。<br /><br />Ant会依照depends属性中target出现的顺序（从左到右）依次执行每个target。然而，要记住的是只要某个target依赖于一个target，后者就会被先执行。<br /></font><blockquote><font color="#000000">&lt;target name="A"/&gt;<br />&lt;target name="B" depends="A"/&gt;<br />&lt;target name="C" depends="B"/&gt;<br />&lt;target name="D" depends="C,B,A"/&gt;<br /></font></blockquote><font color="#000000">假定我们要执行target D。从它的依赖属性来看，你可能认为先执行C，然后B，最后A被执行。错了，C依赖于B，B依赖于A，所以先执行A，然后B，然后C，最后D被执行。<br /><br />一个target只能被执行一次，即时有多个target依赖于它（看上面的例子）。<br /><br />如果（或如果不）某些属性被设定，才执行某个target。这样，允许根据系统的状态（java version, OS, 命令行属性定义等等）来更好地控制build的过程。要想让一个target这样做，你就应该在target元素中，加入if（或unless）属性，带上target因该有所判断的属性。例如：<br /></font><blockquote><font color="#000000">&lt;target name="build-module-A" if="module-A-present"/&gt;<br />&lt;target name="build-own-fake-module-A" unless="module-A-present"/&gt;<br /></font></blockquote><font color="#000000">如果没有if或unless属性，target总会被执行。<br /><br />可选的description属性可用来提供关于target的一行描述，这些描述可由-projecthelp命令行选项输出。<br /><br />将你的tstamp task在一个所谓的初始化target是很好的做法，其他的target依赖这个初始化target。要确保初始化target是出现在其他target依赖表中的第一个target。在本手册中大多数的初始化target的名字是"init"。<br /><br />target有下面的属性：<br /><br /></font><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td valign="top"><b><font color="#000000">Attribute</font></b></td><td valign="top"><b><font color="#000000">Description</font></b></td><td valign="top" align="middle"><b><font color="#000000">Required</font></b></td></tr><tr><td valign="top"><font color="#000000">name</font></td><td valign="top"><font color="#000000">target的名字</font></td><td valign="top" align="middle"><font color="#000000">Yes</font></td></tr><tr><td valign="top"><font color="#000000">depends</font></td><td valign="top"><font color="#000000">用逗号分隔的target的名字列表，也就是依赖表。</font></td><td valign="top" align="middle"><font color="#000000">No</font></td></tr><tr><td valign="top"><font color="#000000">if</font></td><td valign="top"><font color="#000000">执行target所需要设定的属性名。</font></td><td valign="top" align="middle"><font color="#000000">No</font></td></tr><tr><td valign="top"><font color="#000000">unless</font></td><td valign="top"><font color="#000000">执行target需要清除设定的属性名。</font></td><td valign="top" align="middle"><font color="#000000">No</font></td></tr><tr><td valign="top"><font color="#000000">description</font></td><td valign="top"><font color="#000000">关于target功能的简短描述。</font></td><td valign="top" align="middle"><font color="#000000">No</font></td></tr></tbody></table><font color="#000000"><br /><b>Tasks</b><br /><br />一个task是一段可执行的代码。<br /><br />一个task可以有多个属性（如果你愿意的话，可以将其称之为变量）。属性只可能包含对property的引用。这些引用会在task执行前被解析。<br /><br />下面是Task的一般构造形式：<br /></font><blockquote><i><font color="#000000">&lt;name attribute1="value1" attribute2="value2" ... /</font></i><font color="#000000">&gt;<br /></font></blockquote><font color="#000000">这里name是task的名字，attributeN是属性名，valueN是属性值。<br /><br />有一套内置的（built-in）task，以及一些可选task，但你也可以编写自己的task。<br /><br />所有的task都有一个task名字属性。Ant用属性值来产生日志信息。<br /><br />可以给task赋一个id属性：<br /></font><blockquote><font color="#000000">&lt;taskname id="taskID" ... /&gt;<br /></font></blockquote><font color="#000000">这里taskname是task的名字，而taskID是这个task的唯一标识符。通过这个标识符，你可以在脚本中引用相应的task。例如，在脚本中你可以这样：<br /></font><blockquote><font color="#000000">&lt;script ... &gt;<br />task1.setFoo("bar");<br />&lt;/script&gt;<br /></font></blockquote><font color="#000000">设定某个task实例的foo属性。在另一个task中（用java编写），你可以利用下面的语句存取相应的实例。<br /></font><blockquote><font color="#000000">project.getReference("task1").<br /></font></blockquote><font color="#000000">注意1：如果task1还没有运行，就不会被生效（例如：不设定属性），如果你在随后配置它，你所作的一切都会被覆盖。<br /><br />注意2：未来的Ant版本可能不会兼容这里所提的属性，因为很有可能根本没有task实例，只有proxies。<br /><br /><b>Properties</b><br /><br />一个project可以有很多的properties。可以在buildfile中用property task来设定，或在Ant之外设定。一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在"${"和"}"之间并放在属性值的位置来实现的。例如如果有一个property builddir的值是"build"，这个property就可用于属性值：${builddir}/classes。这个值就可被解析为build/classes。<br /><br />内置属性<br /><br />如果你使用了&lt;property&gt; task 定义了所有的系统属性，Ant允许你使用这些属性。例如，${os.name}对应操作系统的名字。<br /><br />要想得到系统属性的列表可参考<a href="http://java.sun.com/j2se/1.3/docs/api/java/lang/System.html#getProperties()"><font color="#223355">the Javadoc of System.getProperties</font></a>。<br /><br />除了Java的系统属性，Ant还定义了一些自己的内置属性：</font><pre><font color="#000000"> basedir   project基目录的绝对路径 (与&lt;project&gt;的basedir属性一样)。
 ant.file   buildfile的绝对路径。
 ant.version  Ant的版本。
 ant.project.name  当前执行的project的名字；由&lt;project&gt;的name属性设定.
 ant.java.version  Ant检测到的JVM的版本； 目前的值有"1.1", "1.2", "1.3" and "1.4".
    </font></pre><b><font color="#000000">例子</font></b><font color="#000000"><br /></font><pre><font color="#000000">&lt;project name="MyProject" default="dist" basedir="."&gt; 

 &lt;!-- set global properties for this build --&gt;
 &lt;property name="src" value="."/&gt;
 &lt;property name="build" value="build"/&gt;
 &lt;property name="dist" value="dist"/&gt; 
    
 &lt;target name="init"&gt;
  &lt;!-- Create the time stamp --&gt;
  &lt;tstamp/&gt;
  &lt;!-- Create the build directory structure used by compile --&gt;
  &lt;mkdir dir="${build}"/&gt;
 &lt;/target&gt;
   
 &lt;target name="compile" depends="init"&gt;
  &lt;!-- Compile the java code from ${src} into ${build} --&gt;
  &lt;javac srcdir="${src}" destdir="${build}"/&gt;
 &lt;/target&gt;
 
 &lt;target name="dist" depends="compile"&gt;
  &lt;!-- Create the distribution directory --&gt;
  &lt;mkdir dir="${dist}/lib"/&gt;
  &lt;!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --&gt;
  &lt;jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/&gt;
 &lt;/target&gt;
 
 &lt;target name="clean"&gt;
  &lt;!-- Delete the ${build} and ${dist} directory trees --&gt;
  &lt;delete dir="${build}"/&gt;
  &lt;delete dir="${dist}"/&gt;
 &lt;/target&gt;
 
&lt;/project&gt;
</font></pre><font color="#000000"><b>Token Filters</b><br /><br />一个project可以有很多tokens，这些tokens在文件拷贝时会被自动扩展，这要求在支持这一行为的task中选择过滤拷贝功能。这一功能可用filter task在buildfile中设定。<br /><br />既然这很可能是一个有危害的行为，文件中的tokens必须采取@token@的形式，这里token是filter task中设定的token名。这种token语法与其他build系统执行类似filtering的语法相同，而且与大多数的编程和脚本语言以及文档系统并不冲突，<br /><br />注意：如果在一个文件中发现了一个@token@形式的token，但没有filter与这个token关连，则不会发生任何事；因此，没有转义方法－但只要你为token选择合适的名字，就不会产生问题。<br /><br />警告：如果你在拷贝binary文件时打开filtering功能，你有可能破坏文件。这个功能只针对文本文件。<br /><br /><b>Path-like Structures</b><br />你可以用":"和";"作为分隔符，指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。<br /><br />当需要指定类似路径的值时，可以使用嵌套元素。一般的形式是<br /></font><pre><font color="#000000"> &lt;classpath&gt;
  &lt;pathelement path="${classpath}"/&gt;
  &lt;pathelement location="lib/helper.jar"/&gt;
 &lt;/classpath&gt;</font></pre><font color="#000000">location属性指定了相对于project基目录的一个文件和目录，而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径－－其他情况下，应该用多个location属性。<br /><br />为简洁起见，classpath标签支持自己的path和location属性。所以：<br /></font><pre><font color="#000000"> &lt;classpath&gt;
  &lt;pathelement path="${classpath}"/&gt;
 &lt;/classpath&gt;</font></pre><font color="#000000">可以被简写作：<br /></font><pre><font color="#000000"> &lt;classpath path="${classpath}"/&gt;</font></pre><font color="#000000">也可通过&lt;fileset&gt;元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。<br /></font><pre><font color="#000000"> &lt;classpath&gt;
  &lt;pathelement path="${classpath}"/&gt;
  &lt;fileset dir="lib"&gt;
   &lt;include name="**/*.jar"/&gt;
  &lt;/fileset&gt;
  &lt;pathelement location="classes"/&gt;
 &lt;/classpath&gt;</font></pre><font color="#000000">上面的例子构造了一个路径值包括：${classpath}的路径，跟着lib目录下的所有jar文件，接着是classes目录。<br /><br />如果你想在多个task中使用相同的path-like structure，你可以用&lt;path&gt;元素定义他们（与target同级），然后通过id属性引用－－参考<a href="http://www.uml.org.cn/j2ee/j2ee091302.htm#writeReference"><font color="#223355">Referencs</font></a>例子。<br /><br />path-like structure可能包括对另一个path-like structurede的引用（通过嵌套&lt;path&gt;元素）：<br /></font><pre><font color="#000000"> &lt;path id="base.path"&gt;
  &lt;pathelement path="${classpath}"/&gt;
  &lt;fileset dir="lib"&gt;
   &lt;include name="**/*.jar"/&gt;
  &lt;/fileset&gt;
 &lt;pathelement location="classes"/&gt;
 &lt;/path&gt;
  &lt;path id="tests.path"&gt;
  &lt;path refid="base.path"/&gt;
  &lt;pathelement location="testclasses"/&gt;
 &lt;/path&gt;
</font></pre><font color="#000000">前面所提的关于&lt;classpath&gt;的简洁写法对于&lt;path&gt;也是有效的，如：<br /></font><pre><font color="#000000"> &lt;path id="tests.path"&gt;
    &lt;path refid="base.path"/&gt;
  &lt;pathelement location="testclasses"/&gt;
 &lt;/path&gt;</font></pre><font color="#000000">可写成：<br /></font><pre><font color="#000000"> &lt;path id="base.path" path="${classpath}"/&gt;</font></pre><font color="#000000">命令行变量<br /><br />有些task可接受参数，并将其传递给另一个进程。为了能在变量中包含空格字符，可使用嵌套的arg元素。<br /><br /></font><table cellspacing="0" cellpadding="2" border="1"><tbody><tr><td valign="top" width="12%"><b><font color="#000000">Attribute</font></b></td><td valign="top" width="78%"><b><font color="#000000">Description</font></b></td><td valign="top" width="10%"><b><font color="#000000">Required</font></b></td></tr><tr><td valign="top"><font color="#000000">value</font></td><td valign="top"><font color="#000000">一个命令行变量；可包含空格字符。</font></td><td align="middle" rowspan="4"><font color="#000000">只能用一个</font></td></tr><tr><td valign="top"><font color="#000000">line</font></td><td valign="top"><font color="#000000">空格分隔的命令行变量列表。</font></td></tr><tr><td valign="top"><font color="#000000">file</font></td><td valign="top"><font color="#000000">作为命令行变量的文件名；会被文件的绝对名替代。</font></td></tr><tr><td valign="top"><font color="#000000">path</font></td><td valign="top"><font color="#000000">一个作为单个命令行变量的path-like的字符串；或作为分隔符，Ant会将其转变为特定平台的分隔符。</font></td></tr></tbody></table><font color="#000000"><br />例子<br /></font><pre><font color="#000000"> &lt;arg value="-l -a"/&gt;</font></pre><font color="#000000">是一个含有空格的单个的命令行变量。<br /></font><pre><font color="#000000"> &lt;arg line="-l -a"/&gt;</font></pre><font color="#000000">是两个空格分隔的命令行变量。<br /></font><pre><font color="#000000"> &lt;arg path="/dir;/dir2:\dir3"/&gt;</font></pre><font color="#000000">是一个命令行变量，其值在DOS系统上为\dir;\dir2;\dir3；在Unix系统上为/dir:/dir2:/dir3 。<br /><br /><b><a name="writeReference"></a>References</b><br /><br />buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块，这一属性就很有用－－如多次使用&lt;classpath&gt;结构。<br /><br />下面的例子：<br /></font><pre><font color="#000000"> &lt;project ... &gt;
  &lt;target ... &gt;    
   &lt;rmic ...&gt;      
    &lt;classpath&gt;        
     &lt;pathelement location="lib/"/&gt;        
     &lt;pathelement path="${java.class.path}/"/&gt;        
     &lt;pathelement path="${additional.path}"/&gt;      
    &lt;/classpath&gt;    
   &lt;/rmic&gt;  
  &lt;/target&gt;
  &lt;target ... &gt;
   &lt;javac ...&gt;
    &lt;classpath&gt;
     &lt;pathelement location="lib/"/&gt;
     &lt;pathelement path="${java.class.path}/"/&gt;
     &lt;pathelement path="${additional.path}"/&gt;
    &lt;/classpath&gt;
   &lt;/javac&gt;
  &lt;/target&gt;
 &lt;/project&gt;</font></pre><font color="#000000">可以写成如下形式：<br /></font><pre><font color="#000000"> &lt;project ... &gt; 
  &lt;path id="project.class.path"&gt;  
   &lt;pathelement location="lib/"/&gt;
   &lt;pathelement path="${java.class.path}/"/&gt;   
   &lt;pathelement path="${additional.path}"/&gt; 
  &lt;/path&gt;
  &lt;target ... &gt;
   &lt;rmic ...&gt;
    &lt;classpath refid="project.class.path"/&gt;
   &lt;/rmic&gt;
  &lt;/target&gt;
  &lt;target ... &gt; 
   &lt;javac ...&gt;
    &lt;classpath refid="project.class.path"/&gt;
   &lt;/javac&gt;
  &lt;/target&gt;
 &lt;/project&gt;</font></pre><font color="#000000">所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。</font></blockquote></div>
		</div>
<img src ="http://www.blogjava.net/rendong/aggbug/61187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-08-01 13:52 <a href="http://www.blogjava.net/rendong/archive/2006/08/01/61187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>