2024年3月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的默认配置文件是。

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 下载

首先到 / 下载Ant,目前的最新版本是1.8.1

我们可以下载最新的版本,也可以点“here”去下载历史版本。我们以最新的版本

apache-ant-1.8.1来做演示。

2.2 配置环境变量

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

把上面下载的解压到 C:javaapache-ant-1.8.1;

新增系统变量:ANT_HOME,内容:C:javaapache-ant-1.8.1;

第二步:增加环境变量。

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

如果要让Ant能支持JUnit,需要直接将JUnit的放置在Ant的lib目录,并记得修改

变量CLASSPATH中原先有关于JUnit的设定,例如:%ANT_,虽然也有

其它的方式可以设定,但这是最快最简单的方法。以下是windows中的设置,请看图:

4

依赖库说明(简单看下)

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

Jar Name Needed For Available At

regexp type with

/regexp/

mappers

regexp type with

mappers and the /oro/

perforce tasks

junit tasks

stylebook task

test task

antlr task

script task

netrexx task

javascript

script task

with

CVS repository of

/framework

/developerworks/

projects/bsf

/netrexx

python with script

task

ftp and telnet

/oro/downloads

tasks

2.3 运行Ant

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

开始-->运行-->cmd,进入命令行-->键入 ant 回车,如果看到

看到如下信息:

Buildfile: does not exist!

Build failed

说明配置成功。

没有指定任何参数时,Ant会在当前目录下查询文件。如果找到了就用该文件作为buildfile。

如果你用

-find

选项。Ant就会在上级目录中寻找buildfile,直至到达文件系统的根。要想让Ant使用其

5

他的buildfile,可以用参数

-buildfile file

,这里

file

指定了你想使用的buildfile。

我们也可以设定一些属性,以覆盖buildfile中指定的属性值。可以用

-Dproperty=value

选项,这里

property

是指属性的名称,而value则是指属性的值。我们也可以用这种办法来指定一些环境变量的值,再

使用property task来存取环境变量。如-Daaa=aaa传递给Ant,我们就可以在我们的 buildfile中用

${aaa}来存取这些环境变量。

还有两个选项 -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

使用当前目录下的运行Ant,执行缺省的target。

ant -buildfile

使用当前目录下的运行Ant,执行缺省的target。

ant -buildfile dist

使用当前目录下的运行Ant,执行一个叫做dist的target。

ant -buildfile -Dbuild=build/classes dist

使用当前目录下的运行Ant,执行一个叫做dist的target,并设定build属性

的值为build/classes。

6

7

3 Ant核心概念简介

XML:构建文件是以XML文件来描述的。

project:每个构建文件包含一个工程。

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

task:目标包含一个或多个任务(task)。

易于扩展:易于使用Java语言增加新的任务:(自定义)。

语法简单:构建文件短小精悍,语法直观且易于理解。

8

4 Ant初体验

就像每个语言都有HelloWorld一样,一个最简单的应用能让人感受一下Ant。接下来我们将假

想一个需求,再针对这个需求,写一个Ant脚本完成该需求。

4.1 假想一个需求

(1)编写一个程序

(2)编译它们

(3)把这个程序打成jar包

(4)

把他们放在应该放置的地方

(5)运行它们

首先看下目录结构。

目录结构图示

在建立文件之前,我们先说下目录结构:

工程主目录: C:courseantdemo

源程序目录: src

编译后的 class文件目录:classes

打包好的jar程序目录:

工程配置文件:

目录结构文字说明

4.2 写第一个Ant配置文件

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

首先,我们使用文本编辑器写第一个程序:

package ;

public class

HelloWorld {

9

public static void main(String[] args)

n(“hello world”);

}

}

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

10

4.3 解释以上Ant配置文件

Ant的所有内容必须包含在这个里面,name是我们给它取的名字,

basedir看名字就知道是工作的根目录。其中的”.”代表当前目录。

default代表默认要做的事情。

类似程序中的变量,想一下变量的作用 就知道为什么要这么做了

目的:创建一个文件夹。

把我们想做的每一件事写成一个target,它有一个名字。使用mkdir来创建文件夹。

将第一个target命名为init,是一个很好的做法,其他的target依赖这个初始化target。

目的:编译程序,把源程序编译到目标地点。

depends 是它所依赖的target,在执行这个compile的target之前,ant会先检查init

