您的当前位置:首页Ant入门与进阶

Ant入门与进阶

2023-11-19 来源:爱问旅游网


第一讲 Ant入门

1

1 Ant介绍

1.1 Ant的起源

Ant的作者James Duncan Davidson 给《Ant权威指南》一书做过评论,现在我们就引用这段评论来说明Ant的起源。

1998年,有一位程序员改变了整个Java 世界。James Duncan Davisdson在试图使用当时的构建工具(GNU Make、批处理文件和shell脚本)来创建一个跨平台的Tomcat构建时,做了多种努力均不能成功。因此,他在从欧洲飞回美国的途中设计出了自己的 构建实用工具,并为命名为Ant,因这是一个小东西,但却能做大事。James为了解决自己的问题(即创建一个跨平台的构建)而提出的这种快速而简单的解决方案已经演变成Java环境中应用最为广泛的构建管理工具。

如果你在用Java进行开发,而没有使用Ant,那么确定应该拥有这本不算厚的书。Ant是一个可靠的、跨平台的构建工具,它可以充分利用Java环境的优势。Ant本身也是用Java编写的,它可在多个平台(如Unix、Linux以及Windows等等)上工作,因此如果你要转换开发平台,那么学习 Ant是值得的,Ant很容易扩展。在你的工程中,目前是否存在某个需求,而所有Ant功能对此都不能予以满足呢?没有问题!你完全可以像James一 样,编写自己的Ant任务。没准儿你也能改变这个世界呢! 以上是使用Ant可以完成的一些工作:

·定义构造块、它们必须产生的结果以及它们之间的依赖关系; ·自动地由诸如CVS等源代码控制系统获取源代码;

·不仅可令Ant以适当的顺序编译必要的源文件,而且还可生成部署都所必需的JAR文件,由此完成应用的构造; ·仅需由一个构造文化(或一组构建文件)即可完成以上所有工作,而构建文件在Ant支持的所有平台上都会有同样的表现。

要进行eXtreme(极限)编程吗?Ant就是一个必备工具,利用它可以方便地完成频繁的构建,以此又将有利于使用JUnit和相关技术进行测试驱动的开发。

Ant构建文件是XML编写的,这是一种良构标准,因此可以确保使用Ant并不需要学习另一种脚本语言。Ant是一个开源工程,这是Apache软件基金会所投资的Jakarta工程的一部分。

“Jesse和Eric可以教你如何使用当前的Ant,他们做得相当棒。这本书提供了颇有深度的信息,对于一些以往从未考虑到的工作,书中还介绍了如何扩 展Ant来完成这些工作的详细内容。不论你是偶尔使用Ant,还是需要管理各种大型工程,这都是一本需要持之在手的工具书。”

—James Duncan Davidson,Ant的创造者

1.2 什么是Ant

Apache Ant 是一个将软件编译、测试、部署等步骤联系在一起加以优化的一个构建工具,常用

于Java环境中的软件开发。Ant的默认配置文件是build.xml。

1.3 什么是构建

形象的说,构建就是把代码从某个地方拿来、编译、再拷贝到某个地方去等操作,当然不仅于此,但是主要用来干这个。

2

1.4 Ant的优势

(1)跨平台:因为 ant 是使用 java 实现的,所以跨平台;

(2)使用简单:比其他构建工具简单,特别是和 ant 的兄弟 make 做比较; (3)语法清晰:同样是和 make 做比较;

(4)功能强大:Ant能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。当你需要自己开发一些 ant 插件的时候,你会发现它更多的功能。

Ant于Make的区别:make是一个类似于Ant的构建工具,不过make应用于C/C++,Ant则主要应用于java。当然这不是一定的,当大部分人如此。

3

2 Ant环境配置

2.1 下载

首先到 http://ant.apache.org/bindownload.cgi 下载Ant,目前的最新版本是1.8.1

我们可以下载最新的版本,也可以点“here”去下载历史版本。我们以最新的版本apache-ant-1.8.1来做演示。

2.2 配置环境变量

