1. Ant介绍....................................................................................................................................4 1.1. 什么是ant..................................................................................................................4 1.2. 什么是构建...............................................................................................................4 1.3. ant的好处..................................................................................................................4 1.4. ant的兄弟make .........................................................................................................4
2. Ant 安装..................................................................................................................................5 2.1. 到http://ant.apache.org/bindownload.cgi ..................................................................5 2.2. 如图新增系统变量...................................................................................................5 2.3. 3、测试安装.............................................................................................................6
3. 第一个Ant脚本.........................................................................................................................6 3.1. 使用ant来达成目的,完成一件事情的实例..........................................................6 3.2. 然后用ant完成剩下的步骤。..................................................................................6 3.3. 解释上边的配置文件...............................................................................................7
4. 整合ant.....................................................................................................................................9 1,自己重新写一个build.xml ,这将是一个麻烦的事情...............................................................9 4.1. 举个例子:...............................................................................................................9
5. Ant进阶..................................................................................................................................11 6. Ant常用task ............................................................................................................................14 6.1. 使用classpath ..........................................................................................................14 6.2. 设置classpath ..........................................................................................................14 6.3. 输出信息.................................................................................................................15 6.3.1. 写法一.............................................................................................................15 6.3.2. 写法二.............................................................................................................15 6.3.3. 输出一段xml...................................................................................................15 6.4. 引入一个xml文件...................................................................................................15 6.5. 拷贝文件.................................................................................................................15 6.5.1. 拷贝一个文件.................................................................................................15 6.5.2. 拷贝一个文件到指定目录.............................................................................15 6.5.3. 拷贝一个目录到另一个目录.........................................................................15 6.5.4. 拷贝一个文件集合到一个目录.....................................................................15 6.5.5. 拷贝一个文件集合到一个目录,同时建立备份文件 .................................16 6.5.6. 拷贝一个集合的文件到一个目录,并替换掉@ TITLE @.........................16 6.5.7. 拷贝一个目录下的东西到另一个目录下,(includes加入,excludes排除)16 6.5.8. 拷贝一个文件.................................................................................................16 6.6. 删除文件、目录.....................................................................................................16 6.6.1. 删除一个文件.........................................................................................16 6.6.2. 删除一个目录.........................................................................................16 6.6.3. 删除所有符合规则的文件(.bak文件)包括子目录.............................16 6.6.4. 删除当前目录下所有的文件和目录,包括当前目录 .........................16 6.6.5. 删除当前目录下所有的文件和目录,不包括当前目录 .....................16 6.6.6. 删除当前目录下所有的svn相关文件...........................................................17 6.6.7. 删除文件目录树.............................................................................................17 6.7. 剪切文件.................................................................................................................17
6.8. 重命名.....................................................................................................................17
http://www.blogjava.net/dreamstone 1/32 http://www.blogjava.net/dreamstone 2/32
6.9. 建立临时文件.........................................................................................................17 6.10. Touch的使用...........................................................................................................17 6.10.1. 如果文件不存在,创建文件,如果存在,更改最后访问时间为当前系统时间 17
6.10.2. 如果文件不存在,创建文件,更改最后访问时间为06/28/2000 2:02 pm...17 6.10.3. 更改目录下所有文件最后访问时间为 06/28/2000 2:02 pm........................17 6.11. Condition的使用.....................................................................................................18 6.12. 替换replace .............................................................................................................18 6.13. 调用chmod..............................................................................................................18 6.14. checksum MD5 运算..............................................................................................19 6.14.1. md5 文件,然后把值放入foo.bar.MD5 属性...............................................19 6.14.2. md5 文件,然后把值放入foobarMD5 属性.................................................19 6.14.3. Md5 目录下的所有文件,然后建立一个.md5 文件,把所有的md5 值放入 19
6.15. Available的使用.....................................................................................................19 6.15.1. 如果类存在,则设置属性Myclass.present为true,如果没有就false..........19 6.15.2. 如果文件存在则设置属性jaxp.jar.presen为true,否则为false ....................19 6.15.3. 如果目录存在,则设置属性为true,否则为false .......................................19
6.15.4. 如果classpath下寻找class,如果存在则设置属性为true,否则为false .....19 6.15.5. 如果在classpath下发现文件则设置属性为true否则为flase.........................19 6.16. 设置
property ...........................................................................................................20 6.16.1. 设置属性
name-value ......................................................................................20
6.16.2. 读取属性文件中的属性配
置.........................................................................20 6.16.3. 读取网络中的
property-set..............................................................................20
6.16.4. 读取文件中的属性配
置.................................................................................20
6.16.5. 读取环境变
量.................................................................................................20
6.16.6. 读取属性文件中的属性,并作为全局引
用 .................................................20 6.17. 出现一个错
误.........................................................................................................20 6.17.1. 显示错误方式
一.............................................................................................20 6.17.2. 显示错误方式
二.............................................................................................20
6.17.3. 如果这个属性不存在显示错
误.....................................................................20 6.17.4. 如果这个属性存在现实错
误.........................................................................20 6.17.5. 如果符合条件显示错误,这里的条件是(没有设置属性) .....................20 6.18. 建立一个目
录.........................................................................................................20 6.19. 打jar
包....................................................................................................................21 6.20. 打Ear
包...................................................................................................................21 6.21. 执行程
序.................................................................................................................21 6.22. 运行jar
包: ............................................................................................................21 6.22.1. 带参数执
行.....................................................................................................21
6.22.2. 或者设置一下运行的jvm的最大内存,来运行...........................................22 6.23. 编译程
序.................................................................................................................22 6.24. 制作
Javadoc............................................................................................................22 6.25. 定义一个新的task类
库..........................................................................................22 6.26. 运行
sql ...........................................................................
.........................................23
http://www.blogjava.net/dreamstone 2/32 http://www.blogjava.net/dreamstone 3/32
6.27. Filter的使
用............................................................................................................23 6.27.1. 把所有的@year@替换成
2000......................................................................23 6.27.2. 替换属性文件中的内
容.................................................................................23
6.28. Length的使
用.........................................................................................................23
6.28.1. 把字符串¡foo¡的长度保存到属性\"length.foo\"中.........................................23
6.28.2. 把文件¡ bar¡的长度保存到属性\" length.bar \"中..........................................23 6.29. 输入
Input ................................................................................................................23 6.30. FixCRCL的使
用.....................................................................................................24
6.30.1. 替换所有的eol变成lf ,删除所有的
eof.......................................................24 6.30.2. 替换eol成crlf 设置tab的长度为
4.................................................................24 6.31. 发送邮
件.................................................................................................................24 6.32. 压缩、解压
缩.........................................................................................................24 6.32.1. 解压缩zip文
件................................................................................................24 6.32.2. 压缩zip文
件....................................................................................................24 6.32.3. 打tar
包............................................................................................................25 6.32.4. 解tar
包............................................................................................................25 6.33. 打war
包:...............................................................................................................25 6.34.
antcall ......................................................................................................................25 6.34.1. 调用target
doSomethingElse........................................................................25
6.34.2. 拷贝父中的path1,然后再当前工程中命名为path2 ...................................26 6.35. Ant的使
用...............................................................................................................26 6.35.1. 调用目录sub1/sub2/下的
build.xml ................................................................26 6.35.2. 同上,不同的写
法.........................................................................................26
6.35.3. 同上,不同的写
法.........................................................................................26
6.35.4. 调用指定文件中的指定target
(compile) .......................................................26 7. 在ant中控制流程(if
else ) ......................................................................................................27 8. 实例分
析: ...............................................................................................................................27 9. 如何继续学
习.........................................................................................................................31 10. Ant使用cvs的实
例.........................................................................................................31 11.
QA:..............................................................................................................................32 11.1. 如果执行ant过程中出现Outofmemory的错误怎么办?......................................32
http://www.blogjava.net/dreamstone 3/32
http://www.blogjava.net/dreamstone 4/32
1. Ant 介绍
1.1. 什么是ant
ant 是构建工具
1.2. 什么是构建
概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去 等等操作,当然不仅与此,但是主要用来干这个
1.3. ant 的好处
跨平台 --因为ant 是使用java 实现的,所以它跨平台 使用简单--与ant 的兄弟make 比起来 语法清晰--同样是和make 相比
功能强大--ant 能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。当 你自己开发一些ant 插件的时候,你会发现它更多的功能。
1.4. ant 的兄弟make
ant 做的很多事情,大部分是曾经有一个叫make 的所做的,不过对象不同,make 更多 应用于c/c++ ,ant 更多应用于Java。当然这不是一定的,但大部分人如此。 下边开始一步步的带你走进 ant 的世界
http://www.blogjava.net/dreamstone 4/32 http://www.blogjava.net/dreamstone 5/32
2. Ant 安装
2.1. 到http://ant.apache.org/bindownload.cgi
下 載 Ant, 我使用的版本是1.70
解压缩下载文件到你的工作目录, 这里以d:\\ant_home 为例
2.2. 如图新增系统变量
新 增 系 统 变 量 :ANT_HOME, 内容:d:\\ant_home\\apache-ant-1.70 在PATH 环境变量中加入Ant 的bin 目錄:%ANT_HOME%\\bin
要 让 Ant 能支持JUnit, 需要直接將JUnit 的junit.jar 放置在Ant 的lib 目錄, 并记 得改变CLASSPATH 中原先有关于JUnit 的设定,例如:%ANT_HOME\\lib\\junit.jar,虽 然也有其它的方式可以設定, 但這是最快最簡單的方法。
如 果 是 Windows 2000/XP,请在[系统内容/高级/环境变量]中设置[系统变量],以完成以 上的设定, 例如:
http://www.blogjava.net/dreamstone 5/32 http://www.blogjava.net/dreamstone 6/32
2.3. 3、测试安装
CMD 进入命令行界面,运行Ant
出现如下提示,说明安装成功 E:\\srcgen\\webwork>ant
Buildfile: build.xml does not exist! Build failed
3. 第一个 Ant 脚本
3.1. 使用ant 来达成目的,完成一件事情的实例
目的: 编写一个程序 编译它们 把它打包成 jar 包 把他们放在应该放置的地方 运行它们
我们用文本编辑器编写一个HelloWorld 如下
这里为了简单起见只写一个程序,就是 HelloWorld.java 程序代码如下: package test.ant;
public class HelloWorld{
public static void main(String[] args){ System.out.println(\"Hello world1\"); } };
3.2. 然后用ant 完成剩下的步骤。
建立一个 build.xml 文件,内容如下
http://www.blogjava.net/dreamstone 6/32 http://www.blogjava.net/dreamstone 7/32
3.3. 解释上边的配置文件
build.xml 中的第一句话,没有实际的意义,指定一下encoding,几乎所有的xml 的第一行
ant 的所有内容必须包含在这个里边,name 是你给它取的名字,basedir 故名思意就是工作的
根目录 .代表当前目录。default 代表默认要做的事情。 类似程序中的变量,为什么这么做想一下变量的作用 把你想做的每一件事情写成一个target ,它有一个名字,depends 是它所依赖的target,在执 行这个target 例如这里的compile 之前ant 会先检查init 是否曾经被执行过,如果执行过则 直接直接执行compile,如果没有则会先执行它依赖的target 例如这里的init,然后在执行这 个target 如我们的计划 编译: http://www.blogjava.net/dreamstone 7/32 http://www.blogjava.net/dreamstone 8/32 做 jar 包: 新建文件夹: 为了更多一点的功能体现,又加入了两个target 删除生成的文件 再次运行,这里显示了如何在一个target 里边调用其他的target 好了,解释完成了,下边检验一下你的ant 吧 新建一个 src 的文件夹,然后把HelloWorld.java 按照包目录放进去 做好 build.xml 文件 在命令行下键入 ant ,你会发现一个个任务都完成了。每次更改完代码只需要再次键入ant 有的时候我们可能并不想运行程序,只想执行这些步骤中的某一两个步骤,例如我只想重新 部署而不想运行,键入 ant build ant 中的每一个任务都可以这样调用ant + target name 好了,这样一个简单的ant 任务完成了。 http://www.blogjava.net/dreamstone 8/32 http://www.blogjava.net/dreamstone 9/32 4. 整合 ant 进一步学习一个稍微复杂一点点的ant 在实际的工作过程中可能会出现以下一些情况,一个项目分成很多个模块,每个小组或者部 门负责一个模块,为了测试,他们自己写了一个build.xml,而你负责把这些模块组合到一起 使用,写一个build.xml 这个时候你有两种选择: 1,自己重新写一个build.xml ,这将是一个麻烦的事情 2,尽量利用他们已经写好的build.xml,减少自己的工作 4.1. 举个例子: 假设你下边有三个小组,每个小组负责一个部分,他们分别有一个 src 和一个写好的 build.xml 这个时候你拿到他们的src,你需要做的是建立三个文件夹src1 ,src2, src3 分别把他们的src 和build.xml 放进去,然后写一个build.xml http://www.blogjava.net/dreamstone 9/32 http://www.blogjava.net/dreamstone 10/32 ok 你的任务完成了。 http://www.blogjava.net/dreamstone 10/32 http://www.blogjava.net/dreamstone 11/32 5. Ant 进阶 上边你完成了任务,但是你是否有些感触呢,在那些 build.xml 中,大多数是重复的,而且 更改一次目录需要更改不少东西。是否能让工作做的更好一点呢,答案是肯定的。 引入两个东西: 1,propery 2,xml include 这两个东西都有一个功能,就是能把 build.xml 中 除此之外它们各有特点: propery 的特点是维护简单,只需要简单的键值对,因为并不是所有人都喜欢xml 的格式 xml include 的特点是不单可以提取出属性来,连target 也可以。 还是以前的例子: 例如我们想把 src1 src2 src3 这三个属性从xml 中提出来,可以新建一个文件叫all.properties 里边的内容 src1=D:\\\\study\\\\ant\\\\src1 src2=D:\\\\study\\\\ant\\\\src2 src3=D:\\\\study\\\\ant\\\\src3 然后你的build.xml 文件可以这样写,别人只需要更改配置文件,而不许要更改你的build.xml 文件了 http://www.blogjava.net/dreamstone 11/32 http://www.blogjava.net/dreamstone 12/32 如果你自己看的话你会看到这样一个target 有的时候你想给每个小组的build.xml 加入几个target,一种做法是每个里边写,然后在这里 调用 但是有一种更好的方法。 你可以写一个 include.xml 文件,内容如下 http://www.blogjava.net/dreamstone 12/32 http://www.blogjava.net/dreamstone 13/32 然后更改你三个小组的 build.xml 文件,每个里边加入如下内容 ]> &share-variable; 变成如下的样子 这个时候,你只要在 include.xml 添加propery , 添加target,三个build.xml 会同时添加这些 propery 和target 而且不会让三个组的build.xml 变得更复杂。 ]> http://www.blogjava.net/dreamstone 13/32 http://www.blogjava.net/dreamstone 14/32 6. Ant 常用task 好了,看完上边的内容,你应该知道怎么构建一个ant 的骨架,但具体做起来才才发现很多 东西不知道该如何写。下边介绍一下常用的ant task。在ant 手册中跟这些叫core task 这里打乱一下顺序,不按照文档中的顺序来介绍,而是按照需求来介绍。 6.1. 使用classpath 6.2. 设置classpath http://www.blogjava.net/dreamstone 14/32 http://www.blogjava.net/dreamstone 15/32 6.3. 输出信息 两种写法 6.3.1. 写法一 6.3.2. 写法二 6.3.3. 输出一段 xml 6.4. 引入一个xml 文件 6.5. 拷贝文件 6.5.1. 拷贝一个文件 6.5.2. 拷贝一个文件到指定目录 6.5.3. 拷贝一个目录到另一个目录 6.5.4. 拷贝一个文件集合到一个目录 http://www.blogjava.net/dreamstone 15/32 http://www.blogjava.net/dreamstone 16/32 6.5.5. 拷贝一个文件集合到一个目录,同时建立备份文件 6.5.6. 拷贝一个集合的文件到一个目录,并替换掉@ TITLE @ 6.5.7. 拷贝一个目录下的东西到另一个目录下,(includes 加入,excludes 排除) 6.5.8. 拷贝一个文件 拷贝中各种关于目录的操作都可以用在这里 6.6.1. 删除一个文件 6.6.2. 删除一个目录 6.6.3. 删除所有符合规则的文件(.bak 文件)包括子目录 6.6.4. 删除当前目录下所有的文件和目录,包括当前目录 6.6.5. 删除当前目录下所有的文件和目录,不包括当前目录 http://www.blogjava.net/dreamstone 16/32 http://www.blogjava.net/dreamstone 17/32 6.6.6. 删除当前目录下所有的 svn 相关文件 (因为svn 文件默认是excludes 的,所以这里要设置一下) 6.6.7. 删除文件目录树 6.7. 剪切文件 6.8. 重命名 6.9. 建立临时文件 在目录 build 下,建立文件名为temp.file ,后缀为.xml 的文件 6.10. Touch 的使用 6.10.1. 如果文件不存在,创建文件,如果存在,更改最后访问时间为当前系统时间 6.10.2. 如果文件不存在,创建文件,更改最后访问时间为06/28/2000 2:02 pm 6.10.3. 更改目录下所有文件最后访问时间为 06/28/2000 2:02 pm http://www.blogjava.net/dreamstone 17/32 http://www.blogjava.net/dreamstone 18/32 6.11. Condition 的使用 有 6.12. 替换replace propertyFile=\"source/name.properties\"> 6.13. 调用chmod http://www.blogjava.net/dreamstone 18/32 http://www.blogjava.net/dreamstone 19/32 6.14. checksum MD5 运算 6.14.1. md5 文件,然后把值放入foo.bar.MD5 属性 6.14.2. md5 文件,然后把值放入foobarMD5 属性 6.14.3. Md5 目录下的所有文件,然后建立一个.md5 文件,把所有的md5 值放入 6.15. Available 的使用 6.15.1. 如果类存在,则设置属性 Myclass.present 为true,如果没有就false 6.15.2. 如果文件存在则设置属性 jaxp.jar.presen 为true,否则为false 6.15.3. 如果目录存在,则设置属性为 true,否则为false 6.15.4. 如果 classpath 下寻找class,如果存在则设置属性为true,否则为false 在工程tag 下定义path,在target 中使用 ...in project ... 6.15.5. 如果在 classpath 下发现文件则设置属性为true 否则为flase http://www.blogjava.net/dreamstone 19/32 http://www.blogjava.net/dreamstone 20/32 6.16. 设置property 6.16.1. 设置属性 name-value 6.16.2. 读取属性文件中的属性配置 6.16.3. 读取网络中的 property-set 6.16.4. 读取文件中的属性配置 6.16.5. 读取环境变量 6.16.6. 读取属性文件中的属性,并作为全局引用 6.17. 出现一个错误 6.17.1. 显示错误方式一 6.17.2. 显示错误方式二 6.17.3. 如果这个属性不存在显示错误 6.17.4. 如果这个属性存在现实错误 6.17.5. 如果符合条件显示错误,这里的条件是(没有设置属性) 6.18. 建立一个目录 http://www.blogjava.net/dreamstone 20/32 http://www.blogjava.net/dreamstone 21/32 6.19. 打jar 包 6.20. 打Ear 包 6.21. 执行程序 6.22. 运行jar 包: 6.22.1. 带参数执行 http://www.blogjava.net/dreamstone 21/32 http://www.blogjava.net/dreamstone 22/32 6.22.2. 或者设置一下运行的 jvm 的最大内存,来运行 failonerror=\"true\" maxmemory=\"128m\" > 6.23. 编译程序 6.24. 制作Javadoc 6.25. 定义一个新的task 类库 http://www.blogjava.net/dreamstone 22/32 http://www.blogjava.net/dreamstone 23/32 6.26. 运行sql password=\"pass\" > insert into table some_table values(1,2,3,4); truncate table some_other_table; 6.27. Filter 的使用 6.27.1. 把所有的@year@替换成2000 6.27.2. 替换属性文件中的内容 6.28. Length 的使用 6.28.1. 把字符串¡foo¡的长度保存到属性\"length.foo\"中 6.28.2. 把文件¡ bar¡的长度保存到属性\" length.bar \"中 6.29. 输入Input 提示消息\"Please enter db-username,然后把用户的输入赋值给db.user 如果没有输入则有默认值Scott-Tiger message=\"Please enter db-username:\" addproperty=\"db.user\" defaultvalue=\"Scott-Tiger\" /> http://www.blogjava.net/dreamstone 23/32 http://www.blogjava.net/dreamstone 24/32 6.30. FixCRCL 的使用 6.30.1. 替换所有的 eol 变成lf ,删除所有的eof 6.30.2. 替换 eol 成crlf 设置tab 的长度为4 6.31. 发送邮件 6.32. 压缩、解压缩 6.32.1. 解压缩 zip 文件 6.32.2. 压缩 zip 文件 http://www.blogjava.net/dreamstone 24/32 http://www.blogjava.net/dreamstone 25/32 6.32.3. 打 tar 包 6.32.4. 解 tar 包 6.33. 打war 包: 6.34. antcall 6.34.1. 调用 target doSomethingElse http://www.blogjava.net/dreamstone 25/32 http://www.blogjava.net/dreamstone 26/32 6.34.2. 拷贝父中的 path1,然后再当前工程中命名为path2 6.35. Ant 的使用 6.35.1. 调用目录 sub1/sub2/下的build.xml 6.35.2. 同上,不同的写法 6.35.3. 同上,不同的写法 6.35.4. 调用指定文件中的指定 target (compile) http://www.blogjava.net/dreamstone 26/32 http://www.blogjava.net/dreamstone 27/32 7. 在 ant 中控制流程(if else ) 8. 实例分析: 从开源框架中拿出一部分来分析一下: 我接触的一些开源程序的 ant 中,appfuse 是比较复杂的,Jpetstore 是最简单的。 这里拿一个最简单的出来,然后一路注释过去。(想挑战一下的去看appfuse 的。) http://www.blogjava.net/dreamstone 27/32 http://www.blogjava.net/dreamstone 28/32 classname=\"org.apache.tools.ant.taskdefs.optional.junit.JUnitTask\"/> http://www.blogjava.net/dreamstone 28/32 http://www.blogjava.net/dreamstone 29/32