您的当前位置:首页正文

ant学习教程

2021-06-08 来源:步旅网
 http://www.blogjava.net/dreamstone 1/21

Ant介绍

1,什么是ant

ant是构建工具 2,什么是构建 概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个 3,ant的好处 跨平台 --因为ant是使用java实现的,所以它跨平台 使用简单--与ant的兄弟make比起来 语法清晰--同样是和make相比 功能强大--ant能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。当你自己开发一些ant插件的时候,你会发现它更多的功能。 4,ant的兄弟make

ant做的很多事情,大部分是曾经有一个叫make的所做的,不过对象不同,make更多应用于c/c++ ,ant更多应用于Java。当然这不是一定的,但大部分人如此。 下边开始一步步的带你走进ant的世界

ant 安装

http://www.blogjava.net/dreamstone 1/21

http://www.blogjava.net/dreamstone 2/21

1、到http://ant.apache.org/bindownload.cgi下載Ant,我使用的版本是1.70

解压缩下载文件到你的工作目录,这里以d:\\ant_home为例 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,请在[系统内容/高级/环境变量]中设置[系统变量],以完成以上的设定,例如:

3、测试安装

CMD进入命令行界面,运行Ant 出现如下提示,说明安装成功 E:\\srcgen\\webwork>ant

Buildfile: build.xml does not exist! Build failed

二、第一个ant脚本

http://www.blogjava.net/dreamstone 2/21

http://www.blogjava.net/dreamstone 3/21

使用ant来达成目的,完成一件事情的实例 1、目的:

z 编写一个程序 z 编译它们

z 把它打包成jar包

z 把他们放在应该放置的地方 z 运行它们

我们用文本编辑器编写一个HelloWorld如下

这里为了简单起见只写一个程序,就是HelloWorld.java程序代码如下: package test.ant;