第一步:解压。我们以C:\\java\\apache-ant-1.8.1为例;

把上面下载的apache-ant-1.8.1-bin.zip解压到 C:\\java\\apache-ant-1.8.1; 新增系统变量:ANT_HOME,内容:C:\\java\\apache-ant-1.8.1;

第二步:增加环境变量。

在PATH环境变量中加入Ant的bin目录:%ANT_HOME%\\bin;

如果要让Ant能支持JUnit,需要直接将JUnit的junit.jar放置在Ant的lib目录,并记得修改变量CLASSPATH中原先有关于JUnit的设定,例如:%ANT_HOME\\lib\\junit.jar,虽然也有其它的方式可以设定,但这是最快最简单的方法。以下是windows中的设置,请看图:

4

依赖库说明(简单看下)

如果你需要执行特定的task,你需要将对应的库放入CLASSPATH或放到Ant安装目录的lib目录下。

Jar Name Needed For Available At jakarta-regexp-1.2.jar jakarta-oro-2.0.1.jar junit.jar stylebook.jar testlet.jar antlr.jar bsf.jar netrexx.jar rhino.jar jpython.jar netcomponents.jar

regexp type with mappers jakarta.apache.org/regexp/ regexp type with mappers and jakarta.apache.org/oro/ the perforce tasks junit tasks stylebook task test task antlr task script task netrexx task javascript with script task python with script task ftp and telnet tasks www.junit.org CVS repository of xml.apache.org java.apache.org/framework www.antlr.org oss.software.ibm.com/developerworks/ projects/bsf www2.hursley.ibm.com/netrexx www.mozilla.org www.jpython.org www.savarese.org/oro/downloads 2.3 运行Ant

运行Ant非常简单,正确安装后,只要在命令行下输入ant就可以了。

开始-->运行-->cmd,进入命令行-->键入 ant 回车,如果看到 看到如下信息: Buildfile: build.xml does not exist! Build failed 说明配置成功。 没有指定任何参数时,Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile,直至到达文件系统的根。要想让Ant使用其他的buildfile,可以用参数 -buildfile file,这里file指定了你想使用的buildfile。

我们也可以设定一些属性,以覆盖buildfile中指定的属性值。可以用 -Dproperty=value 选项,这里property是指属性的名称,而value则是指属性的值。我们也可以用这种办法来指定一些环境变量的值,再使用property task来存取环境变量。如-Daaa=aaa传递给Ant,我们就可以在我们的 buildfile中用${aaa}来存取这些环境变量。

5

还有两个选项 -quite,告诉Ant运行时只输出少量的必要信息。而 -verbose,告诉Ant运行时要输出更多的信息。

可以指定执行一个或多个target。当省略target时,Ant使用标签的default属性所指定的target。如果有的话,-projecthelp 选项输出项目的描述信息和项目target的列表。先列出那些有描述的,然后是没有描述

的target。

命令行选项总结:

ant [options] [target [target2 [target3] ...]] Options: -help print this message -projecthelp print project help information -version print the version information and exit -quiet be extra quiet -verbose be extra verbose -debug print debugging information -emacs produce logging information without adornments -logfile file use given file for log output -logger classname the class that is to perform logging -listener classname add an instance of class as a project listener -buildfile file use specified buildfile -find file search for buildfile towards the root of the filesystem and use the first one found -Dproperty=value set property to value 例子:

ant 使用当前目录下的build.xml运行Ant,执行缺省的target。 ant -buildfile test.xml 使用当前目录下的test.xml运行Ant,执行缺省的target。 ant -buildfile test.xml dist 使用当前目录下的test.xml运行Ant,执行一个叫做dist的target。 ant -buildfile test.xml -Dbuild=build/classes dist 使用当前目录下的test.xml运行Ant,执行一个叫做dist的target,并设定build属性的值为build/classes。

6

3 Ant核心概念简介

XML:构建文件是以XML文件来描述的。 project:每个构建文件包含一个工程。

depends:每个工程包含若干个目标(target)。目标可以依赖于其他的目标。 task:目标包含一个或多个任务(task)。