是否已经被执行过,如果执行过,着直接执行compile,如果没有执行过,就会执行它依赖

的target,然后再执行本身的target。

目的:

打jar 包

11

目的:运行jar包内的程序

目的:删除生成的文件

目的:

再次运行,这里显示了如何在一个 target 里边调用其他的 target

步骤再重申一遍:

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

(2) 写文件

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

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

另外,我们有时候并不想运行默认的任务,或者想执行任意的步骤,

例如只想执行编译,则键入 ant compile

ant 中的每一个任务都可以这样执行,ant + target name

讲到这里,一个简单的任务已经完成,大家动手去体验一下Ant吧。

12

5 参考文献

1、

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

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

2、《Ant权威指南》

出版: 2003年7月

第2讲Ant进阶

13

1 回顾上一讲

学习了上一讲,相信已经激起大家的兴趣,或许还有不少感触。当然上一讲我们只了解了Ant的九牛

一毛,这一讲将会更加深入的介绍Ant的方方面面。

14

2 核心概念详解

2.1 project属性

首先看上一讲中的例子:

可以看出project有下面的属性:

Attribute

name

default

basedir

Description

项目名称,可自由定义。

定义一个缺省(默认)的target,当我们执行没有指定

target的时,就会执行这个缺省的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允许你使用这些属性,

例如${}对应操作系统的名字。

要想得到系统属性的列表可以参考the javadoc of perties。

使用如下测试代码可以查看一下:

public void testProperties() {

15

}

Properties p = perties();

for (Enumeration e = tyNames(); eElements();) {

}

String key = (String)ement();

n(key + ": " + perty(key) );

上面的代码就不做详细描述了,这些应该是看这个文档的人应该能看懂的。

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

Attribute

basedir

n

n

……

Description

可以理解为project项目的绝对路径,于中的

basedir属性一样

buildfile的绝对路径

ant的版本

当前执行的project的名字,由的name属性设定

ant 检测到的jvm版本。

……

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。在生成执行文件之前必须

16

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

我们还要注意到,Ant的depends属性只指定了target应该被执行的顺序。如果被依赖的target

无法运行,这种 depends对于指定了依赖关系的其他target没有影响。

Ant会依照depends属性中target出现的顺序依次执行每个target。然而,要记住的是只要

某个target依赖于一个target,后者就会被先执行。看下面的例子。

depends="A"/>

depends="B"/>

depends="C "/>

假设我们默认的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执行前被解析。

还是看上一讲中的例子:

其中的 就是一个task。

其中的 ${src} 就是对前面定义的property的引用。再执行javac 之前这些${*}

会被解析。

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

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

17

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

18

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代码块,这

19

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

下面的例子: rmic代表任意一个task

……

project

>

可以写成如下形式:

20

project

>

3.2 使用classpath

3.3 输出信息

可以有多种输出信息的写法:

写法1: 输出一段话

写法2:输出一段话

XXXXXX

写法3:输出一段XML

foo

21

3.4 设置property

(1)设置属性name-value

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

(3)

读取网络中的 property-set

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

(5)读取环境变量

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

3.5 引入properties文件

读取

properties

文件中的属性配置

首先在项目路径下增加一个build.

properties文件,用于提取设置公共的属性

比如针对上一讲中的

src = src

dest = dest

hello_jar =

然后在中这样去修改:

首先我们可以在 build.

properties中这么写

22

3.6 引入XML文件

读取XML文件中的属性配置

首先在项目路径下增加一个build_include.

xml文件,用于提取设置公共的属性,

比如针对上一讲中的,内容如下

首先我们可以在 build_include.

xml中这么写

然后在中这样去修改:

]>

…….

这个时候,我们只要在 添加 propery,添加target,

这个 会自动添加这些propery 和 target。

看下面的引用

中的可以修改peoperty设置

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

/>

3.7 复制文件与目录

该标签用于删除一个文件或一组文件,其属性如下:

(1) file表示要删除的文件。

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

(3) includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。

(4) failonerror 表示指定当碰到错误是否停止,默认值是自动停止。

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

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

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

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

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

第一种写法:

24

第二种简便写法:

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

(7)复制一个文件集合到一个目录,并替换掉其中的字符,如替换掉@TITLE@;

这里演示的是通过Ant批量转换文件的内容:设定ant 的filter token, 把该文件目录下

