Ant使用指南Java爱好者第1页使用指南本教程来源互连网,仅供学习,版权归原作者及其出版商所有。Ant使用指南Java爱好者第2页第一章入门本教程所讲述的内容在本教程中,您将学习Ant这个JavaTM项目生成工具。由于其灵活性和易用性,Ant很快在Java开发人员中流行开来,因此您有必要了解关于它的更多信息。在继续学习本教程之前,你不需要具备先前的Ant经验或知识。我们将首先查看Ant生成文件(buildfile)的基本结构,并学习如何调用这个工具。我们将逐步完成为一个简单Java项目编写生成文件的步骤,然后考察Ant的其他一些有用功能,包括文件系统操作和模式匹配。最后编写一个扩展Ant功能的自己的Java类来结束本教程。在学习本教程的过程中,我们将同时展示如何从命令行以及从其他开放源代码EclipseIDE运行Ant。试验本教程中的例子不需要同时具备这两种环境;您可以选择其一,甚至选择某种不同的开发环境,只要该环境支持Ant。如果选择从命令行使用Ant,并且Ant还没有安装到机器上,您需要遵循Ant主页上的安装说明。相反,如果决定仅使用Eclipse环境,您不需要单独安装Ant,因为Eclipse已经包括了它。如果还没有Eclipse,您可以从Eclipse.org下载Eclipse。谁应该学习本教程?如果您正在编写Java代码却还没有使用Ant,那么本教程就是为您准备的。不管您当前是否在使用某种不同的生成工具,或者根本就没有使用生成工具,了解关于Ant的更多知识或许会促使您转而使用它。如果已经在使用Ant,那么您仍然可能在本教程中发现一些有趣的东西。或许您会发现一些预料之外或无法完全理解的Ant行为;本教程将会帮助您。或者,也许您熟悉Ant的基础,但是还想知道诸如将生成文件链接起来、使用CVS知识库或编写自定义任务等高级主题;本教程将会介绍所有这些主题。Ant使用指南Java爱好者第3页项目的,但这并不是它唯一的用途。许多人发现它对其他任务也很有帮助。比如以跨平台的方式执行文件系统操作。此外,还有许多可用的第三方Ant任务,而编写自定义的Ant任务也是相对简单的,因此很容易针对特定的应用程序定制Ant。关于作者MattChapman1996是英国Hursley的IBMCentreforJavaTechnology的咨询软件工程师。他过去七年来一直致力于Java技术,包括Java虚拟机实现和各类平台、用户界面工具包Swing和AWT,以及近来为Eclipse平台所编写的工具。Matt拥有计算机科学方面的学位,并且还是一名Sun认证的Java程序员。可通过mchapman@uk.ibm.com与他联系。第二章Ant基础简介本节将概述Ant的功能和优势,并讨论它的历史概况和日渐提高的普及性。然后我们通过考察一个最基础的生成文件的基本结构,直接进入对Ant基础的讨论。我们还会介绍属性和依赖关系的概念。Ant是什么?ApacheAnt是一个基于Java的生成工具。据最初的创始人JamesDuncanDavidson介绍,这个工具的名称是anotherneattool(另一个整洁的工具)的首字母缩写。生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。随着应用程序的生成过程变得更加复杂,确保在每次生成期间都使用精确相同的生成步骤,同时实现尽可能多的自动化,以便及时产生一致的生成版本,这就变得更加重要Ant使用指南Java爱好者第4页了。C或C++中的传统项目经常使用make工具来做这件事情,其中生成任务是通过调用shell命令来执行的,而依赖关系定义在每个生成文件之间,以便它们总是以必需的顺序执行。Ant与make类似,它也定义生成文件之间的依赖关系;然而,与使用特定于平台的shell命令来实现生成过程所不同的是,它使用跨平台的Java类。使用Ant,您能够编写单个生成文件,这个生成文件在任何Java平台上都一致地操作(因为Ant本身也是使用Java语言来实现的);这就是Ant最大的优势。Ant的其他关键优势包括其突出的简单性和无缝地使用自定义功能来扩展它的能力。但愿您在完成本教程其余内容的学习之后,会欣赏Ant的这些优势。Ant简史Ant最初是Tomcat的一个内部组件,Tomcat是JavaServlet和JavaServerPages(JSP)参考实现中使用的servlet容器。Tomcat代码基被捐赠给了Apache软件基金会;在那里它又成了ApacheJakarta项目的组成部分,该项目致力于为Java平台产生开放源代码的服务器端解决方案。Ant的有用性很快得到了认可,对它的使用遍布在其他Jakarta子项目中。因而,它自己也成了一个Jakarta子项目,其第一个独立版本于2000年7月发布。从那以后,Ant的普及性已经不断地提高。它赢得了无数的行业大奖,并成为用于生成开放源代码Java项目的事实上的标准。2002年11月,这些成功得到了确认,Ant被提升为顶级Apache项目。在本文编写之际,Ant的当前稳定版本是1.5.4,它支持1.1以后的所有JDK版本。下一个版本(即1.6版)的beta版也已经可用,这些版本需要JDK1.2或更高版本。未来的2.0版也正在计划之中,它将涉及一次重大的体系结构重新设计。Ant2.0将以改进的一致性和增强的功能为特色,同时仍然保持Ant的简单性、易于理解性和可扩展性等核心目标。Ant生成文件剖析Ant使用指南Java爱好者第5页没有定义它自己的自定义语法;相反,它的生成文件是用XML编写的。存在一组Ant能够理解的预定义XML元素,而且就像您将在下一节中看到的一样,还可以定义新的元素来扩展Ant的功能。每个生成文件由单个project元素组成,该元素又包含一个或多个target元素。一个目标(target)是生成过程中已定义的一个步骤,它执行任意数量的操作,比如编译一组源文件。这些操作本身是由其他专用任务标签执行的,我们将在后面看到这一点。然后这些任务将根据需要被分组到各个target元素中。一次生成过程所必需的所有操作可以放入单个target元素中,但是那样会降低灵活性。将那些操作划分为逻辑生成步骤,每个步骤包含在它自己的target元素中,这样通常更为可取。这样可以执行整体生成过程的单独部分,却不一定要执行其他部分。例如,通过仅调用某些目标,您可以编译项目的源代码,却不必创建可安装的项目映像。顶级project元素需要包含一个default属性,如果在Ant被调用时没有指定目标,这个属性将指定要执行的目标。然后需要使用target元素来定义该目标本身。下面是一个最基本的生成文件:?xmlversion=1.0?projectdefault=inittargetname=init/target/project注意这是一个结构良好的XML文档,其中一个XML声明指定了所使用的XML的版本(这不是当前的Ant所必需的,但是这样做是一个好习惯),而且每个元素都正确地关闭了。一次性打开和关闭一个元素也是可以做到的。因此,与其像上面那样对target元素使用单独的起始和结束标签,我们可以将它写为如下形式:targetname=init/当元素没有包含任何内容时,更简练的形式会更清晰。添加描述:我们在前一小节中看到的生成文件是优雅简练的,但它并没有包含多少关于正在生成的实际项目的信息。可以通过许多方式来使它更具描述性,同时无需改变其功能。下面是一个例子:Ant使用指南Java爱好者第6页=1.0?projectdefault=initname=ProjectArgondescriptionAsimpleprojectintroducingtheuseofdescriptivetagsinAntbuildfiles./description!--XMLcommentscanalsobeused--targetname=initdescription=InitializeArgondatabase!--performinitializationstepshere--/target/project可以看出,XML注释可以使用在整个生成文件中以提高清晰性。而且,Ant定义了它自己的description元素和description属性,它们可用于提供更结构化的注释。属性Ant中的属性类似编程语言中的变量,它们都具有名称和值。然而与通常的变量不同,一经设置,Ant中的属性就不可更改;它们是不可变的,就像Java语言中的String对象。这起初看来似乎很有限制性,但这样是为了遵循Ant的简单原则:毕竟,它是一个生成工具,而不是一种编程语言。如果尝试给某个现有属性赋予一个新的值,这不会被看作是一个错误,但是该属性仍然会保留其现有值。(我们将会看到,这种行为是有用的。)基于元素的描述性名称和到目前为止所见到的属性,在Ant中用于设置属性的机制看起来如下就没有什么奇怪了:propertyname=metalvalue=beryllium/为了在生成文件的其他部分引用这个属性,您会使用以下语法:${metal}例如,为了使用这样一个值,它是另一个属性的值的组成部分,您会将标签写为下面这样:propertyname=metal-databasevalue=${metal}.db/Ant使用指南Java爱好者第7页中有许多预定义的属性。首先,Java环境设置用于运行Ant的所有系统属性,均可作为Ant属性使用,比如${user.home}。除了这些属性之外,Ant还定义了它自己的一小组属性,包括${ant.version},这个属性包含Ant的版本;以及${basedir},这个属性是项目目录的绝对路径(由包含生成文件的目录所定义,或者由project元素的可选basedir属性所定义)。属性经常用于引用文件系统上的文件或目录,但是对于使用不同路径分隔符(例如,/与\)的平台来说,这样可能在跨越不同平台时导致问题。Ant的location属性专门设计用于以平台无关的方式包含文件系统路径。您会像下面这样使用location来代替value:propertyname=database-filelocation=archive/databases/${metal}.db/用于location属性的路径分隔字符将被转换为当前平台的正确格式;而且由于文件名是相对的,它被认为是相对于项目的基目录。我们同样可以容易地写为下面这样:propertyname=database-filelocation=archive\databases\${metal}.db/这个标签的两个版本都会在不同的平台具有相同的行为。如果可移植性是必需的,唯一要避免的内容就是文件名中的DOS风格的驱动器号。在可能的地方使用相对路径名称而不是绝对路径名称,这样还会更加灵活。定义依赖关系生成一个项目一般需要许多步骤——例如首先要编译源代码,然后将它打包为Java归档文件(JavaArchiveFile,JAR)。这其中许多步骤都具有清楚定义的顺序——例如,在编译器从源代码生成类文件之前,您不能打包类文件。与顺序指定target所不同的是,Ant采用一种更灵活的方法来定义依赖关系,就像make和类似的生成工具所做的那样。每个目标的定义依据的是在它在能够执行之前必须完成的其他所有目标。这是使用target元素的depends属性来实现的。例如:t