易于扩展:易于使用Java语言增加新的任务:(自定义)。 语法简单:构建文件短小精悍,语法直观且易于理解。

7

4 Ant初体验

就像每个语言都有HelloWorld一样,一个最简单的应用能让人感受一下Ant。接下来我们将假想一个需求,再针对这个需求,写一个Ant脚本完成该需求。

4.1 假想一个需求

(1)编写一个程序 (2)编译它们

(3)把这个程序打成jar包 (4)把他们放在应该放置的地方

(5)运行它们

首先看下目录结构。 目录结构图示

目录结构文字说明

在建立build.xml文件之前,我们先说下目录结构: 工程主目录: C:\\course\\ant\\demo 源程序目录: \\src

编译后的 class文件目录:\\classes 打包好的jar程序目录:\\hello.jar 工程配置文件:\\build.xml

4.2 写第一个Ant配置文件

上面定义了需求,这一节主要是建立一个build.xml文件完成上面的步骤。

首先,我们使用文本编辑器写第一个程序:HelloWorld.java package test.ant; public class HelloWorld {

8

public static void main(String[] args) System.out.println(“hello world”); } }

再建立一个build.xml文件完成上面的步骤,内容如下:

9

4.3 解释以上Ant配置文件

Ant的所有内容必须包含在这个里面,name是我们给它取的名字, basedir看名字就知道是工作的根目录。其中的”.”代表当前目录。 default代表默认要做的事情。 类似程序中的变量,想一下变量的作用 就知道为什么要这么做了 目的:创建一个文件夹。 把我们想做的每一件事写成一个target,它有一个名字。使用mkdir来创建文件夹。 将第一个target命名为init,是一个很好的做法,其他的target依赖这个初始化target。 目的:编译程序,把源程序编译到目标地点。 depends 是它所依赖的target,在执行这个compile的target之前,ant会先检查init是否已经被执行过,如果执行过,着直接执行compile,如果没有执行过,就会执行它依赖的target,然后再执行本身的target。 目的:打jar 包

10

目的:运行jar包内的程序 目的:删除生成的文件 目的:再次运行,这里显示了如何在一个 target 里边调用其他的 target 步骤再重申一遍:

(1) 建一个src文件夹,然后写一个HelloWorld.java,按照包结构目录放进去; (2) 写build.xml文件

(3) 在命令行输入 cmd, ant做测试。

我们会发现上面的任务一个接一个的完成了。每次修改代码只要再次键入ant

另外,我们有时候并不想运行默认的任务,或者想执行任意的步骤, 例如只想执行编译,则键入 ant compile

ant 中的每一个任务都可以这样执行,ant + target name 讲到这里,一个简单的任务已经完成,大家动手去体验一下Ant吧。

11

5 参考文献

1、http://www.apache.org

作者: Jesse Tilly, Eric M. Burke著, James Duncan Davidson序,林琪 译

Ant 官方手册,文中大量引用了Ant 官方手册中的例子 2、《Ant权威指南》

出版: 2003年7月 第2讲Ant进阶

12

1 回顾上一讲

学习了上一讲,相信已经激起大家的兴趣,或许还有不少感触。当然上一讲我们只了解了Ant的九牛一毛,这一讲将会更加深入的介绍Ant的方方面面。

13

2 核心概念详解

2.1 project属性

首先看上一讲中的例子: 可以看出project有下面的属性: Attribute name default basedir Description 项目名称,可自由定义。 定义一个缺省(默认)的target,当我们执行没有指定target的build.xml时,就会执行这个缺省的target。 用于定义项目的基路径。 表示项目的描述 Required 否 是 否 否 description

项目的描述以一个顶级的元素的形式出现。

2.2 property属性

一个项目可以有很多的property。可以在buildfile中用property task来设定,或者在ant之外设定。一个property有一个名字和一个值。Property可以用于task的属性值。这是通过将属性名放在“${}”之间并放在属性值的位置来实现的。例如有一个property builddir的值是“build”,这个property就可用于属性值:${builddir}/classes。这个值就可被解析为 build/class。

