前言:Ant工具内置提供了一些有用的类型,这些类型相当于Java系统中的变量用于存储执行过程中的信息。利用Ant工具提供的核心类型能方便地定义变量,并可在target中进行引用。所有的Ant工具的类型都具有id和refid这两个属性,id作为这个类型的唯一标示,而refid用于指定要引用的类型,指定refid为要引用的类型的id。
针对基础部分请参考:Ant基础入门篇
1.Assertions Type:断言类型
断言类型可在 <java> 和 <junit> 任务(task)中引用。当断言失败时会抛出java.lang.AssertionError的异常。
1.1 断言类型的属性及功能
在Ant工具中assertions类型只有一个属性:enableSystemAssertions,这个属性表示是否允许系统断言的功能。默认为unspecified,代表没有指定;当属性为true时才代表允许使用系统的断言,JVM会输出相应的断言信息;属性为false代表不允许使用系统断言。
Assertion类型中可以包含另外的一些类型:enable、disable。
1.1.1 enable类型
指定在特定的代码中允许使用断言。如果没有指定具体的代码,则所有的代码将允许使用断言。enable类型包含两个属性:
- class属性:指定允许执行断言的类的名字
- package属性:指定允许执行断言的Java包。在这个包下的类将允许执行断言,包括这个包下的子包中的类
1.1.2 disable类型
这个类型作用于enable类型正好相反,指定哪些类不允许执行断言。由于默认时断言是disable类型的,因此只有当父包为enable类型同时要指定子包或这个包下的具体某个类为disable类型(不允许执行断言),这时disable类型就派上用场了。disable类型包含以下两个属性:
- class属性:指定不允许执行断言的类的名字
- package属性:指定不允许执行断言的Java包。在这个包下的类将不允许执行断言,包括这个包下的子包中的类
1.2 通过断言类型让Ant工具执行Java断言的实例
1.2.1 所有用户代码允许执行断言的断言类型
<assertions>
<enable/>
</assertions>
这个例子表示所有用户定义的Java类允许执行Java断言,但不包括JDK中的类库。
1.2.2 允许单个Java class执行断言
<assertions>
<enable class="Test"/>
</assertions>
允许名为Test的类执行断言
1.2.3 在某个Java包下允许执行断言
<assertions>
<enable package="org.apache"/>
</assertions>
包前缀为org.apache下的Java类允许执行断言。
1.2.4 允许系统断言
<assertions enableSystemAssertions="true">
<enable package="org.apache"/>
<disable package="org.apache.tools.ant"/>
<enable class="org.apache.tools.ant.Main"/>
</assertions>
这里允许系统断言,其中的enable与disable用法与上面类同。
1.2.5 断言参照引用
<assertions id="project.assertions">
<enable package="org.apache.test"/>
</assertions>
<assertion refid="project.assertions"/>
这两个断言类型执行效果一样,都允许包前缀为org.apache.test下的类执行断言,第二个assertions类型是通过refid引用已定义的断言类型实现的。
2. Description Type:描述类型(对功能进行说明)
Description类型主要用于对功能或者一些需要说明的地方进行说明,让用户可以了解这个功能的作用,当运行构件文件时会输出这些Description类型的信息。Description类型不包含任何参数,可在target内使用,也可以放在全局的构件文件中使用。
3. PatternSet Type:定义模式集合可在FileSet和DirSet中引用
PatternSet类型可看做一个集合,在Ant构件文件中可以通过refid属性对已定义的PatternSet类型进行引用。PatternSet类型可用于FileSet类型和DirSet类型中,用于定义文件或目录的匹配集合。在PatternSet类型中可以使用 <include> 和 <exclude> 类型定义包含或不包含的文件模式,当然可以包括本身的属性。
3.1 模式结合类型属性及功能
PatternSet类型具有以下4个属性:
- includes属性:用于指定PatternSet里所要包含的文件类型。如果includes属性没有被指定,则表示将包含所有文件。
- includesfile属性:用于指定要包含的具体的文件。可以用property元素指定具体的文件,然后在includesfile属性中引用这个属性。当然也可以通过 <includesfile> 类型来指定多个被包含的文件。
- excludes属性:用于指定PatternSet中将不被包含的文件模式。如果属性没有指定,则将不排除任何文件。
- excludesfile属性:用于指定不被包含的具体文件,与includesfile属性的作用正好相反。
可以看出上面的都是复数形式,因此都是可以指定多个的,下面是上面四个属性中可以嵌套的类型
3.1.1 include类型
用于指定要包含的文件的匹配模式,符合这个模式的文件将被包含。
这个类型具有以下3个属性:
- name:指定包含的文件的模式
- if:用于指定执行的条件限制,如果if属性所引用的属性已经被设定,那么将会使用这个文件模式。
- unless:指定一个与if属性相反的条件限制。
3.1.2 exclude类型
用于指定不被包含的文件模式,符合文件模式的文件将不被包含。
这个类型也有以下3个模式:
- name
- if
- unless
3.1.3 includesfile类型
用于指定PatternSet类型中要包含的文件的名称或路径,可嵌套于PatternSet类型中。
includesfile类型包括以下3个属性:
- name
- if
- unless
3.1.4 excludesfile类型
用于指定PatternSet类型中不被包含的文件的名称或路径,可嵌套于PatternSet类型中。
excludesfile类型包括以下3个属性:
- name
- if
- unless
3.2 通过模式集合类型来定义文件集合的实例
包含所有名称不包含Test的.java文件的示例:
<patternset id="non.test.sources">
<include name="**/*.java"/>
<exclude name="**/*Test*.java/>
</patternset>
引用已定义的PatterSet类型的示例:
<patternset refid="non.test.sources"/>
在PatterSet类型中使用includesfile类型的例子:
<patternset includesfile="some-file"/>
<!--与下面的PatterSet定义作用一样-->
<patternset>
<includesfile name="some-file"/>
</patternset>
通过引用property元素定义的文件模式的PatterSet类型的例子:
<patternset>
<includesfile name="some-file"/>
<includesfile name="${some-other-file}" if="some-other-file"/>
</patternset>
4. DirSet Type:定义文件目录集合
DirSet 类型用于定义文件目录的集合。这组目录可以在根目录的文件树中查找到,也就是说位于构件文件指定的根目录下。
在DirSet类型中可以引用PatternSet类型,通过PatternSet类型指定符合要求的目录。同时在DirSet类型中也可以直接使用 <include>,<includesfile>,<exclude>和<excludesfile> 类型,用于指定符合要求的目录。多数情况下会在target中直接嵌套使用DirSet类型,也可以通过refid引用已定义的DirSet类型。
4.1 目录集合类型属性及功能
DirSet类型具有以下7个属性:
- dir属性:用于指定DirSet类型可以访问的目录树的根节点。这个属性是必须的。
- includes属性:用于指定DirSet类型中包含的文件。
- includesfile属性:用于指定在DirSet类型中要包含的文件。
- excludes属性:用于指定在DirSet类型中不被包含的文件。
- casesensitive属性:用于指定文件目录匹配时是否大小写敏感。属性设置为yes,true或on时表示敏感;设置为no,false或off时表示不敏感。默认情况下是大小写敏感。
- followsymlinks属性:用于指定是否采用与操作系统类型相关的属性(比如文件路径分隔,在Windows和Linux下不一样),默认为true,即使用系统相关的属性。
4.2 使用include、exclude类型定义目录集合的实例
<dirset dir="${build.dir}">
<include name="apps/**/classes"/>
<exclude name="apps/**/*Test*"/>
</dirset>
这个目录集合的根目录为${build.dir}指定的位置。
4.3 使用PatternSet Type来定义目录集合的实例
<dirset dir="${build.dir}">
<patternset id="non.test.classes">
<include name="apps/**/classes"/>
<exclude name="apps/**/*Test*"/>
</patternset>
</dirset>
然后其他DirSet类型可直接引用上面定义的PatternSet,如下:
<dirset dir="${build.dir}">
<patternset refid="non.test.classes"/>
</dirset>
5. FileSet Type:定义文件集合
FileSet类型可用于定义文件集合。在FileSet类型中可以引用PatternSet类型和Selector类型来指定集合中包含的文件。FileSet类型可以在target元素中引用,也可以直接在target元素中嵌套使用。
5.1 文件集合属性及功能
- dir属性:指定FileSet类型引用的根目录,FileSet类型所包含的文件都基于这个根目录。
- file属性:用于指定要包含的单个文件。在FileSet类型中至少需要指定file属性或者dir属性。
- defaultexcludes属性:用于指定是否忽略Ant工具中默认的将不被包含的文件模式。**取值为yes代表忽略,no代表不忽略。** 在Ant工具中默认不包含的文件模式如下: **/*~,**/#*#,**/%*%,**/._*,**/CVS,**/.cvsignore,**/SCCS,**/SCCS/**,**/vssver.scc,**/.svn,**/.svn/**,**/.DS_Store
- includes属性:用于指定文件集合所包含的文件,默认时包含根目录下的所有文件。可以指定多个文件的匹配模式使用逗号或空格符进行分隔。
- includesfile属性:用于指定文件集合所包含的文件的名称。
- excludes属性:作用是指定文件集合将不包含的文件,默认时只忽略满足上面所说的Ant工具默认不包含的文件模式的文件。
- excludesfile属性:用于指定文件集合中不包含的文件的名称。
- casesensitive属性:用于定义文件匹配时是否大小写敏感。取值为yes、true或on时表示大小写敏感;反之no、false或off。默认时为大小写敏感。
- followsymlinks属性:用于指定是否采用与操作系统相关的属性(比如文件路径分隔),默认为true表示使用系统相关的属性,Ant会根据操作系统的不同,使用不同的属性。
5.2 常用selector及其功能:通过selector对文件进行筛选
selector是一个泛指,selector类型可看作FileSet类型中的一个元素,可以直接在target类型内部使用,也可以在其外部定义然后通过refid属性进行引用,来实现对文件进行筛选。不同的selector中具有不同的属性,且一部分可以包含其他的selector。
5.2.1 contains
contains这个 selector只选择包含text属性中指定的字符串的文件。
包含的属性:
- text属性:用于指定每个文件必须包含的字符串,只有包含这个字符串的文件才能被包含。这个属性是必须的,且不能为空。
- casesensitive属性:用于指定字符串是否大小写敏感。默认为true(敏感)
- ignorewhitespace属性:用于指定是否忽略text属性中的空格。默认为false(不忽略)
实例:
<fileset dir="$doc.path}" includes="**/*.html">
<contains text ="script" casesensitive="false"/>
</fileset>
作用:选择所有包含script字符串的html文件。
5.2.2 date
date selector可用于选择文件的修改时间在某个特定的时间之前或之后的文件。
包含的属性:
- datetime属性:指定一个用于比较的特定时间。格式为:MM/DD/YYYY HH:MM AM 或PM (eg: 09/09/2006 10:10 am)
- millis属性:指定一个毫秒数作为时间间隔,这个毫秒数从1970年零时零分开始计算。大多数情况下建议使用datetime属性。datetime属性和millis属性必须有一个不能为空
- when属性:定义如何进行比较。
- before:文件修改时间在这个特定时间之前
- after:文件修改时间在这个特定时间之后
- equals:文件修改时间等于这个特定时间(默认情况为equals)
- granularity属性:用于指定一个文件修改时间间隔的允许误差,这个误差为毫秒数。
- pattern属性:用于指定解释datetime属性时是否兼容Java中SimpleDateFormatter的格式。
- checkdirs属性:checkdirs属性指定是否检查文件目录的创建日期,默认为false。
<fileset dir="${jar.path}" includes="**/*.jar">
<date datetime="01/01/2000 12:00 AM" when="before"/>
</fileset>
作用:选择 ${jar.path} 目录下所有修改在 "01/01/2000 12:00 AM" 之前的.jar文件。
5.2.3 depend
depend selector用于比较两个不同目录下名称相同的文件,然后选择文件修改时间最迟的那个文件,在depend selector
包含的属性:
- targetdir属性:指定进行比较的目标文件目录
- granularity属性:用于指定一个文件修改时间的允许误差,取值为毫秒数。
<fileset dir="{ant.1.5/src/main} includes="**/*.java">
<depend targetdir="$ant.1.4.1}/src/main"/>
</fileset>
作用:选择相对于Ant 1.4 版本在Ant 1.5版本中修改过的Java源文件。
5.2.4 depth
depth selector用于指定选择文件的文件目录的深度。
包含的属性:
- min属性:作用是定义一个距离根目录的最小的深度,大于这个深度的目录下的文件允许被选择
- max属性:作用定义一个距离根目录的最大深度。
max属性或min属性其中一个必须被指定
<fileset dir="${doc.path}" includes="**/*">
<depth max="1"/>
</fileset>
作用:选择根目录下的所有文件和根目录下的第一层子目录下的所有文件。
5.2.5 different
different selector 的作用是从两个目录中选择被认为不同的文件。
文件被认为不同的条件有:
- 当只有一个目录而不存在另一个指定的目录时,这些文件被认为不同
- 当位于两个目录的文件具有不同的文件长度,那么这两个文件被认为不同
- 如果ignoreFileTime属性没有设定为off,文件的修改时间不同将会被认为文件不相同
- 如果ignoreContents属性没有设定为true,将会一个一个字节地对这两个文件进行对比,以确认是否不同。
包含的属性:
- targetdir属性:用于指定一个目录,这个目录下的文件与FileSet中的dir属性指定的目录中的文件进行对比。
- ignoreFileTimes:用于指定对比时是否忽略文件的修改时间,默认为true,代表忽略。
- ignoreContents属性:用于指定是否需要一个一个字节地进行对比,默认为false。
- granularity属性:用于指定一个文件修改时间的允许误差,取值为毫秒数。
<fileset dir=${ant.1.5}/src/main" includes="**/*.java">
<different targetdir=${ant.1.4.1}/src/main"
ignoreFileTimes="true"/>
</fileset>
作用:对比Ant工具1.4和1.5 版本中的Java源文件,从中选择不相同的文件,选择过程忽略文件的修改时间。
5.2.6 filename
filename selector的作用是选择符合指定文件模式匹配的文件,通常为文件名匹配。与PatternSet中的 <include>和<exclude> 。
包含的属性:
- name属性:用于指定被选择的文件的名称,name属性可以包含Ant工具的通配符,这个属性是必需的。
- casesensitive属性:用于指定文件名是否大小写敏感,默认为true。
- negate属性:用于指定这个selector将起相反的作用,不满足selector的文件被选中,相当于有 <include> 转为 <exclude> 的功能,默认为false。
<fileset dir="${doc.path}" includes="**/*">
<filename name="**/*.css*/"/>
</fileset>
作用:选择所有的css样式文件
5.2.7 present
present selector 的作用是指定一个与FileSet中的目录相对应的目录,并从FileSet的目录里选择selector指定的目录中不存在或两个目录中都存在的文件。
包含的属性:
- targetdir属性:是必须的,用于指定要进行比较的目录(这个属性指定的目录将于FileSet中指定的dir目录进行比较)
- present 属性:用于指定是否只需要选取在FileSet指定的目录中存在,但在targetdir指定的目录中不存在的文件;或者选取两个目录中都存在的文件。如果present属性设为scronly,代表只从FileSet的源文件目录(dir属性指定)选取targetdir指定的目录中不存在的文件;如果present属性设为both,代表从FileSet指定的目录和targetdir指定的目录中选择两个目录都存在的文件。
<fileset dir="${ant.1.5}/src/main" includes="**/*.java">
<present present="srconly" targetdir="${ant.1.4.1}/src/main"/>
</fileset>
作用:从Ant1.5的src.main包中选择在Ant 1.4的src.main包中不存在的Java源文件。
5.2.8 containsregexp
containsregexp selector的作用是选择符合规则正则表达式的文件。
包含的属性:
- expression属性:用于定义一个规则表达式(正则表达式)
5.2.9 size
size selector的作用是通过文件的大小对文件进行选择,选择条件可为文件大小大于或小于指定的大小的文件。
包含的属性:
- value属性:作用是设定用于比较的文件大小,为数字。
- units 属性:用于指定value属性的单位,常用的单位有SI标准的K,M和G。(K=1000bytes,M=1000K,G=1000M)
- when属性:用于设定如何解释size selector,可设定为大于,小于或等于指定的文件的大小。
-
- less:表示小于
- more:表示大于
- equal:表示等于
<fileset dir="${jar.path}">
<patternset>
<include name="**/*.jar"/>
</patternset>
<size value="4" units="K" when="more"/>
</fileset>
作用:在 ${jar.path} 指定的目录下,选择所有大于4096bytes的jar文件
5.2.10 type
type selector用于指定要选择目录还是文件。
包含的属性:
- type属性:设定为dir表示选择目录,如果设定为file则表示选择规则文件
5.3 使用dir、include、exclude等属性定义文件集合的实例
下面通过FileSet类型内置的属性来定义文件集合的例子。这个文件集合包含根目录${server.src}下的所有Java文件,但不包含文件名称中含有Test字符的子文件。
<fileset dir=${server.src}" casesensitive="yes">
<include name="**/*.java"/>
<exclude name="**/*Test*"/>
</fileset>
另外,还可以使用filename这个类型对文件名称进行指定,通过filename类型来实现上面的功能的例子如下:
<fileset dir=${server.src}" casesensitive="yes">
<filename name="**/*.java"/>
<filename name="**/*Test*"/ negate="true">
</fileset>
negate="true"相当于exclude这些文件。
5.4 使用PatternSet Type来定义文件集合的实例
<fileset dir=${server.src}" casesensitive="yes">
<patternset id="non.test.sources">
<include name="**/*.java"/>
<exclude name="**/*Test*"/>
</patternset>
</fileset>
如果在构件文件中已定义了PatternSet类型,那么也可以通过PatternSet的引用实现同样地功能。
<fileset dir=${server.src}">
<patternset refid="non.test.sources"/>
</fileset>
6. FileList Type:定义文件列表
FileList类型用于定义一个文件列表。这个文件列表可以包含存在或不存在的文件,与FileSet类型不同,FileSet类型指定的文件一定要存在。FileList类型可以在target外部定义,在target内部对FileList进行引用,也可以嵌套使用。
6.1 文件列表类型属性及功能
- dir属性:用于指定文件列表的根目录,这个属性是必须的
- files属性:用于指定文件列表中所包含的文件。可以使用逗号或空格符进行分隔,用于指定多个文件。
在Ant1.7中将支持在FileList中通过file元素来指定具体的文件。file元素只包含name这个属性,name属性用于指定具体的文件。
6.2 文件列表类型实例
(1)包含多个文件的文件列表例子:
<filelist id="docfiles" dir="${doc.src}" files="foo.xml,bar.xml" />
这个例子指定文件列表包含 ${doc.src} 目录下的foo.xml和bar.xml这两个文件。
(2)FileList引用例子:
<filelist id="docfilesref" refid="docfiles"/>
(3)使用file元素指定文件以实现与例(1)相同的功能,指定相同的文件列表:
<filelist id="docfiles" dir="${doc.src}">
<file name="foo.xml"/>
<file name="bar.xml"/>
</filelist>
7. FilterSet Type:文件过滤器定义
FilterSet类型的作用是定义一组的文件过滤器。在移动或者复制文件时对文件的内容进行替换。
7.1 文件过滤器类型属性及功能
包含的属性:
- begintoken属性:定义一个特殊的字符,这个特殊字符用于指定要过滤的字符串的开始位置。默认为@,如@DATE@。
- endtoken属性:定义一个特殊字符,这个特殊字符用于指定要过滤的字符串的结束标识。默认为@,如@DATE@。
- recurse属性:用于表明是否可以查找更多的替换标志,默认为true。
在FilterSet类型中可以直接包含Filter类型,这个Filter定义具体的文件过滤器。
Filter具有两个属性:
- token属性:要替代的token的名字
- value 属性:指定代替值,这个值可引用变量
在FilterSet类型中可以直接包含FiltersFile类型。FiltersFile类型用于指定一个Java properties文件,利用该属性文件的属性名的属性值对应关系进行替换。FiltersFile类型具有一个必需的属性file,用于指定属性文件的名称。
7.2 通过文件过滤器替换文件内容实例
在复制文件时替换文件的版权和创建时间的例子。下面这个例子中的文件过滤器将替换文件中的@BUILD_DATE@和@VERSION@:
<target name="tokenFilterDemo" >
<!-- 通过timestamp获取当前系统时间作为build_date -->
<tstamp>
<format property="now" pattern="MMMM d yyyy hh:mm aa"/>
</tstamp>
<copy todir="build" filtering="true">
<fileset dir="src">
<include name="**/*.java"/>
</fileset>
<!-- 查询 @COPYRIGHT@ 和 @BUILD_DATE@ -->
<filterset>
<filter token="BUILD_DATE" value="${now}"/>
<filter token="COPYRIGHT" value="Copyright(C) 2006 O'Reilly"/>
</filterset>
</copy>
</target>
作用:替换所有.java文件中的版权信息和创建时间。
对上面的文件进行测试,新建build.xml文件,并创建src,在其中写入一个java文件,内容如下:
构建时间:@BUILD_DATE@
版权:@COPYRIGHT@
控制台中输入ant,我的运行结果如下:
构建时间:十二月 13 2016 12:42 下午
版权:Copyright(C) 2006 O'Reilly
7.3 自定义替换符的文件过滤器实例
定义替换开始符号位“%”,替换结束符的符号位“!”:
<!-- 复制文件时进行过滤 -->
<copy file="${build.dir}/version.txt}" toFile="{dist.dir}/version.txt">
<filterset >
<filterset begintoken="%" endtoken="!"/>
<filter token="DATE" value="$TODAY}"/>
</filterset >
</copy>
7.4 通过属性文件进行过滤的文件过滤器实例
在对文件进行过滤时,为了统一管理,可能把所有的替换字符串放到一个.properties的属性文件中。然后通过FilterSet进行过滤。
替换前src.txt的内容:
This is the test sample.
the message will be replace: #MESSAGE!
abc.properties文件中的内容:
MESSAGE=HELLO
构件文件的内容:
<?xml version="1.0"?>
<project name="porject1" default="target1">
<target name="target1">
<copy toDir="afterReplace">
<fileset dir="." >
<include name="src.txt" />
</fileset>
<filterset begintoken="#" endtoken="!">
<filtersfile file="abc.properties"/>
</filterset>
</copy>
</target>
</project>
作用:把src.txt文件复制到afterRepalce目录下,同时使用acb.properties中的内容去替换#MESSAGE!。
8. PropertySet Type:定义属性集合
在Ant1.6之后,提供了Property类型。
8.1 属性集合类型的属性及功能
在PropertySet中可以通过Propertyref类型引用构件文件中的其他property。而PropertySet类型之间可以相互作用。
PropertySet类型包含的属性:
- dynamic属性:用于指定是否动态地加载PropertySet。默认为true。
- negate属性:用于指定一个否定的属性集,如果为true代表返回除PropertySet外的属性。默认为false。
Propertyref类型可以引用当前构件文件中已定义的属性。
Propertyref类型包含的属性:
- name属性:用于指定要引用的属性的名称
- perfix属性:用于指定字符串的开头,所有以这个字符串开头的属性都会被引用
- regex属性:用预定一个表达式(可使用Java支持的正则表达式),Propertyref类型只引用复合表达式的属性
- builtin属性:用于引用Ant工具内建的属性、系统属性以及命令行输入的属性。如果builtin取值为all,代表取所有的内建属性、系统属性和命令行输入的属性都会被引用
8.2 使用属性集合的实例
(1)定义一个projectset,在这个属性集合中将包含构件文件中已定义的属性,代码如下:
<property name="lib1" value="lib1path"/>
<property name="lib2" value="lib2path"/>
<propertyset id="projectset1">
<propertyref name="lib1" />
<propertyref name="lib2" />
</propertyset>
作用:定义一个属性集合projectset1,这个集合包含名字为lib1和lib2的两个属性。
(2)PropertySet间相互引用
<property name="lib1" value="lib1path"/>
<property name="lib2" value="lib2path"/>
<propertyset id="projectset1">
<propertyref name="lib1" />
<propertyref name="lib2" />
</propertyset>
<propertyset id="projectset2">
<propertyset refid="projectset1"/>
</propertyset>
9. File Mapper Type:文件映射类型(定义文件间的相互关系)
File Mapper类型用于指定文件间的相互关系。通常用于指定Java源文件和目标文件的相关性。
9.1 文件映射类型的属性及功能
- type属性:用于指定一个具体的mapper实现的类型,Ant工具提供了内建支持,也可以编写Mapper类型的实现。
- classname属性:通过classname属性指定一个Mapper的实现类,并通过这个实现类需要实现Mapper的功能。classname和type两者必选其一,不能同时为空。
- classpath属性:用于指定查找classname类型的Java类库,就是用于指定Java类依赖的classpath。
- classpathref属性:用于引用path元素定义的classpath,这个classpath提供了编译和运行所依赖的类库。
- from属性:用于指定操作源、源文件的位置。
- to属性:用于指定操作的目标
在Ant工具中内置提供了一些有用的Mapper类型的实现,这些类型具有不同的作用和引用范围,已达到不同的文件配置的要求。
- identity:指定操作源文件与目标文件具有相同的名称,作为唯一标识。
- flatten:指定源文件的名称与目标文件的名称相同,但忽略源文件中的文件目录仅包含文件。当需要把多个目录中的文件复制到一个目录时,这个Mapper相当有用。
- glob:源文件和目标文件的匹配模式中都包含 * 的匹配符。 * 号代表匹配任何一个或多个字符。
- merge:用于把打包的源文件进行合并。目标文件名称与源文件相同,通过to属性定义具体的目录。多用于压缩和打包。
- regexp:包含to和from属性,这两个属性通过正则表达式来定义,可用于文件匹配。用正则表达式代替了简单的*匹配符,但该Mapper的结果依赖于底层的正则表达式实现。
- package:这个Mapper的作用于glob相似,模式中包含 * 的匹配符。package可用于替换目录名称。在 <junit> 任务中经常使用。
- composite:用于组合多个Mapper类型,每个Mapper类型都对源文件进行操作,最后返回所有操作后的结果。
- chained:可包含多个Mapper类型,源文件依次经过每个Mapper的操作,上一个Mapper的输出作为下一个Mapper的输入,返回经过最后一个Mapper后的执行结果。
- filterMapper:这个Mapper用于对文件名进行过滤。
9.2 Mapper的简单实例
<mapper type="identity"/>
<identitymapper>
说明:上面的两个Mapper的作用相同,一个通过type属性指定类型,另一个直接通过Mapper的类型定义。
这里值得着重完善------》》》
注意:其他Mapper的使用与上面的类同。
10. ZipFileSet Type:zip格式的文件集
ZipFileSet类型可以看作是一种特殊的FileSet。ZipFileSet具有两种不同的形式:
1. 当ZipFileSet中的src属性被使用,那么目录src下的文件会以zip文件格式进行组织。(测试的时候src属性一直无法运行,提示src的值不应该是一个文件夹,原来是把一个压缩包中的文件看作是一个文件系统)
2. 当ZipFileSet中的dir属性被使用,那么目录dir下的文件将以文件系统的形式进行组织。
ZipFileSet类型在打包jar文件和war文件时经常使用。
包含的属性:
- prefix属性:用于定义ZipFileSet中的文件路径的前缀(也就是说zip文件中的文件夹前半部分的目录)
- fullpath属性:用于定义ZipFileSet中包含的文件的全路径。(用于指定一个文件在zip中的详细路径及其名称)
- src属性:用于替代当前的目录位置。
- filmode属性:用以定义文件的权限形式,在UNIX或Linux下使用。
10.1 zip文件集合实例:实现打包zip文件的功能
通过Ant工具内建的zip任务实现打包zip文件的功能,同时可以在zip任务中引用ZipFileSet类型指定的文件,构件代码如下:
<zip destfile="目标文件的路径及名称.zip">
<zipfileset dir="打包的根目录" prefix="Zip内部的首路径/>
<zipfileset dir="." includes="aa.txt" fullpath="linshi/wogaimingzile.txt"/>
</zip>
11. FilterChains 和 FilterReaders:过滤链和过滤读取器
FilterChains相当于一组有序的FilterReader,与Java中的FilterChain过滤链的作用相似。按顺序执行FilterReader。Ant使用的FilterReader类继承java.io.FilterReader类,用户可以定义自己的FilterReader类的实现。FilterReader用于过滤Reader中的内容。
FilterReader包括一个属性classname。classname属性用于指定具体的过滤类的名称 (包含包名)
(暂时不理解————》》》》》)
<?xml version="1.0"?>
<project name="porject1" default="target1">
<target name="target1">
<!-- 复制文件时进行文件过滤 -->
<copy file="." tofile="copyFile">
<!-- 定义过滤链 -->
<filterchain>
<filterreader classname="your.extension.of.java.io.FilterReader">
<param name="foo" value="bar" />
</filterreader>
<!-- 自己定义的过滤器 -->
<filterreader classname="another.extension.of.java.io.FilterReader">
<!-- 自己定义的过滤器 -->
<classpath>
<pathelement path="${classpath}" />
</classpath>
<param name="blah" value="blee" />
<param type="abra" value="cadabra" />
</filterreader>
</filterchain>
</copy>
</target>
</project>
12. Ant Component 定制和扩展
- condition功能定制
- selector功能定制
- filter功能定制
对于这一部分,暂时不进行记录,感觉暂时不会做到这么高深的地步,先熟练掌握提供的功能再说。
参考资料:
《Ant开发及整合应用详解》