public class HelloWorld{ public static void main(String[] args){ System.out.println(\"Hello world1\"); } };

2,然后用ant完成剩下的步骤。 建立一个build.xml文件,内容如下

解释上边的配置文件

http://www.blogjava.net/dreamstone 3/21

http://www.blogjava.net/dreamstone 4/21

build.xml中的第一句话,没有实际的意义,指定一下encoding,几乎所有的xml的第一行

ant的所有内容必须包含在这个里边,name是你给它取的名字,basedir故名思意就是工作的根目录 .代表当前目录。default代表默认要做的事情。

类似程序中的变量,为什么这么做想一下变量的作用

把你想做的每一件事情写成一个target ,它有一个名字,depends是它所依赖的target,在执行这个target 例如这里的compile之前ant会先检查init是否曾经被执行过,如果执行过则直接直接执行compile,如果没有则会先执行它依赖的target例如这里的init,然后在执行这个target

如我们的计划 编译:

做jar包:

运行:

为了不用拷贝,我们可以在最开始定义好目标文件夹,这样ant直接把结果就放在目标文件夹中了

新建文件夹:

为了更多一点的功能体现,又加入了两个target

删除生成的文件

http://www.blogjava.net/dreamstone 4/21

http://www.blogjava.net/dreamstone 5/21

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

好了,解释完成了,下边检验一下你的ant吧

新建一个src的文件夹,然后把HelloWorld.java按照包目录放进去 做好build.xml文件

在命令行下键入ant ,你会发现一个个任务都完成了。每次更改完代码只需要再次键入ant

有的时候我们可能并不想运行程序,只想执行这些步骤中的某一两个步骤,例如我只想重新部署而不想运行,键入 ant build

ant中的每一个任务都可以这样调用ant + target name 好了,这样一个简单的ant任务完成了。

整合ant

http://www.blogjava.net/dreamstone 5/21

http://www.blogjava.net/dreamstone 6/21

进一步学习一个稍微复杂一点点的ant

在实际的工作过程中可能会出现以下一些情况,一个项目分成很多个模块,每个小组或者部门负责一个模块,为了测试,他们自己写了一个build.xml,而你负责把这些模块组合到一起使用,写一个build.xml 这个时候你有两种选择:

1,自己重新写一个build.xml ,这将是一个麻烦的事情 2,尽量利用他们已经写好的build.xml,减少自己的工作

举个例子:

假设你下边有三个小组,每个小组负责一个部分,他们分别有一个src 和一个写好的build.xml

这个时候你拿到他们的src,你需要做的是建立三个文件夹src1 ,src2, src3分别把他们的src和build.xml放进去,然后写一个build.xml

http://www.blogjava.net/dreamstone 6/21

http://www.blogjava.net/dreamstone 7/21

ok你的任务完成了。

Ant进阶

http://www.blogjava.net/dreamstone 7/21

http://www.blogjava.net/dreamstone 8/21

上边你完成了任务,但是你是否有些感触呢,在那些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 8/21

http://www.blogjava.net/dreamstone 9/21

如果你自己看的话你会看到这样一个target

有的时候你想给每个小组的build.xml加入几个target,一种做法是每个里边写,然后在这里调用

但是有一种更好的方法。

你可以写一个include.xml文件,内容如下

然后更改你三个小组的build.xml文件,每个里边加入如下内容

]>

&share-variable; 变成如下的样子

这个时候,你只要在include.xml添加propery , 添加target,三个build.xml会同时添加这些propery和target

而且不会让三个组的build.xml变得更复杂。

http://www.blogjava.net/dreamstone 9/21

http://www.blogjava.net/dreamstone 10/21

]>

&share-variable;

Ant常用task

http://www.blogjava.net/dreamstone 10/21

http://www.blogjava.net/dreamstone 11/21

好了,看完上边的内容,你应该知道怎么构建一个ant的骨架,但具体做起来才才发现很多东西不知道该如何写。下边介绍一下常用的ant task。在ant手册中跟这些叫core task

这里打乱一下顺序,不按照文档中的顺序来介绍,而是按照需求来介绍。 使用classpath

设置classpath

输出信息

引入一个xml文件

拷贝一个文件

拷贝一个文件到指定目录

拷贝一个目录到另一个目录

http://www.blogjava.net/dreamstone 11/21

http://www.blogjava.net/dreamstone 12/21

拷贝一个文件集合到一个目录

拷贝一个文件集合到一个目录,同时建立备份文件

拷贝一个集合的文件到一个目录,并替换掉@ TITLE @

拷贝一个目录下的东西到另一个目录下,includes加入,excludes排除 includes=\"**/*.java\" excludes=\"**/Test.java\" />

执行程序

出现一个错误

Something wrong here.或者

打jar包

http://www.blogjava.net/dreamstone 12/21

http://www.blogjava.net/dreamstone 13/21

或者

运行jar包:

或者设置一下运行的jvm的最大内存,来运行

jar=\"${exec.dir}/dist/test.jar\" fork=\"true\"

failonerror=\"true\" maxmemory=\"128m\" >

编译程序

destdir=\"${build}\" classpath=\"xyz.jar\" debug=\"on\" source=\"1.4\" />

制作Javadoc

http://www.blogjava.net/dreamstone 13/21

http://www.blogjava.net/dreamstone 14/21

path=\"path/to/theDoclet\">

定义一个新的task类库

运行sql

driver=\"org.database.jdbcDriver\" url=\"jdbc:database-url\" userid=\"sa\" password=\"pass\" > insert

into table some_table values(1,2,3,4);

truncate table some_other_table;

解压缩

压缩

还有很多,可以参考ant 手册的ant core task

http://www.blogjava.net/dreamstone 14/21

http://www.blogjava.net/dreamstone 15/21

打war包:

在ant中控制流程(if else )

http://www.blogjava.net/dreamstone 15/21

http://www.blogjava.net/dreamstone 16/21

实例分析:

从开源框架中拿出一部分来分析一下:

我接触的一些开源程序的ant中,appfuse是比较复杂的,Jpetstore是最简单的。 这里拿一个最简单的出来,然后一路注释过去。(想挑战一下的去看appfuse的。)

http://www.blogjava.net/dreamstone 16/21

http://www.blogjava.net/dreamstone 17/21

http://www.blogjava.net/dreamstone 17/21

http://www.blogjava.net/dreamstone 18/21