典型的如第一讲中的例子, 首先设定property:

然后在其他地方引用property: 2.3 内置属性

如果你使用了定义了所有的系统属性,Ant允许你使用这些属性, 例如${os.name}对应操作系统的名字。

要想得到系统属性的列表可以参考the javadoc of System.getProperties。 使用如下测试代码可以查看一下: public void testProperties() { 14

} Properties p = System.getProperties(); for (Enumeration e = p.propertyNames(); e.hasMoreElements();) { } String key = (String)e.nextElement(); System.out.println(key + \": \" + p.getProperty(key) ); 上面的代码就不做详细描述了,这些应该是看这个文档的人应该能看懂的。

除了Java的内置属性外,Ant还定义了一些自己的内置属性:

Attribute basedir ant.file ant.version ant.propertie.name ant.java.version ……

basedir属性一样 buildfile的绝对路径 ant的版本 当前执行的project的名字,由的name属性设定 ant 检测到的jvm版本。 …… Description 可以理解为project项目的绝对路径,于中的2.4 target属性

还是看上一讲中的例子: , target可以有如下几个属性。 Attribute name depends if unless description

target的名字。 用逗号分隔的target的名字列表,也就是依赖列表 执行target需要清除设定的属性名 执行target需要清除设定的属性名 描述target的功能,这些描述可由-projexthelp 命令行输出。 Description Required 是 否 否 否 否 2.4.1 depends

target中的depends属性指定了target 的执行顺序,也就是说一个target可以依赖其他的target。Ant会依照depends属性中的target出现顺序依次执行每个target。在执行前,首先需要

执行它所依赖的target。

例如,有一个用于编译的target,一个用于生成执行文件的target。在生成执行文件之前必须先编

15

译通过,所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。

我们还要注意到,Ant的depends属性只指定了target应该被执行的顺序。如果被依赖的target无法运行,这种 depends对于指定了依赖关系的其他target没有影响。

Ant会依照depends属性中target出现的顺序依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。看下面的例子。

假设我们默认的target是D,因为D依赖于C,C依赖于B,B依赖于A。所以先执行A,再执行B,然后是C,最后D被执行。 还可以写为这样的格式: ,执行顺序和上面的一样。

另外,一个target只能执行一次,即使有多个target依赖于它,也只执行一次。

2.4.2 if / unless

如果执行某个target,由某些属性是否被设定来决定。这样,就能根据系统的状态(java version, OS, 命令行属性定义等等)来更好的控制build的过程。要想让一个target这样做,你就应该在target元素中,加入if或unless 属性,带上target应该有所判断的属性。看下面的例子。

如果没有if或者else,target总会被执行。

2.5 task属性

一个task是一段可执行的代码。task可以有多个属性(也可以叫变量)。属性值可能包含对property还是看上一讲中的例子: 其中的 就是一个task。 其中的 ${src} 就是对前面定义的property的引用。再执行javac 之前这些${*}的引用。这些应用会在task执行前被解析。

会被解析。

下面是task的一般构造形式:

这里name是task的名字,attribute是属性名,value是属性值。

另外,我们可以使用内置的task和一些可选的task,我们也可以编写自己的task。

16

17

3 Ant常用task

3.1 设置classpath

(1)当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是

location属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径--其他情况下,应该用多个location属性。 注意:你可以用\":\"和\";\"作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。

为简洁起见,classpath标签支持自己的path和location属性。所以: 可以被简写作:

(2)也可通过元素指定路径。构成fileset的多个文件加入classpath的顺序是未定的。

上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着是${dest}目录。

(3)References

如果我们想在多个task中使用相同的classpath,可以用元素定义它们(与target同级),然后通过id属性引用

buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块,这一

18

属性就很有用--如多次使用结构。

下面的例子: rmic代表任意一个task …… 可以写成如下形式:

19

3.2 使用classpath

3.3 输出信息

可以有多种输出信息的写法: 写法1: 输出一段话

写法2:输出一段话 XXXXXX

写法3:输出一段XML foo

20

3.4 设置property

(1)设置属性name-value

(2)读取属性文件中的属性配置

(3)读取网络中的 property-set

(4)读取文件中的属性配置

(5)读取环境变量

(6)读取属性文件中的属性,并作为全局引用

3.5 引入properties文件

读取properties文件中的属性配置

首先在项目路径下增加一个build.properties文件,用于提取设置公共的属性 比如针对上一讲中的 首先我们可以在 build.properties中这么写 src = src dest = dest hello_jar = hello.jar 然后在build.xml中这样去修改:

21

3.6 引入XML文件

读取XML文件中的属性配置

首先在项目路径下增加一个build_include.xml文件,用于提取设置公共的属性, 比如针对上一讲中的,内容如下

首先我们可以在 build_include.xml中这么写

然后在build.xml中这样去修改: ]> ……. 这个时候,我们只要在 include.xml 添加 propery,添加target, 这个build.xml 会自动添加这些propery 和 target。