的所有文件内的“@TITLE@”, 替换为"Foo Bar"

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

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

dest="${dist}"

includes="**/*.java"

excludes="**/"

/>

3.8 删除文件与目录

该标签用于删除一个文件或一组文件,其属性如下:

(1) file表示要删除的文件。

25

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

(3) includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。

(4) failonerror 表示指定当碰到错误是否停止,默认值是自动停止。

(1)删除一个文件

(2)删除一个目录

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

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

也可以写成

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

通常情况下,

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

(6)删除文件目录树

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

26

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

3.11 建立临时文件

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

3.12 touch的使用

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

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

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

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

3.13 condition的使用

,,等 tag

27

3.14 替换replace

value="defaultvalue"

propertyFile="source/ties">

3.15 available 的使用

Available主要用于判断 某个文件是否存在,再决定某个属性为true还是false。

(1)如果类存在,则设置属性 t 为 true,如果没有就 false

property="t"/>

classname="s"

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

(3)

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

(4)

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

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

...in project ...

...in target ...

28

classpathref="jaxp" property="t"/>

(5)

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

3.17 显示错误

(1)显示错误方式一

Something wrong here.

(2)显示错误方式二

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

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

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

"/>

3.18 建立目录

建立一个目录

29

3.19 执行程序(cmd命令)

3.20 编译程序(执行javac)

srcdir="${}"

destdir="${}"

debug="on"

deprecation="false"

optimize="true"

failonerror="true"

source="1.6"

target="1.6">

注:Ant的Target (Target 亦如此)默认是调用运行Ant本身的JVM的

编译器,然而如果你想要单独地调用编译器——比如你要使用一个高级别的 编译器——你可以使用

3.21 制作文档(执行javadoc)

30

3.22 打jar包

或者

basedir="${build}/classes"

includes="mypackage/test/**"

excludes="**/*Test*.class"

/>

3.23 运行jar包

(1)带参数运行

最简单的运行jar包

传递参数运行

path="/Users/antoine/dev/asf/ant-core/bootstrap/lib/ />

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

31

dir="${}"

jar="${}/dist/"

fork="true"

failonerror="true"

maxmemory="128m" >

path="/Users/antoine/dev/asf/ant-core/bootstrap/lib/ />

3.24 运行SQL

第一种:

其中的classpath 可以用如下方式替代

32

url="jdbc:mysql://localhost/login/"

userid="root"

password="" >

insert into user values(10000, 'pzp', '123', 'pzpyp@');

url="jdbc:mysql://localhost/"

userid="root"

password=""

src="./">

第二种

location="c:"/>

3.25 发送邮件

The ${buildname} nightly build has completed

3.26 发布程序

如把程序部署到web服务器

成war包">

3.27 Filter的使用

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

现在根据不同环境的需要,对某些配置文件的值做一些替换。在 Ant 中,提供了 filter 任务,

33

使得替换值很方便。filter 主要用来在同一行内容中的替换,而正则表达式一下子可以替换多行内容。

filter 的使用例子:

把所有的@aaaa@替换成 bbbb

这段脚本的意思就是在 目录下的所有文件中,如果有预先定义好的"@aaaa@"

占位符的话,在拷贝到 目录后,所有的占位符都被替换成了"bbbb"。

替换属性文件中的内容

我们也可以将所有被替换的值放到某个属性文件中,filter 任务将属性文件中的每一个条目读出

来并且设置成一个 Filter。如下所示:

上面的脚本表示所有在 deploy_ties 中出现的条目将被作为一个

filter,在拷贝到 目录后,所有 目录中存在的占位符将被替

换成 deploy_env 中的值。

3.28 Length的使用

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

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

3.29 输入input

提示消息"Please enter db-username,然后把用户的输入赋值给

如果没有输入则有默认值 Scott-Tiger

addproperty=""

34

defaultvalue="Scott-Tiger"

/>

3.30 target之间的调用

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

(1)使用调用另外一个target

可以写成

/>

(2)使用antcall调用另外一个target

3.31 调用其他目录下的

调用目录 aaa/bbb/下的

第一种写法:

第二种写法:

第三种写法:

调用指定文件中的制定target

3.33 压缩、解压缩zip包

压缩zip文件、

35

basedir="htdocs/manual"

includes="api/**/*.html"

excludes="**/"

/>

解压缩zip文件

