ANT学习笔记.docx
《ANT学习笔记.docx》由会员分享,可在线阅读,更多相关《ANT学习笔记.docx(22页珍藏版)》请在冰豆网上搜索。
![ANT学习笔记.docx](https://file1.bdocx.com/fileroot1/2023-4/28/574f9e14-f0c4-488c-806d-4686766e00d6/574f9e14-f0c4-488c-806d-4686766e00d61.gif)
ANT学习笔记
关于ANT的起源,最权威的莫过于官方站点:
:
:
URL:
:
http:
//ant.apache.org
下面是我的学习笔记,主要是对些关键的地方的总结,还有就是一些我个人觉得比较有难度和技巧的地方的总结。
首先是一些在使用ant前应该思考的问题,基本上这些问题的答案可以指导你怎么样用好ant
buildfile怎么开始
在build过程中我需要定义哪些property和datatype
build过程中需要创建哪些目录
谁负责一个完整的创建,还有库文件,安装和运行的脚本文件,以及静态的和生成的动态的文档?
如果文件发生了变化,怎么重建?
是否需要删除所有的class文件?
是否需要删除生成的jar文件?
哪些目录应该在发布前准备好?
是否需要将源码和应用一起发布?
谁负责发布?
一、ANT的安装和配置(略)
二、ANT入门(略)
三、ANT的学习方法
学习ANT应该从“到底要用ANT来做什么”开始,针对自己的目的来学习,只要能够满足自己的工作的需要就可以了,ANT设计为可扩展的插件式的结构,每天都有人为ANT增加新的插件,因此要将ANT的所有应用掌握是不可能的,从我们的工作需求出发,ANT主要就是用来compile,test,build,package,deloy,integrationtest,这也是我使用ANT的一种模式,我已经为这个模式写了一个模板,每次编写新的ANT的时候只需要针对具体的项目把这个模板修改一下就可以了,其实使用ANT是很简单的。
使用来build项目有两个需要重点关注的地方:
项目的组织和ANT的buildfile。
四、buildfile的结构
对于ANT的使用者来说,理解ANT的配置文件是最重要的,ANT的XML配置文件的结构很简单,这也是ANT的一个优点,简单易懂,容易上手,ANT的配置文件主要由project,target和task三层树型结构组成如下:
--这是一个虚拟的task,具体到应用可能是ant的coretask也可能是optionaltask-->
关于project,target,task的概念,请参考官方文档的6UsingAnt部分。
五、ANT的DataType
前面说到了ANT的配置文件的结构主要由project,target和task组成,其实project,target和task是ANT的四个重要的概念里面的三个,还有一个很重要的概念就是DataElements,这是ANT最容易让人搞不清楚的一个方面,它们表达的是数据而不是任务。
数据类型定义包括三个级别,project-level,target-level和task-level,有点类似于类里面定义全局变量,局部变量的方式,不同的是,这里代表了其在ant里面的可视性,如果直接定义在project节点下那就是project-level,所有的target和task都可以引用它们,以次类推。
数据类型分为两个部分:
property和DataType。
property:
标签里定义了name-value对。
DataType:
用于表示一套复杂的数据集,例如FileSet和Path
数据类型的定义通常和target平级,也就是是数据类型一般直接在project下一层定义,当然也有一些直接定义在task里面,通常我们定义在和target平级的时候,可以在task下面引用这些数据类型。
总结ANT的数据类型如下:
argument参数:
从命令行传递到buildfile的参数
environment环境变量:
传递到buildfile的环境变量
filelist文件列表:
文件不一定存在
fileset文件集:
文件必须存在
patternset模式集
filterset过滤集
path路径,还有classpath
mapper映射:
定义了输入与输出文件之间的一套复杂的关系。
ANT的数据类型很多,以上列出的是一些常用的数据类型,下面重点总结一些我自己常用的数据类型,如environment,fileset,patternset,path
1、property属性
一个项目可以配置很多property,property可以在在buildfile里面设置,也是可以在外部设置,在task中可以引用property,通过'{'和'}'符号来引用
ANT属性的定义原则是取第一次定义的值,也就是说相同的属性,定义了多次,只有第一次定义的值是有效的。
例如:
#override.properties
test=first
--buildfile-->
因为override.properties文件中已经设置了test的值,所以在buildfile里面第二次设置的值是无效的,test的值仍然是first
build-inproperties
ANT提供了访问系统properties的机制,也就是build-inproperites,所谓系统properties,可以查看System.getProperties返回的值,以下是我的机器上的系统properties
--listingproperties--
java.runtime.name=Java(TM)2RuntimeEnvironment,Stand...
sun.boot.library.path=D:
\jdk1.3.1_03\jre\bin
java.vm.version=1.3.1_03-b03
java.vm.vendor=SunMicrosystemsInc.
java.vendor.url=:
:
URL:
:
path.separator=;
java.vm.name=JavaHotSpot(TM)ClientVM
file.encoding.pkg=sun.io
java.vm.specification.name=JavaVirtualMachineSpecification
user.dir=G:
\server
java.runtime.version=1.3.1_03-b03
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
os.arch=x86
java.io.tmpdir=C:
\TMP\
line.separator=
java.vm.specification.vendor=SunMicrosystemsInc.
java.awt.fonts=
os.name=Windows2000
java.library.path=D:
\jdk1.3.1_03\bin;.;C:
\WINNT\system3...
java.specification.name=JavaPlatformAPISpecification
java.class.version=47.0
os.version=5.0
user.home=C:
\DocumentsandSettings\anonymous
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=GBK
java.specification.version=1.3
user.name=anonymous
java.class.path=D:
\eclipse2.1.2\plugins\org.eclipse.j...
java.vm.specification.version=1.0
java.home=D:
\jdk1.3.1_03\jre
user.language=zh
java.specification.vendor=SunMicrosystemsInc.
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=interpretedmode
java.version=1.3.1_03
java.ext.dirs=D:
\jdk1.3.1_03\jre\lib\ext
sun.boot.class.path=D:
\jdk1.3.1_03\jre\lib\rt.jar;D:
\jdk1...
java.vendor=SunMicrosystemsInc.
file.separator=\
java.vendor.url.bug=:
:
URL:
:
cgi-bin/bugreport...
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
user.region=CN
sun.cpu.isalist=pentiumi486i386
这些build-inproperties可以直接象引用properties那样,例如:
{java.home}
除此之外,ANT还提供了自身的build-inproperties:
basedir
ant.file
ant.version
ant.project.name
ant.java.version
2、Environment环境变量
假设你根据你的工作环境配置了下面的property:
/java/xalan-j_2_1_0"/>
显然你的buildfile到其他开发人员的环境下面能够成功运行的可能性很小,因为其他人的xalan很可能在其他目录,使用Environment环境变量可以解决这个问题
"/>
关键是:
设置了这个属性之后,以后可以直接引用环境变量,只要前面加一个env.的前缀就可以了。
3、fileset文件集
fileset表示了一套文件的集合,通常定义为project-level,ANT的task可以通过显式(explicit)的方式来引用或者直接嵌套fileset,如果是直接嵌套,这个时候fileset是task-level的,很多ANT的task都支持隐式(implicit)的fileset,也就是说这些TASK支持fileset的所有属性和嵌套的子元素,和filelist不同的是fileset所表示的文件必须存在。
Fileset可以定义为target-level的,并通过他们的id来引用。
fileset支持以下常用的属性(casesensitive,defaultexcludes请查阅官方文档):
dir必须指定,用于指定文件所在的目录
excludes可选,用于指定在dir指定的目录下那些不应该包括进来的文件,内容是逗号分割的文件模式(filepattern)。
excludesfile跟excludes类似,区别是只能包括一个模式,通常情况下我习惯使用excludes,因为excludes也包括了excludesfile的功能
includes可选,用于指定在dir指定的目录下那些需要包括进来的文件,内容是逗号分割的文件模式(filepattern)。
includesfile跟includes类似,区别是只能包括一个模式,通常情况下我习惯使用includes,因为includes也包括了includesfile的功能
除了上面的属性之外,fileset还可以嵌套多个(或0个)以下的patternset元素
,,,.
关于patternset的用法,我会在patternset这个部分专门总结。
例子:
等价于
等价于
也等价于
--laterinthesamebuildfile-->
4、patternset模式集
fileset将文件合成一个组,patternset将模式合成一个组,它们的概念很接近,其实fileset依赖于patternset来选择文件,patternset可以表达为target-level,然后通过它的id来引用,也可以直接嵌套在fileset下面,那些支持隐式(implicit)的fileset的task也支持嵌套的patternset。
patternset支持includes,excludes,includesfile,excludesfile四个属性,这跟fileset的用法一样,还支持以下的嵌套的元素:
0..n个嵌套的和元素,它们支持以下属性
name必须指定,内容为相应的include和exclude的模式。
if 可选,和target的if属性的用法一样
unless可选,和target的unless属性的用法一样
0..n个嵌套的和元素,它们支持以下属性:
name必须指定,内容为相应的include和exclude的模式,但是只能是单个
if可选,和target的if属性的用法一样
unless可选,和target的unless属性的用法一样
例子:
patternset的定义
patternset的引用
5、path路径
path这个DataType可以是attribute也可以是一个嵌套的元素,最常用的是classpath这个形式,但是也用于其他用途。
当作为XML元素使用的时候,path的用法非常的灵活,path支持以下attribute
location可选,表示单个文件或者单个路径,它跟path的区别是数量上的,path可以表示多个文件和路径
path可选,路径或者文件列表,用;或者:
作为分隔符
refid可选,引用其他的path的id,如果在buildfile里面会经常用到同样的path,可以将其定义为一个公用的,然后在使用到这个path的地方通过refid来引用,如果refid被指定了,path的其他attribute和其嵌套的元素都是禁止使用的。
path支持的嵌套元素如下:
0..n个嵌套的pathlelement定义在路径下的一个或者多个文件,pathelement支持location和path这两个attribute,用法和path元素一样。
0..n个嵌套的
0..n个嵌套的
classpath是path元素的一个针对类路径的特殊的元素,具有和path用样的使用语法,但是使用的场合主要是task下面。
例子:
等价于
等价于
六、目标驱动ANT
为什么说目标驱动ANT呢,这其实是我的学习方法,也就是说我使用ANT来做什么,而“做什么”就是我们的目标,也就是buildfile里面的target,只学习跟我们的目标有关的部分,其他的留到用的时候查阅有关资料,现学现卖,我学习ANT的目的是为了更好的辅助我的项目的创建,而不是要成为ANT的专家。
就我目前的工作内容出发,我需要ANT协助我完成编译,测试,打包,发布,生成文档,有些时候,还会使用到版本控制系统。
组织一个良好的目录结构是完成一次成功的build所必须的,apache的开源项目的目录结构提供了事实上(defacto)的标准,如非特殊需要,我们可以直接采取那样的目录结构。
project_home #项目所在目录
\src #源码
\java #Java主程序代码
\test #Java测试程序代码
\conf #manifest声明文件
\lib #库文件目录
\doc #项目有关说明文档,如果是开源项目,通常该目录下是相应的webcontent
\api #生成项目的JavaAPI文档的地方
\build #用于创建的临时目录
\classes#编译的结果保存在该目录
\dist #用于发布的临时目录,通常会将build\classes下的文件打包成jar,保存在该目录下
README #项目的说明文件
RELEASE #项目的发布文件
LICENSE #项目的license文件
下面是一个和目录有关的配置的例子:
--thefollowing targetsareignored-->
编译:
1。
编译器的选择
对于,除了classic(JDK1.1/1.2)和modern(JDK1.3/1.4/1.5),还有不同的编译器可以选择,例如:
jikes,jvc,kjc,gcj,sj等等,不过我还没有用过这些编译器,默认的编译器是你用来运行ANT的JDK1.X所带的编译器,如果你想使用自己的编译器,需要如下声明,ANT运行的时候会自动用你配置的编译器来编译:
--使用jikes编译器-->
2。
的语法
编译可以说是ANT里面最基本的任务,首先回顾一下命令行下进行编译的命令:
c:
\hellworld>javac-dbuild\classes
-classp