看下面的引用

build.xml中的可以修改peoperty设置

上面的${src}、${dest}、run就是引用xml中的target。

3.7 复制文件与目录

该标签用于删除一个文件或一组文件,其属性如下: (1) file表示要删除的文件。 (2) dir表示要删除的目录。

(3) includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。 (4) failonerror 表示指定当碰到错误是否停止,默认值是自动停止。

(1)复制一个文件到当前目录,并重命名;

(2)复制一个文件到指定目录;

(3)复制一个文件到指定位置(使用copyfile);

(4)复制一个文件集合到一个目录;

(5)复制一个文件集合到一个目录,但不包含某些文件; 第一种写法:

23

第二种简便写法:

(6)复制一个文件集合到一个目录,同时建立备份文件;

(7)复制一个文件集合到一个目录,并替换掉其中的字符,如替换掉@TITLE@; 这里演示的是通过Ant批量转换文件的内容:设定ant 的filter token, 把该文件目录下的所有文件内的“@TITLE@”, 替换为\"Foo Bar\"

(8)复制一个目录到另一个目录

(使用copydir,include包含和excludes排除);

3.8 删除文件与目录

该标签用于删除一个文件或一组文件,其属性如下: (1) file表示要删除的文件。

24

(2) dir表示要删除的目录。

(3) includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。 (4) failonerror 表示指定当碰到错误是否停止,默认值是自动停止。

(1)删除一个文件

(2)删除一个目录

(3)删除一个目录下符合规则的文件,包括子目录。这里是删除.bak文件

(4)删除一个目录下所有文件和目录,包括当前目录 也可以写成

(5)删除当前目录下所有的svn相关文件

通常情况下,svn 文件默认是 excludes 的,所以这里要设置一下

(6)删除文件目录树

3.9 剪切文件、文件集合、目录

25

3.10 重命名文件、文件集合、目录

3.11 建立临时文件

建立一个文件名称为temp.xml,后缀为.bak的文件

3.12 touch的使用

touch主要是用于修改最后访问时间

(1)如果文件不存在,创建文件,如果存在,更改最后访问时间为当前系统时间

(2)如果文件不存在,创建文件,更改最后访问时间为11/21/2010 2:02 pm

(3)如果文件不存在,创建文件,更改最后访问时间为11/21/2010 2:02 pm

3.13 condition的使用

,,等 tag

26

3.14 替换replace

3.15 available 的使用

Available主要用于判断 某个文件是否存在,再决定某个属性为true还是false。 (1)如果类存在,则设置属性 Myclass.present 为 true,如果没有就 false

(2)如果文件存在则设置属性 jaxp.jar.presen 为 true,否则为 false

(3)如果目录存在,则设置属性为 true,否则为 false

(4)如果 classpath 下寻找 class,如果存在则设置属性为 true,否则为 false

在工程 tag 下定义 path,在 target 中使用 ...in project ... ...in target ...

27

(5)如果在 classpath 下发现文件则设置属性为 true 否则为 flase