3.34 打tar包、解tar包

打 tar 包

fullpath="/usr/doc/ant/README"

preserveLeadingSlashes="true">

prefix="/usr/doc/ant"

preserveLeadingSlashes="true">

解 tar 包

36

3.35 打war包、解war包

打war包

webxml="${buildWebRoot}/WEB-INF/">

解war包:我们首先得建立一个目录(这里是 unpack)用来存放解压后的文件。Ant 中提供

了 unzip 命令用来解压 ear/war/jar 包。除了这个目录外,根据不同的目标环境,在运行目录下建

立一个与目标环境相对应的目录,重新打好的 war 包就放在这个目录下,比如针对场景中的情况,

如果需要创建一个产品环境下的部署包,我们可以建立一个 TestWebProduct 目录,目录名写在配

置文件中(${})。

init in deploy

unpack the ${}

dest="${}/${projectName}" />

在 init 段中首先删除掉上次解压的目录和目标打包目录,然后重新建立目录;在

unpack 中,首先将编译好的默认 war 包拷贝至 unpack 定义的目录,解压之后把

unpack 下的 war 包删除。下面是这时候对应的属性文件。

37

3.36 打ear包

打ear 包

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

在 ant 中控制流程(if else )

classpath="${}" />

38

4 实例分析

为了演示大部分Ant target,笔者特地写了一个web工程,

放在本文档的同级目录下:antdemo-web

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

name=""

name=""

value="${}/WEB-INF" />

value="${}/WEB-INF/lib" />

value="${}/WEB-INF/classes" />

39

debug="on" deprecation="false" optimize="true" failonerror="true"

source="1.6" target="1.6">

destdir="${}"

40

haltonfailure="false"

failureproperty=""

showoutput="true">

webxml="${}/">

成war包">

41

将工程打成war包">

url="jdbc:mysql://localhost/"

userid="root"

password="" >

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)

);

42

url="jdbc:mysql://localhost/"

userid="root"

password=""

src="./">

insert into user values(10000, 'pzp', '123', 'pzpyp@');

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

43

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

5.1 Ant调用Junit的实例

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

haltonfailure="false"

failureproperty=""

showoutput="true">

5.2 Ant调用SVN的实例

(1)Ant本身不支持SVN,所以需要svnant任务插件支持,才能在ant脚本中获取svn中的

内容,

提供了Subclipse,SvnClientAdapter

/,

和SvnAnt。网址:

Subclipse是一个Eclipse的插件,实现了IDE与Subversion得集成;

SvnClientAdapter是Subversion的一套Java API,封装了客户端对Subversion的一些访问

44

操作;

SvnAnt是用于访问Subversion的Ant任务,其依赖于SvnClientAdapter。

(2) 它的URL是:/, 这里使用的是svnant-1.2.1版本,

使用前需要将它依赖的类库放在ant安装目录下面的lib目录;

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

classpath="">

svnant

.jar"/>

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

而不是checkout。

password="${rd}" failonerror="false">

revision="HEAD" />

这里将javahl设为true是为了使用纯java实现的svn访问中间层,而不是使用svn的

二进制命令行客户端。

需要注意的是,export命令也好,checkout命令也好,都不允许将本地目录和SVN

的一个以上的url关联,也就是说无法将svn上的两个以上目录 的内容导出到本地的

一个目录。

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

45

6 实践出真知

掌握了上面的那些内容后,应该知道如何去写一个好的Ant build了,但当你真的想去做的时候,

你可能写不出好的 ,因为你对Ant提供的默认命令知道得太少了。这个时候如果你想完成

任务,并提高自己,有很多办法:

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

(2)Ant 的 document,里边详细列写了 Ant 的各种默认命令,及其丰富

(3)google,永远不要忘记它

OK,在这之后随着你写的 Ant build 越来越多,你知道的命令就越多,ant 在你的手里也就越

来越强大了。这个是一个慢慢积累的过程。

46

7 QA

问题一:如果执行 Ant 过程中出现 Outofmemory 的错误怎么办?

答:加大内存,设置环境变量 ANT_OPTS=-Xms128m -Xmx256m

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

java -Xms128m -Xmx256m

%ANT_ARGS%

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

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

即可。

-classpath "%ANTCLASSPATH%"

47

8 参考文献

1、

2、《Ant权威指南》

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

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

出版: 2003年7月

48