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使用标签
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 内置属性
如果你使用了
例如${}对应操作系统的名字。
要想得到系统属性的列表可以参考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的名字,由
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执行前被解析。 还是看上一讲中的例子: 其中的 其中的 ${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)也可通过 上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着 是 ${dest} 目录。 (3)References 如果我们想在多个task中使用相同的classpath,可以用 引用 buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块,这 19 一属性就很有用--如多次使用 下面的例子: rmic代表任意一个task ……
project
>
可以写成如下形式:
20
project
>
3.2 使用classpath
3.3 输出信息
可以有多种输出信息的写法:
写法1: 输出一段话
写法2:输出一段话
写法3:输出一段XML
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的使用 有 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)显示错误方式一 (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 编译器,然而如果你想要单独地调用编译器——比如你要使用一个高级别的 编译器——你可以使用 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 发送邮件 3.26 发布程序 如把程序部署到web服务器 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)使用 可以写成 /> (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 目录,目录名写在配 置文件中(${})。 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="${}/"> 41 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=""> .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


发布评论