3.17 显示错误

(1)显示错误方式一

Something wrong here.

(2)显示错误方式二

(3)如果这个属性不存在显示错误

(4)如果这个属性存在显示错误

(5)如果符合条件显示错误,这里的条件是(没有设置属性)

3.18 建立目录

建立一个目录

28

3.19 执行程序(cmd命令)

3.20 编译程序(执行javac)

注:Ant的Target (Target 亦如此)默认是调用运行Ant本身的JVM的编译器,然而如果你想要单独地调用编译器——比如你要使用一个高级别的 编译器——你可以使用

3.21 制作文档(执行javadoc)

29

3.22 打jar包

或者

3.23 运行jar包

(1)带参数运行 最简单的运行jar包 传递参数运行

(2)设置运行的JVM再运行 30

jar=\"${exec.dir}/dist/test.jar\" fork=\"true\" failonerror=\"true\" maxmemory=\"128m\" >

3.24 运行SQL

第一种: insert into user values(10000, 'pzp', '123', 'pzpyp@163.com'); 第二种 其中的classpath 可以用如下方式替代

31

3.25 发送邮件

The ${buildname} nightly build has completed

3.26 发布程序

如把程序部署到web服务器

3.27 Filter的使用

(1)利用 Ant 提供的 filter 任务替换属性值。

现在根据不同环境的需要,对某些配置文件的值做一些替换。在 Ant 中,提供了 filter 任务,使得替换值很方便。filter 主要用来在同一行内容中的替换,而正则表达式一下子可以替换多行内容。filter 的使用例子:

把所有的@aaaa@替换成 bbbb

32

这段脚本的意思就是在 src.dir 目录下的所有文件中,如果有预先定义好的\"@aaaa@\"占位符的话,在拷贝到 dest.dir 目录后,所有的占位符都被替换成了\"bbbb\"。

替换属性文件中的内容

我们也可以将所有被替换的值放到某个属性文件中,filter 任务将属性文件中的每一个条目读出来并且设置成一个 Filter。如下所示:

上面的脚本表示所有在 deploy_env.properties 中出现的条目将被作为一个 filter,在拷贝到 dest.dir 目录后,所有 src.dir 目录中存在的占位符将被替换成 deploy_env 中的值。

3.28 Length的使用

把字符串”foo”的长度保存到属性\"length.foo\"中

把文件” bar”的长度保存到属性\" length.bar \"中

3.29 输入input

提示消息\"Please enter db-username,然后把用户的输入赋值给 db.user 如果没有输入则有默认值 Scott-Tiger

33

3.30 target之间的调用

在一个target中调用另外一个targetcall

(1)使用调用另外一个target 可以写成 (2)使用antcall调用另外一个target

3.31 调用其他目录下的 ant.xml

调用目录 aaa/bbb/下的 build.xml

第一种写法: 第二种写法: 第三种写法:

调用指定文件中的制定target

3.33 压缩、解压缩zip包

压缩zip文件、

34

excludes=\"**/todo.html\" />

解压缩zip文件

3.34 打tar包、解tar包

打 tar 包

解 tar 包

3.35 打war包、解war包

打war包

35

解war包:我们首先得建立一个目录(这里是 unpack)用来存放解压后的文件。Ant 中提供了 unzip 命令用来解压 ear/war/jar 包。除了这个目录外,根据不同的目标环境,在运行目录下建立一个与目标环境相对应的目录,重新打好的 war 包就放在这个目录下,比如针对场景中的情况,如果需要创建一个产品环境下的部署包,我们可以建立一个 TestWebProduct 目录,目录名写在配置文件中(${pack.base.dir})。

init in deploy unpack the ${war.name} 在 init 段中首先删除掉上次解压的目录和目标打包目录,然后重新建立目录;在 unpack 中,首先将编译好的默认 war 包拷贝至 unpack 定义的目录,解压之后把 unpack 下的 war 包删除。下面是这时候对应的属性文件。

3.36 打ear包

打ear 包

36

3.37 Ant控制流程(if…else…)

