Ant 入门学习教程及实例

dingzi_

贡献于2016-05-26

字数:0 关键词: Ant 项目构建

Ant 入门学习教程及实例 ............................................................................................2 第一章 一个简单的 Ant 例子 ..............................................................................2 第二章 Ant 基础知识准备 ...................................................................................3 1.project.........................................................................................................3 2.target.......................................................................................................... 3 3.project 与target 的小关系 ....................................................................... 5 4.task..............................................................................................................5 5.数据元素 .....................................................................................................5 6.Ant 自检顺序 ..............................................................................................5 第三章 特性 property..........................................................................................7 1.设置特性的方式 .........................................................................................7 2.特性的不可变性 ...................................................................................... 10 3.特性的作用域 .......................................................................................... 10 第四章 时间戳 tstamp.......................................................................................12 第五章 条件判断 Contidion..............................................................................14 1.逻辑判断 .................................................................................................. 14 2.资源存在性判断 ...................................................................................... 15 3.字符串匹配 .............................................................................................. 16 4.文件内容匹配 .......................................................................................... 17 5.特性 (property)存在性判断 .................................................................... 18 第六章 数据类型 Data Type............................................................................. 19 1.argument Data Type................................................................................19 2.environment Data Type.......................................................................... 19 3.filelist Data Type......................................................................................21 4.fileset Data Type 与patternset Data Type.......................................... 22 5.filterset Data Type...................................................................................23 6.path Data Type.........................................................................................24 7.mapper Data Type...................................................................................25 第七章 Ant 扩展包 ant-contrib 的使用 ........................................................... 27 1. ant-contrib 的安装方法 ......................................................................... 27 2. ant-contrib 逻辑任务 ............................................................................. 28 3. ant-contrib 特性任务 ............................................................................. 30 AAAAntntntnt 入门学习教程及实例 第一章一个简单的Ant Ant Ant Ant 例子 Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个 工具,大多用于 Java 环境中的软件开发。 本人使用Ant 的场景是拿它在后台执行编译、打包Android 工程的操作,在 Ant 工作期间,仍可正常使用 Ecelipse,避免痛苦的等待。 在使用之前应先 下载 Ant 并部署执行环境 ,细节上来说就是个添加系统环境 变量的过程,具体可参考: ant 安装、环境变量配置及验证 。 下面直接给出一个 Ant 的例子: 代码 1.1 Hello World Ant 并没有定义它自己的语法,它的执行文件用 XML 编写。 以上代码存储在文件 build_01_hello_world.xml 中。执行该文件则需命令: ant –f build_01_hello_world.xml,运行效果如下: 图1.1 Hello World 执 行命令后,第一行显示编译的文件绝对路径 ;空 格一行后的 “Echo:”则表 示当前执行的 target 名为 “Echo”;“[echo]”表示当前输出是由 Ant 的echo 任 务(Task)发起的。最后给出 “BUILDSUCCESSFUL”的提示及执行的消耗时长。 执行Ant 构建文件还有一个更简单的方式,把构建文件命名为build.xml,则 只要在构建文件所在目录下执行命令行 ant,即可运行。 第二章Ant Ant Ant Ant 基础知识准备 通过以上操作, Ant 的大门已经为你打开。现在解释介绍一下 Ant 中重要的 三个元素。 1.1.1.1.projectprojectprojectproject project 元素有三个属性。 name 表示当前工程名称 ; 当Ant 被调用时,如果没有指定执行具体的目标 (target),则 default 将指定 要执行的目标 ; basedir 用于指定 Ant 的基础目录 ,Ant 中所有的相对路径都将以此值为基础 进行计算。 这三个元素都不是必备的,但为了方便工程的执行,通常都会对default 进 行赋值。在代码 1.1 中,直接就支接运行了 Echo 目标打印 “Hello world!”。 2.2.2.2.ttttarararargetgetgetget target 是一系列 task 任务的有序集合。 1.1.1.1. tartartartarget get get get 的分类: 属性description 为当前目标(target)处理的业务逻辑进行描述。有被赋值的 目标(target)称为Main Target。未被声明的则为Subtarget。通过命令行:ant –f buildfile.xml –projecthelp 可以将 target 区分开来。 代码 2.1 Target 分类 图2.1 Target 分类 由上图可看出,Main Target 清单中有”Echo”,并做出了描述;但未对 description 赋值的 target:EchoSubTarget 并没有被打印出来。 2.2.2.2. target target target target 具有依赖特性 先给出一段代码,如下: 代码 2.2 target 的依赖特性 2.1 target 的依赖关系 属性”depends”可 以决定 target 之 间依赖关系 ;并 且不限定依赖个数,即一个 子target 可以同时依赖多个父 target。 2.2 target 多重依赖的调用顺序 假若要执行D,由于C依赖自B,B依赖自A,所以这些target 的调用顺序 会是 :A�B�C�D。 2.3 target 多次依赖的调用次数 D依赖了 A、B、C,但由于 C与A、B及B与A的依赖关系 ,在执行 D时前 的初始化操作中,A、B、C都仅会且仅会被执行一次。并不会因为D中刻意声 明依赖自 B和A会再单独执行 B、A,因为 C的初始化操作中已经执行过一次了 。 2.4 依赖的传承 在A声明的 数据元素 ,包括特性 (property)和Data Type,或时间戳 (tstamp) 等仍可以在 B、C、D中使用。 在下面的代码中 ,默认目标 target 为D。当Ant 执行此文件 ,由于 D的依赖 关系,会依次调用 A、B、C,并且 A、B、C都只会被调用一次。而 D作为最底 层的依赖目标 target,可以直接使用上层被依赖 target 内的所有数据元素。 代码 2.3 依赖关系示例 图2.3 依赖关系示例 以上示例代码见 build_02.2_depends.xml。 3.3.3.3.project project project project 与target target target target 的小关系 每个 Ant 文件由单个的 project 元素组成 ,该元素可以包含一个或多个 target 元素。一个目标(target)是生成过程中已定义的一个步骤,可以定义任意数量的 操作 ,比如编译源代码 ,对Apk进行签名等 。这些操作本身由其他专用任务 (Task) 标签执行 。通常为了编写的灵活性 ,把数量较多的操作根据其业务逻辑划分到单 独的目标 (target)元素中 ,这样可以有选择性的执行整体生成过程中的单独部分 。 例如 ,可以调用某些目标元素 ,直接对安装包进行重新签名 ,而不需要从头执行 编译操作。 4.ta4.ta4.ta4.tasksksksk task 是指一系列内嵌在 target 的任务元素。用它来处理具体的业务操作 。在 上面的例子中,已经使用到打印输出的任务 task:“echo”。 5.5.5.5.数据元素 Ant 中数据元素可以分为两类:特性和 Data Type。 特性 (property)表示字符串数据的名 -值对 。除了字符串以外 ,任何其他数据 类型均不能与特性相关联。下面的第三章将会专门用来讲解特性的使用。 Data Type 的出现解决了批量的路径和文件列表定义用多个特性值表示相当 繁琐的问题 。Ant 中支持的 Data Type 有:argument、environment、filelist、fileset、 filterset、path、mapper。 6.Ant 6.Ant 6.Ant 6.Ant 自检顺序 Ant 构建文件定义了一个 project 及一个或多个 target,而target 内又可以包 含一个或多个 task。用Xml 表示了一个层次树结构 。Ant 在处理时也遵循此树的 路径 。在工 程级元素 (project level,即元素内的 XML 级),Ant 会对 XML 元素做宽度优先遍历 ,在目 标级 元素(即元素内的 XML 级),Ant 要完成 深度优先遍历。即,会先加载并处理在元素下一级上的所有元素,然 后再移至第一个目标 target,从目标 target 的第一个元素开始 ,在移至下一个元 素之前会尽可能向下 (尽可能深 )地处理各个元素。 以上的话简单的说 ,为Ant 在进行自身的错误检测或预编译处理时 ,会先处 理全部的工程级元素 ,然后按运行到的目标 target 顺序逐一按深度优先的方式进 行处理。 第三章特性propertypropertypropertyproperty 自定义构建过程中,特性property 提供获取高频度使用的字符串的简便方 式 。一个特性拥有一个区分大小写的 name 和 一个 value, 要直接使用某一特性 的具体赋值时,需要引用这样的格式:”${name}”。假设有一特性名为”builddir” 并被赋值为 ”build”,则可以这样引用到到一个新值中去 ,如”${builddir}/classes”, 在运行时环境中该值将被解析为 ”build/classes”。 1.1.1.1.设置特性的方式 设置一个特性并对其赋值有 6种方式,下面一一道来。 1.1 直接赋值 Nested a text 代码 3.1 直接赋值的方式可以是同时对”name”和”value”进行设置具体值,如 ${name1.1};也可以只将 ”value”值嵌套在 标签内,如 ${name1.2}。 1.2 由文件路径相关设置特性 与单个文件路径相关的特性可以通过设置 location 指定相关文件名 ,并额外 可 以选用相对路径模式,设置 relative 为true, 并将相对的基础目录 basedir 赋 值。见代码 3.2 处${name2.1}。 亦可以设置文件过滤器 ,将一系列符合过滤条件的目标文件以绝对路径的形 式按顺序组合起来 ,作为特性的结果值 。设置文件过滤器 fileset 及文件路径 path 将 会在以后的章节中讲到。本例子中只是需要准备一个 path 元 素并作为参数对 属性中的 refid 赋值即可。见代码 3.2 处${name2.2}。 代码 3.2 下图给出了代码 3.2 的具体运算结果。 图3.2 运行结果。 1.3 从文件中直接导入 有时为了方便亦可以从文件中直接导入特性 。但对文件的内容有具体的格式 要求 。文件内容必须是以 的形式排版 ,并且不能包含汉字 。对于出现 的汉字需要以转义符的形式出现。 name3.1_web=qq.com name3.1_im=qq.pc 代码 3.3 直接导入的文件内容格式 导入文件的方式也非常简单,在特性中对其元素 file 赋值即可。 代码 3.4 直接导入的文件内容格式 有时文件不存在于可直接访问的路径下 ,如文件被存于某个 .jar 包中 。则需 要在特性中通过classpath 指明.jar 路径(相对于已经声明的basedir),并以资源 读取的方式将 peoperty 文件在 jar 内的完整包路径完整写出。 代码 3.5 从jar 中导入特性配置文件 1.4 从已经设置的环境变量中读取 先来查看一下当前已设置的环境变量 ,右击 “我的电脑 ”→“高级系统设置 ”, 在弹出的 “系统属性 ”框中选择 “高级 ”标签卡点击 “环境变量 ”。如下图 3.3。 图3.3 系统环境变量 环境变量中声明了一些系统属性 ,如当前系统名 、关键的项目路径等 。假设 需要获取”OS”的值,需要将所需特性property 与当前系统环境关联起来,设 置”environment=env”,用”env”表示当前系统环境 ;并作为当前系统环境下所有 系统属性的参数前缀。如用 ”${env.OS}”来表示当前系统环境中 “OS”的真实值 。 做法如下: 代码 3.6 关联系统环境 1.5 从网络文件中读取 特性支持直接从网络文件中导入 。网络文件的格式要求与从本地文件中导入 读取的要求相同,文件内容亦都是以 形式存在,对字符集亦有同样要求。 设置特性中 ”url”指定网络文件链接即可。 如果该特性是直接声明在project 下,则会在运行target 之前,去访问该链 接,此时会有卡顿。如果是声明在target 内,则只有Ant 运行到该target 且运 行到该句特性声明时,才会去读取网络文件链接。 直接给出示例如下: 代码 3.7 从网络文件中读取 1.6 由命令行运行结果设置 当需要使用到命令行的运行结果作为 Ant 任务的参数时 ,也有方便的处理方 法: 代码 3.8 获取主机名 通过exec 任务执行本地命令”hostname”来获取设置的主机名,并将该命令正 常运行的输出结果 ,即本设置的主机名 ,将会赋值到特性 ”name5.host.name”中去 , 如果找不到该本地命令或者命令执行过程中出错,则会将出错内容提法赋值 到”name5.error”中去。 对特性property 的声明与赋值到这里就讲完了。相关示例代码见 ant_demo\build_03.1_property_.xml。 2.2.2.2.特性的不可变性 特性(property)在声明被赋值之后,其值是不可变的,在整个编译文件中将 视为常量而非变量。 在下面的代码中 ,特性 ”color”先被赋值为 ”blue”,然后再被赋值为 ”red”,Ant 在构建过程中将对其第二次赋值视为无效。在接下来的打印输出中仍打印 出”blue”。 代码 3.9 特性的不可变性 3.3.3.3.特性的作用域 工程级元素(project level,即元素内的XML 级)的第一级特性 (property)具有作用域是全局的 ,在构建文件中一直都有效 。在目标 (target)标签 下声明的特性在当前目标 target 内有效 ,并且其作用域延续到之后运行的其它目 标(target)内。 在如下的代码 3.10 中,声明了一个具有全局作用域的特性 “color”,能够直接 被构建文件中的所有目标 (target)直接使用 。在目标 (target)”Scope”下,单独声明 了一个内部特性 ”inner.color”。该特性在另一个目标 (target)”ScopeNew”中被引用 到。如果仅运行目标 ”ScopeNew”,则仅会打印出字符 “${inner.color}”;但若先 运行目标”Scope”再接着”ScopeNew”,则"ScopeNew" 打印出来的会是特性 ${inner.color}的实际值 ”red”。 代码 3.10 作用域 图3.4 作用域 在图3.4 的运行效果中,当只运行目标(target) “ScopeSecond”时,对于特性 “inner.color”由于未被赋值,只被当作字符串打印出来。接下来的第二条命令 先运行了目标target“ScopeFirst”,有对特性”inner.color”赋值为”red”了,则当 运行到目标 target“ScopeSecond”时,则打印出了值 ”red”。 此处解释一下 ant 命令行参数。由于一个 ant 构建文件由多个目标 target 组 成,当想指定运行某个或某几个目 标target 时,可以 在ant 命令后添加目 标target 的名称。如下: ant -f buildfile.xml TargetA TargetB ...... TargetN 第四章时间戳tstamptstamptstamptstamp Ant 编译工程中,有时需要在构建环境中使用当前的时间和日期,或标记某 个生成任务的输出 ,以便记录它们是何时发生的 ,常见的做法是把时间信息直接 打印出来或整合到生成的文件名中去。这时就需要使用到时间戳。 使用时间戳时只需要简单的写一个时间戳标签 ” ”,Ant 会自动生成 三个可用的与时间相关的属性如下: DSTAMP:以”yyyyMMdd”的形式输出时间,表示年月日,如 ”20130525” TSTAMP:以”hhmm”的形式输出时间,表示小时分钟,如 ”1039” TODAY:以”MMMM dd yyyy”的形式输出时间 ,表示年月日 ,如”May 25 2013”. 示例代码如下: DSTAMP: ${DSTAMP} TSTAMP: ${TSTAMP} TODAY: ${TODAY} 代码 3.11 时间戳的使用 start.DSTAMP: ${start.DSTAMP} start.TSTAMP: ${start.TSTAMP} start.TODAY: ${start.TODAY} 代码 3.12 时间戳前缀使用 如果想要区分多个时间戳,可以使用时间戳内的属性 ”prefix”来区分。 Ant 亦支持自定义时间戳格式 ,在标签 ”tstamp”内嵌一 ”format”即可 。”format” 支持的属性有: property:声明当前时间戳的名称 pattern:在这里自定输出的时间格式, timezone:设置输出时间的时区 locale:根据地区输出时间格式 current.date.time1: ${current.date.time1} current.date.time2: ${current.date.time2} current.date.time3: ${current.date.time3} current.date.time4(offset:-10min): ${current.date.time4} 代码 3.12 自定义时间显示格式 format 还支持时间差的设置 ,”offset”用于指定时间差的具体数值 ,正数表示 未来的时间,负数表示已经过去的时间,另外用 ”unit”设置时间差的具体单位, 时间单位可以是: millisecond、second、minute、hour、day、week、month、 year。 图3.5 自定义时间显示格式输出 自定义时间戳格式,常用的格式化模式字符见下表 常见的格式化的模式字符如下: LetLetLetLet terterterter DateDateDateDate orororor TimeTimeTimeTime ComponentComponentComponentComponent PresentationPresentationPresentationPresentation ExamplesExamplesExamplesExamples GEra designator Text AD yYear Year 1996 ; 96 MMonth in year Month July ; Jul ; 07 wWeek in year Number 27 WWeek in month Number 2 DDay in year Number 189 dDay in month Number 10 FDay of week in month Number 2 EDay in week Text Tuesday ; Tue aAm/pm marker Text PM HHour in day (0-23) Number 0 kHour in day (1-24) Number 24 KHour in am/pm (0-11) Number 0 hHour in am/pm (1-12) Number 12 mMinute in hour Number 30 sSecond in minute Number 55 SMillisecond Number 978 zTime zone General time zone Pacific Standard Time ; PST ; GMT-08:00 ZTime zone RFC 822 time zone -0800 第五章条件判断ContidionContidionContidionContidion Ant 提供了非常丰富的条件判断语句。下面将分别讲述几种常用的条件判断 方法。更加丰富的条件判断可以点击 这里 进行阅读。 1.1.1.1.逻辑判断 逻辑判断包括单条件判断的断言 istrue/isfalse,及多条件判断的与 and、或 or、非 not、异或 xor 等常见逻辑操作。 代码 5.1 逻辑判断 输出结果如下: 图5.1 逻辑判断结果 2.2.2.2.资源存在性判断 在Ant 运行时过程中 ,如果需要判断某些资源是否存在 ,则可以使用 avaiable 任务。该任务可以判断指定的一个文件、文件夹、类路径中的下的资源或JVM 系统资源是否存在。 如果指定的资源存在 ,则avaiable 默认将其预先设定的属性值设为 true,否则 就不予赋值。亦可通过 value 属性自定义赋值。 在以下代码中 ,指定了一个路径 ,通过并在 avaiable 处的 type 设置为 dir 表 示该路径表示一个文件夹。其最张结果会反映到 condition 任务上,如果该文件 夹存在,则特性 rar.file.exist 赋值为 ”Exist!”,反之为 ”Can’t be found!”。 代码 5.2 判断文件夹存在性 下面的代码演示了判断Ant 的运行时环境中是否包含类路径 为”org.apache.tools.zip.ZipFile”的类 。对classname 设置将要判断的类路径即可 。 代码 5.3 运行时类资源存在性 如果要判断指定的外部类库,则需指定对 classpath 设置外部类库的路径。 代码 5.4 引用外部类库的类资源存在性 如果要查找的是引用类库中的某个文件 ,则将要查找的文件赋值 到resource。 在指定资源路径时 ,与类路径使用的 ”.”划分符不同 ,资源路径的划分路径符为 ”/”。 代码 5.5 引用外部资源的资源存在性 上面的代码中, avaialable 刻意嵌套了 classpath,里面可以嵌套一个或多 个 pathelement 来指定引用的外部类库,将引用的外部类库路径赋值到 location 即 可。 3.3.3.3.字符串匹配 可以使用 equals 任务来判断两个给定的字符串内容是否相同 。equals 任务重 要的属性说明如下: arg1/arg2:指定两个用来对比的字符串,这两个参数必须有被赋值。 casesensitive:设定在匹配过程中是否区分大小写 ,默认值 为true 区分大小写 。 trim:在匹配过程中是否去除空格再比较。默认为 false。 可以使用 contains 任务来判断能否在指定的字符串中搜索出另一个字符串 。 contains 任务只有三个属性: string:指定被搜索的字符串。 substring:指定搜索的字符串。 casesensitive:是否区分大小写。默认为 true 区分大小写。 下面给出示例代码: 代码 5.6 字符串匹配 图5.2 字符串匹配结果 4.4.4.4.文件内容匹配 使用 filesmatch 任务, Ant 还支持直接对两个文件内的内容直接进行匹配。 filesmatch 会 对两个文件进行逐字节的匹配,直至找到不相等的内容或两个 文件都逐字节匹配完毕返回true 结果。所以文件匹配的时间消耗完全取决于两 个文件的大小及差异的多少。 当用于匹配的两个文件有一个存在 ,一个不存在时 ,则直接返回 false 结果 。 当用于匹配的两个文件都不存在时,则直接返回 true 结果。 当两个文件都存在但字节大小不一致时,则直接返回false 结果,不会进行 逐字节比较。 代码 5.7 文件匹配 5.5.5.5.特性(property)(property)(property)(property)存在性判断 使用 isset 任务可以直接判断是否存在一个以指定值命名的特性 (property)。 示例代码如下: 代码 5.8 特性 (property)存在性判断 第六章数据类型DataDataDataData TypeTypeTypeType Ant 的核心功能有两个基本概念:特性和 Data Type。 同特性一样, Data Type 在Ant 中扮演任务参數的角色,可以在一個任務內部 声明 ,也可以在任务外部定义 ,并为它起个名字 ,再把这个名字传给任务 。这样 就可以在多个任务中共享一个 Data Type。 但在构建过程中, Data Type 支持比特性更加复杂的数据内容,比如一个待编 译的文件列表或者一个待刪除的目录集 。下面来逐一说下 Ant 支持的 Data Type. 1.1.1.1.argumentargumentargumentargument DataDataDataData TypeTypeTypeType 用于 Ant 调用命令行任务时 ,向其传递命令参数 。如apply、exec、和java 等 任务均接受嵌套 元素 。在构建文件中以 ””的形式为具体的任务传递参 数。以下是 的所有属性列表: value:直接指定命令行参数值,允许参数中包含空格,但空格不起分隔作用, 所以如果你的参数中有空格但又想将它作为单独一个值,则使用此属性。 line:用空格分隔的多个参数的列表。 file:指定一个参数的文件名 。应该要注意的是此文件名相对于当前的工作目录 。 在Ant 运行时过程中,此文件名会被转换为一个绝对路径。 path:指定参数路径,多个路径间可以使用 ";"分开。 pathref:引用 数据类型。 将在下面会讲解。 需要有一个且仅有一个以上的属性。 接下来示例如下 : 表示一个包含空格的参数 “-l -a”。当需要传递的参数 ,比如某个文件名中包 含空格,就需要使用到 value。 表示传递了由空格分隔的两个参数 ”-l”和”-a”。 表示传递了一个单独的参数,在基于DOS 的系统会自动解释 为”/dir;/dir2;/dir3”;Unix 系列的系统将解释成 ”/dir:/dir2:/dir3”。 2.environment2.environment2.environment2.environment DataDataDataData TypeTypeTypeType 对于执行系统命令的apply 和exec 任务,本地执行的.bat 或shell 批处理文 件需要接收由 Ant 传递过去的参数 。这时可以使用 对系统可执行文件传递 参数。 元素接受以下属性: key:环境变量名。 file:作为环境变量值的文件名。此文件名会被转换为一个绝对路径。 path:作为环境变量的路径 ,Ant 会自动将它转换为一个本地约定 (如文件分隔 符的不同 )。 value:环境变量的一个直接量值。 以上属性中 key 是必须的, file、path、value 只能三选其一。 代码 6.1 环境变量传参 %jad_home%\jad -d %output_dir%%class_file% 代码 6.2 DOS 环境下 build_06_02_arg_env.bat 文件运行代码 $jad_home\jad -d $output_dir $class_file 代码 6.3 Unix 环境下 build_06_02_arg_env.sh 文件运行代码 以上代码演示了 Ant 调用本地的批处理文件 ,直接并向批处理文件传递了三 个 参数的过程。 Jad 工 具可以将指定的 .class 文 件反编译并将结果 AntTest.jad 输 出到output_dir 中。在批处理文件中,要注意的是DOS 环境下的变量引用是使 用”%param%”方式,而 Unix 环境下是使用 ”$param”方式。 图6.1 环境变量示例效果 在示例代码 6.1 中,指定 ”jad_home”的方式为以硬编码的方式直接设定了值 。 尽管在自己的机子上可能可以工作 ,但在其它的开发人员机器上则极有可能因路 径的不同而导致失败 。为避免出现这种问题 ,可以约定俗成的要求开发人员在运 行之前设置一次 jad_home 的环境变量到系统中,情况更好。以下为做了优化后 的修改 : environment="env"/>environment="env"/>environment="env"/> 代码 6.4 优化后的环境变量设置 在上面的优化代码中,通过 environment="env"/>environment="env"/>environment="env"/>就将系统环 境变量导入到Ant 的运行时中,只要在在变量名前加上前缀”env.”,就可以引用 任何环境变量了。 3.3.3.3.filelistfilelistfilelistfilelist DataDataDataData TypeTypeTypeType filelist 是一个支持一系列具体命名的文件列表的Data Type,与第4部分将 要 讲的 filesets 相 比, filelist 中 指定的文件可以是不存在的,指定文件时不支持 通配符扩展。以下为 filelist 支持的属性: dir:用于计算绝对文件名的目录。 files:一系列指定的文件名,多个文件名间可以用逗号、空格或换行符分开 。 refid:利用已经定义好的 filelist。 在以上三个属性中,可以只指定 refid,或者在不指定 refid 的情况下 dir 和 files 必须同时被赋值。 filelist 是与dependset 任务一同使用的。dependset 任务将一个或多个输入 文件与另外的一个或多个目标文件加以比较 。如果某些输入文件更新 ,或缺少某 些输入文件 ,则所有的目标文件都将会被删除 。这种功能的应用场景当目标文件 需要依赖于输入文件的最新状态时 ,即可删除目标文件 ,根据目标文件的是否存 在来判断是否需要重新生成目标文件。 ${toString:xml.file01} 代码 6.5 filelist 示例代码 在上面代码中,dependset 任务通过指定输入文件为xml.file01 与xml.file02,即 文件集合 build_01.xml、build_02.xml、build_03.xml,Ant 会去 检查这三个文件是否存在,当这三个文件存在缺失或者这三个文件比目标文件 build.xml 的状态要新,则 Ant 会将目标文件 build.xml 进行删除。 4.4.4.4.filesetfilesetfilesetfileset DataDataDataData TypeTypeTypeType 与patternsetpatternsetpatternsetpatternset DataDataDataData TypeTypeTypeType fileset Data Type 定义了一组文件,通常在构建文件中用 元素表示 。 不过 ,许多 Ant 任务构成了隐式的 fileset,这说明它们支持所有 fileset 属性和嵌 套元素 。与filelist 类型不同 ,由fileset 表示的文件必须存在 。fileset 还可能指定 为目标级构建文件(即的子元素),并由其id引用。以下为fileset 常用 属性列表: dir:fileset 的基目录。 casesensitive:默认值为 true,表示在匹配文件时是区分文件名的大小写的。 excludes:用逗号分隔的需要排除的文件模式列表。 excludesfile:用逗号分隔开的需要排除的文件名。 includes:用逗号分隔开的需要包含的文件模式列表。 includesfile:用逗号分隔开的需要排除的文件名。 除了以上列出的属性外, fileset 还支持内嵌 0到多个 patternset 元素。 fileset 是对文件的分组,而 patternset 是对模式的分组。它们是紧密相关的 概念 ,因为 fileset 依赖于选择文件的模式 。元素可能作为目标级构 建文件元素出现(即作为的子元素),而且后面将通过其id被引用。 patternset 元素有 4种,对于 ,支持以下属性: name:包含或排除的模式。 if:特性名。只在设置了该特性时 Ant 才使用此模式。 unless:特性名。只在未设置该特性时 Ant 才使用此模式。 对于 ,支持以下属性: name:包含和排除模式的文件的文件名。 if:特性名。只在设置了该特性时 Ant 才使用此模式。 unless:特性名。只在未设置该特性时 Ant 才使用此模式。 代码 6.6 使用 fileset 复制文件 5.5.5.5.filtersetfiltersetfiltersetfilterset DataDataDataData TypeTypeTypeType filterset Data Type 允许定义一组过滤器。这些过滤器将在文件移动或复制 时完成文件中的文本替换 。这称为记号过滤 (token filtering)。若在输入文件中发 现了某些记号则会出现此文本替换 。当文本移动或复制时 ,这些记号被替换为匹 配过滤器中所定义的文本 。filterset 支持内嵌 元素来执行具体的文本替换 任务 ,filter 任务总是将 @字符用作记号分隔符 ,而filterset 则允许定制开始和结 束记号分隔符。 filterset Data Type 由元素表示 ,可以作为 copy 和move 任务中嵌 套的内容出现,或者作为目标级构建文件元素出现(即project 的子元素)。以下 为filterset 支持的常用属性: begintoken:标定目标替换文字的起始字符串。默认为 @。 endtoken:标定目标替换文字的结尾字符串。默认为 @。 id:对此过滤器的唯一标识符 。当过滤器定义为一个目标级构建文件元素且需 要在以后被引用时,则就是必要的。 refid:对构建文件中某处定义的一个过滤器的引用。 filterset 可以嵌套 0到n个元素,该元素属性有: token:指定需要替换的记号,不包括定界符。如果此过滤器要替换 @VERSION@,则将 VERSION 作为此属性值即可。 value:指定当遇到记号时,要替换的新的文本。 代码 6.7 filterset 示例 以上代码将对src.dir 下所有的.java 文件进行记号过滤替换。自动为.java 标 记上 author 为sodino 及填写上真正的时间日期。 替 换前 : *@author %author! *@date@ 替 换后 : *@author sodino * May 31 2013 代码 6.8 filterset 运行前后对比 6.6.6.6.pathpathpathpath DataDataDataData TypeTypeTypeType path 用于表示一个或多个文件的路径,也可以由通配符或fileset 等其它的 data type 来表示一系列符合过滤规则的文件集合。在作为一个属性时,路径中 的各项文件用分号 (;)或冒号 (:)字符隔开 。path 具有非常大的灵活性 。以下为 path 支持的常用属性: location:表 示一个文件或目录。在运行时会自动转换成该文件或目录的绝对 路径。 path:一个文件或路径名列表,并以 ”;”或”:”分隔。 refid:对当前构建文件中某处定义的一个 path 的引用。 id:对此路径的唯一标识符。 location 和path 均是可选的,但不能与 refid 同时声明。 path Data Type 还支持以下嵌套元素: 0到n个嵌套的 元素 : 定义一个或多个要包含在 path 中的文件 。每个嵌套的 就像包 含它的 path DataType 一样,还支持 location 和path 属性。 0到n个嵌套的 元素 : 提供高级的文件过滤规则。 0到n个嵌套的 元素 : 将路径递归地嵌套到其他路径中。 代码 6.9 path 示例 7.7.7.7.mappermappermappermapper DataDataDataData TypeTypeTypeType mapper 定义了一组源文件与一组目标文件之间的对应关系。之前所讲述的 filelist、fileset 等只是定义了一组源文件的输入规则,而mapper 不限于此,它 可以在构建文件中约定文件执 行copy、move 后的输出规则 。如有选择性的对 .java 进行备份复制后在各个文件后追加”.bak”的后缀名;将从多个不同目录的一组文 件复制到同一个目标目录中等。 这种依据输入规则而重新自定义其输出规则 Ant 中称之为映射处理 。映射处 理有以下几种方式: 1.1.1.1.identityidentityidentityidentity mappermappermappermapper 恒等映射 。文件的输入与输出为一一匹配原则 ,不作修改 。最常见是在 copy 任务中默认使用到。 表6.1 identity mapper 的结果 输 入文 件 MapperDemo.java lab/sodino/AntTest.java 输 出文 件 MapperDemo.java lab/sodino/AntTest.java 2.2.2.2.flattenflattenflattenflatten mappermappermappermapper flatten mapper 会从文件名中删除所有的路径信息。如果希望从多个不同目 录中将一组文件复制到一个目录中 ,这就很有用 。这里需要注意的是 ,因为取消 了目录信息 ,如果这组文件中出现相同文件名的情况 ,那么就会造成覆盖 ,所以 一般要求不要有重名。 表6.2 identity mapper 的结果 输 入文 件 MapperDemo.java lab/sodino/AntTest.java 输 出文 件 MapperDemo.java AntTest.java 3.3.3.3.globglobglobglob mappermappermappermapper 全局映射 。基于简单的通配模式确定目标文件名 。若要对已经有一致文件名 (如以Test.java 结尾)的一组文件重命名,这就很有用。其中标签中的 属性 ”to”和”from”定义了模式 ,其中至多有一个 ”*”字符 。当一个源文件名与 ”from” 模式匹配时,即生成目标文件名。”to”属性的*要替换成”from”属性的*所对应的 匹配文本。 表6.3 glob mapper 的结果 输 入文 件 MapperDemo.java lab/sodino/AntTest.java 输 出文 件 MapperDemo.java lab/sodino/AntJavaTest.java 再来看一下 mapper 对fileset 的影响 。在下面的代码 6.10 中,fileset 设置 了 copy 的 文件为 *.java 及*.txt 文 件,但 mapper 中的”from”将 范围限制得更小仅接 受文件名以 ”Test.java”结尾的文件 ,导致在真正执 行copy 任务时 ,只有 ”*Test.java” 文件才会被复制,而其它的 java 文件及 txt 文件都被抛弃了。 代码 6.10 glob mapper 的使用 4.4.4.4.mergemergemergemerge mappermappermappermapper 合并映射。该映射”from”属性则被忽略不用,只将所有源文件名与”to”属性 所指定的相同目标文件相匹配 。merge mapper 通常与 uptodate 任务一起工作用 于比较一组源文件和某个目标文件的时间戳。 在下面的代码中,如果指定所有.java 文件中存在某个文件比javac_class.jar 要新 ,则特性 "need.to.do.javac"值为 true,反之则不存在特性 ”need.to.do.javac”。 接着代码通过条件判断来给出一个确切的结果将是否需要再重新编译java 文件 赋值到特性 ”do.javac”上。最后打印出结果。 代码 6.11 merge mapper 的使用 5.5.5.5.packagepackagepackagepackage mappermappermappermapper 包 映射。与 glob mapper 的 功能相似,只是将属性 ”from”指 定文件的目录信 息作为新文件的文件名前缀添加到输出文件的文件名上。 表6.4 package mapper 的结果 输 入文 件 MapperDemo.java lab/sodino/AntTest.java 输 出文 件 MapperDemo.Subfix.java lab.sodino.AntTest.Subfix.java 6.6.6.6.unpackageunpackageunpackageunpackage mappermappermappermapper 解包映射 。为包映射的反操作 ,会将文件名中的路径信息去掉并创建新的目 录将输出文件存储到新目录中。 表6.5 package mapper 的结果 输 入文 件 MapperDemo.java lab.sodino.AntTest.java 输 出文 件 MapperDemo.Subfix.java lab/sodino/AntTest.java 第七章Ant Ant Ant Ant 扩展包ant-contrib ant-contrib ant-contrib ant-contrib 的使用 Ant-contrib 是使用 Ant 编写脚本最重要的补充 。当使用 Ant 编写一些较为复 杂的逻辑功能,比如循环和流程判断时,自然希望 Ant 能支持这种编程能力 。然 而Ant 核心任务中并没有提供 任务,只是在 任务的属性中支 持if 属性,比如,即表示只 有property-A-present 属性存在才执行 targetA 目标 。但是 ,必须注意的一点是 , 这里的if 并不是判断module-A-present 属性是否设置为特定值,而仅仅是检查 该属性是否被设置了,因而其可编程性并不是很强。 Ant-contrib 为Ant 提供了与通常所使用的编程语言功能相同的 等逻辑判断任务 ,支持对字符串的排序 任务 ,甚至还支持常见 的数学运算 ,如加 、减、乘、除、求余等功能 。在构建过程中灵活运用这两个扩 展包,将大大增强 Ant 的可编程性,这其实就是一种基于 XML 脚本的编程。 1.1.1.1. ant-contrib ant-contrib ant-contrib ant-contrib 的安装方法 在复杂的持续集成环境中 ,涉及到一些扩展项目来搭建 Ant 环境 ,是Ant 易 扩展性的表现。外部工具的提供者只要实现特定的 Ant 任务接口,就可以提供 自定义的Ant 任务,只需要通过 任务引入这些特定的Ant 任务, 便可以实现与这些工具的连接 ,实现通过 Ant 脚本来管理整个集成环境的目的 。 为引入 ant-contrib 扩展包,有下面 3种方式: a.将ant-contrib.jar(点击 这里 下载 )复制 到Ant 安装目录下 的lib 文件夹下 , 或者直接将其添加到系统的环境变量中去。当需要在Ant 构建文件中使用到 ant-contrib.jar 的功能时,需要在构建文件中 元素下紧跟着声明如下代 码: 代码 7.1 ant-contrib.jar 声明方式一 b.将ant-contrib.jar 放在一个单独的路径中 ,在使用时需要对 Ant 指定 jar 包的具体存放路径。具体代码如下: 代码 7.2 ant-contrib.jar 声明方式二 c.如果使用 Ant 1.5 版本,则 所引用的资源必须是 ”.properties”文 件来替代,并且可能出现如 任务不支持的情况。 代码 7.3 ant-contrib.jar 声明方式三 2.2.2.2. ant-contrib ant-contrib ant-contrib ant-contrib 逻辑任务 下面讲述一下 ant-contrib 支持常用逻辑判断任务。 a.a.a.a. if if if if 逻辑判断 if的逻辑判断非常简洁易懂 ,该标签没有任何的标签内属性 ,在标签 下紧跟着嵌套一个条件判断任务 ,如果条件判断为真 ,则直接处理 标签的 内容;如果条件为假,则跳转到标签中,接下判断该标签内的条件判断 并根据结果选择去处理接下来的内容或者再跳转出来处理标签的 内容。 值得注意的是 ,if逻辑判断中 ,标签是必须的 ,标签可以是 0个, 也可以是连续的多个 ,标签可以是 0个,或者只有 1个,而且只能出现在 最后的判断中。 代码 7.4 if 逻辑判断代码 b.b.b.b. switch switch switch switch 判断 switch 任务支持对特性(property)的直接比较判断。标签内只有一 个属性 ”value”用于指定要进行判断的字符串或特性 ;里面可以内嵌 标签及 标签, 标签内有属性 ”value”用于指定被比较的字符串或特性 ,当 两者匹配时,则执行内的任务。否则跳转到中去。在switch 任 务中必须至少有一个 标签或 标签。 代码 7.5 switch 逻辑判断代码 c.c.c.c. for for for for 循环 for 任务实现了对指定的字符串集 、文件集合进行逐一遍历 。for 任务中有属 性”list”可以指定固定的遍历集合,也可以使用fileset 等数据元素动态指定在遍 历的文件集合 。for 任务中有属性 ”param”可以指定遍历过程中的遍历项 ,当需要 引用该遍历内容时,使用”@{param}”即可得到当前遍历的内容。在遍历的过程 中,可以使用 结合当前的遍历项执行某些操作。 Letter @{letter} 代码 7.6 for循环示例一 在上面的代码 7.6 中,可以发现 for 任务需要自定义一个命名空间 ”ac”。并将 属性 ”list”中的内容逐一打印出来。 代码 7.7 for循环示例二 在上面的代码 7.7 中,指定了需要遍历的文件集合,并逐一将文件集合中的 文件复制到指定的目录中。执行copy 任务时,Ant 会判断当目标文件不存在, 或目标文件文件比源文件要旧时,才会真正将源文件复制到目标路径下。 3333.... ant-contrib ant-contrib ant-contrib ant-contrib 特性任务 ant-contrib 也增加与特性操作相关的任务。下面简单讲下其中的两个。 a.a.a.a.数学运算 Ant-contrib 增加了 Math 任务 ,不但支持常见的加 、减、乘、除运算 ,也支 持求余、指数运算、正弦等。 下面简单演示一下加法运算。 标签中通过属性”operand1”和”operand2”指定运算值,属 性”operation”指定运算规则为 ”+”加法 ,属性 ”datatype”指定了运算的数据类型为 整型。经过运算后,会将结果赋值到特性 ”result”中去。 ${op1} ${op} ${op2} = ${result} 代码 7.7 Math 加法运算示例 b.b.b.b.变量 (Variable)(Variable)(Variable)(Variable) 变量(Variable)为Ant 提供了一个值可变的特性,并且可以像Java 中的参数 赋值一样工作 。变量的可变性虽然违背了标准的 Ant 特性规则 ,但有时候在构建 过程中改变特性值的功能是有用的 。变量可以单独设置 ,也可从一个标准的属性 文件中加载。变量还有一个特点是,变量可以覆盖特性,但特性不能覆盖变量 。 因此,如果已经存在的特性,可以通过作用变量来对其进行值的修改。 变量有如下属性: name:变量名。 value:变量的赋值。 unset:当值为 true 时,将特性的值从构建环境中删除当作从未设置过。 file:用于加载变量的标准的属性文件路径。 以上 4个属性中 ,name 是必须设置的 。但如果指定了标准的属性文件路径 , 则name 可不设置。 在下面的代码中,演示了变量修改特性 “x“值的操作。 ${x} ${x} 代码 7.8 变量修改特性值 变量还支持在赋值的过程中直接进行字符串拼接 。如下面的代码 ,变量 “str “经过多次引用自身的当前值与新的字符串拼接后,最终合并成全新的字符串 值”I am a string.”。 ${str} 代码 7.9 变量的简单运算

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档

相关文档