在 ant 中控制流程(if else )

37

4 实例分析

为了演示大部分Ant target,笔者特地写了一个web工程, 放在本文档的同级目录下:antdemo-web

下面就是一个比较完整的build.xml,大家可以做借签。

38

39

haltonfailure=\"false\" failureproperty=\"tests.failed\" showoutput=\"true\">

40

DROP database IF exists login1; CREATE database login1; use login1; create table user( user_id int(11) auto_increment, user_name varchar(50) not null, user_pass varchar(50) not null, email varchar(100), primary key(user_id), unique(user_name) ); insert into user values(10000, 'pzp', '123', 'pzpyp@163.com');

41

跟以上脚本配套的实际项目放在,大家可以直接打开来查看

42

5 Ant调用第三方软件的实例

5.1 Ant调用Junit的实例

Ant集成junit,必须把junit.jar引入到classpath中。在命令行中就必须把junit.jar引入到ant/lib/下

5.2 Ant调用SVN的实例

(1)Ant本身不支持SVN,所以需要svnant任务插件支持,才能在ant脚本中获取svn中的内容, Tigris.org提供了Subclipse,SvnClientAdapter和SvnAnt。网址:http://subclipse.tigris.org/index.html, Subclipse是一个Eclipse的插件,实现了IDE与Subversion得集成;

SvnClientAdapter是Subversion的一套Java API,封装了客户端对Subversion的一些访问操作; SvnAnt是用于访问Subversion的Ant任务,其依赖于SvnClientAdapter。

43

(2) 它的URL是:http://subclipse.tigris.org/svnant.html, 这里使用的是svnant-1.2.1版本,使用前需要将它依赖的类库放在ant安装目录下面的lib目录;

(3)要想使用svnant中的任务访问svn的话,首先要求svnant.jar在系统classpath中

(4)由于是每日构建,需要每天将最新版本的程序更新下来,因此这里使用的是export任务,而不是checkout。

这里将javahl设为true是为了使用纯java实现的svn访问中间层,而不是使用svn的二进制命令行客户端。 需要注意的是,export命令也好,checkout命令也好,都不允许将本地目录和SVN的一个以上的url关联,也就是说无法将svn上的两个以上目录 的内容导出到本地的一个目录。

其实,ant还可以集成 CVS,FTP,Axis等等,就不一一举例了,请需要的时候去查找相关资料。

44

6 实践出真知

掌握了上面的那些内容后,应该知道如何去写一个好的Ant build了,但当你真的想去做的时候,你可能写不出好的 build.xml,因为你对Ant提供的默认命令知道得太少了。这个时候如果你想完成任务,并提高自己,有很多办法:

(1)很多开源的程序都带有 build.xml,看看它们如何写的

(2)Ant 的 document,里边详细列写了 Ant 的各种默认命令,及其丰富 (3)google,永远不要忘记它

OK,在这之后随着你写的 Ant build 越来越多,你知道的命令就越多,ant 在你的手里也就越来越强大了。这个是一个慢慢积累的过程。

45

7 QA

问题一:如果执行 Ant 过程中出现 Outofmemory 的错误怎么办? 答:加大内存,设置环境变量 ANT_OPTS=-Xms128m -Xmx256m

(1)在ant.bat文件中增加缓存,追加-Xms128m -Xmx256m参数:

(2)使用eclipse运行ant时,应如下设定参数:

build.xml文件右键-〉运行-〉外部工具-〉选择JRE页-〉VM参数处设定 -Xms128m -Xmx256m即可。

java

-Xms128m

-Xmx256m

-classpath

\"%ANTCLASSPATH%\"

org.apache.tools.ant.Main %ANT_ARGS%

46

8 参考文献

1、http://www.apache.org

2、《Ant权威指南》

ant 官方手册,文中大量引用了 ant 官方手册中的例子

作者: Jesse Tilly, Eric M. Burke著, James Duncan Davidson序,林琪 译 出版: 2003年7月

47

因篇幅问题不能全部显示,请点此查看更多更全内容