点击此处下载StartWithAnt完整的pdf文档与代码:http://download.csdn.net/detail/sodino/6603769

Ant-contrib是使用Ant编写脚本最重要的补充。当使用Ant编写一些较为复杂的逻辑功能,比如循环和流程判断时,自然希望 Ant 能支持这种编程能力。然而 Ant 核心任务中并没有提供 <if> 任务,只是在 <target> 任务的属性中支持 if 属性,比如 <target name="targetA" if="property-A-present"/>,即表示只有 property-A-present 属性存在才执行targetA 目标。但是,必须注意的一点是,这里的 if 并不是判断 module-A-present 属性是否设置为特定值,而仅仅是检查该属性是否被设置了,因而其可编程性并不是很强。

Ant-contrib 为 Ant 提供了与通常所使用的编程语言功能相同的 <if> 、 <for>、<switch>等逻辑判断任务,支持对字符串的排序<sortlist>任务,甚至还支持常见的数学运算,如加、减、乘、除、求余等功能。在构建过程中灵活运用这两个扩展包,将大大增强 Ant 的可编程性,这其实就是一种基于 XML 脚本的编程。

1. ant-contrib的安装方法

在复杂的持续集成环境中,涉及到一些扩展项目来搭建Ant环境,是Ant易扩展性的表现。外部工具的提供者只要实现特定的 Ant 任务接口,就可以提供自定义的 Ant 任务,只需要通过 <taskdef> 任务引入这些特定的 Ant 任务,便可以实现与这些工具的连接,实现通过 Ant 脚本来管理整个集成环境的目的。

为引入ant-contrib扩展包,有下面3种方式:

a. 将ant-contrib.jar(点击这里下载)复制到Ant安装目录下的lib文件夹下,或者直接将其添加到系统的环境变量中去。当需要在Ant构建文件中使用到ant-contrib.jar的功能时,需要在构建文件中<project>元素下紧跟着声明如下代码:

<taskdef resource="net/sf/antcontrib/antlib.xml"/>

代码7.1 ant-contrib.jar声明方式一

b. 将ant-contrib.jar放在一个单独的路径中,在使用时需要对Ant指定jar包的具体存放路径。具体代码如下:

<taskdef resource="net/sf/antcontrib/antlib.xml"><classpath><pathelement location="/usr/share/java/lib/ant-contrib-version.jar"/></classpath>
</taskdef>

代码7.2 ant-contrib.jar声明方式二

c. 如果使用Ant 1.5版本,则<taskdef>所引用的资源必须是”.properties”文件来替代,并且可能出现如<for>任务不支持的情况。

<taskdef resource="net/sf/antcontrib/antcontrib.properties"><classpath><pathelement location="/usr/share/java/lib/ant-contrib-version.jar"/></classpath>
</taskdef>

代码7.3 ant-contrib.jar声明方式三

2. ant-contrib逻辑任务

下面讲述一下ant-contrib支持常用逻辑判断任务。

a. if逻辑判断

if的逻辑判断非常简洁易懂,该<if>标签没有任何的标签内属性,在<if>标签下紧跟着嵌套一个条件判断任务,如果条件判断为真,则直接处理<then>标签的内容;如果条件为假,则跳转到<elseif>标签中,接下判断该标签内的条件判断并根据结果选择去处理接下来的<then>内容或者再跳转出来处理<else>标签的内容。

值得注意的是,if逻辑判断中,<if>标签是必须的,<elseif>标签可以是0个,也可以是连续的多个,<else>标签可以是0个,或者只有1个,而且只能出现在最后的判断中。

<property name="what.is.your.name" value="mobile.qq"/>
<if>
<equals arg1="${what.is.your.name}" arg2="mobile"/>
<then>
<echo message="My name is mobile."></echo>
</then>
<elseif>
<equals arg1="${what.is.your.name}" arg2="qq"/>
<then>
<echo message="My name is qq."></echo>
</then>
</elseif>
<else>
<echo message="I don't know your name."/>
</else>
</if>

代码7.4 if逻辑判断代码

b. switch判断

switch任务支持对特性(property)的直接比较判断。<switch>标签内只有一个属性”value”用于指定要进行判断的字符串或特性;里面可以内嵌<case>标签及<default>标签,<case>标签内有属性”value”用于指定被比较的字符串或特性,当两者匹配时,则执行<case>内的任务。否则跳转到<default>中去。在switch任务中必须至少有一个<case>标签或<default>标签。

<switch value="${what.is.your.name}"><case value="mobile">
<echo message="The value of property is mobile" /></case><case value="qq">
<echo message="The value of property is qq" /></case><default>
<echo message="The value of property is ${what.is.your.name}" /></default>
</switch>

代码7.5 switch逻辑判断代码

c. for循环

for任务实现了对指定的字符串集、文件集合进行逐一遍历。for任务中有属性”list”可以指定固定的遍历集合,也可以使用fileset等数据元素动态指定在遍历的文件集合。for任务中有属性”param”可以指定遍历过程中的遍历项,当需要引用该遍历内容时,使用”@{param}”即可得到当前遍历的内容。在遍历的过程中,可以使用<sequential>结合当前的遍历项执行某些操作。

<ac:for list="a,b,c,d,e" param="letter"  xmlns:ac="antlib:net.sf.antcontrib">
<sequential>
<echo>Letter @{letter}</echo>
</sequential>
</ac:for>

代码7.6 for循环示例一

在上面的代码7.6中,可以发现for任务需要自定义一个命名空间”ac”。并将属性”list”中的内容逐一打印出来。

<ac:for param="xmlfile" xmlns:ac="antlib:net.sf.antcontrib">
<fileset dir="${basedir}" includes="**/*.xml"/>
<sequential>
<copy file="@{xmlfile}" todir="${des_dir}/for"></copy>
<echo message="@{xmlfile}"/>
</sequential>
</ac:for>

代码7.7 for循环示例二

在上面的代码7.7中,指定了需要遍历的文件集合,并逐一将文件集合中的文件复制到指定的目录中。执行copy任务时,Ant会判断当目标文件不存在,或目标文件文件比源文件要旧时,才会真正将源文件复制到目标路径下。

3. ant-contrib特性任务

ant-contrib也增加与特性操作相关的任务。下面简单讲下其中的两个。

a.数学运算

Ant-contrib增加了Math任务,不但支持常见的加、减、乘、除运算,也支持求余、指数运算、正弦等。

下面简单演示一下加法运算。

<math>标签中通过属性”operand1”和”operand2”指定运算值,属性”operation”指定运算规则为”+”加法,属性”datatype”指定了运算的数据类型为整型。经过运算后,会将结果赋值到特性”result”中去。

<var name="op1" value="12"/>
<var name="op2" value="6"/>
<var name="op" value="+"/>
<math result="result" operand1="${op1}"
operation="${op}"
operand2="${op2}"
datatype="int"/>
<echo>${op1} ${op} ${op2} = ${result}</echo>

代码7.7 Math加法运算示例

b.变量(Variable)

变量(Variable)为Ant提供了一个值可变的特性,并且可以像Java中的参数赋值一样工作。变量的可变性虽然违背了标准的Ant特性规则,但有时候在构建过程中改变特性值的功能是有用的。变量可以单独设置,也可从一个标准的属性文件中加载。变量还有一个特点是,变量可以覆盖特性,但特性不能覆盖变量。因此,如果已经存在的特性,可以通过作用变量来对其进行值的修改。

变量有如下属性:

name:变量名。

value:变量的赋值。

unset:当值为true时,将特性的值从构建环境中删除当作从未设置过。

file:用于加载变量的标准的属性文件路径。

以上4个属性中,name是必须设置的。但如果指定了标准的属性文件路径,则name可不设置。

在下面的代码中,演示了变量修改特性“x“值的操作。

<property name="x" value="6"/>
<echo>${x}</echo>   <!-- will print 6 -->
<var name="x" unset="true"/>
<property name="x" value="12"/>
<echo>${x}</echo>   <!-- will print 12 -->

代码7.8 变量修改特性值

变量还支持在赋值的过程中直接进行字符串拼接。如下面的代码,变量“str“经过多次引用自身的当前值与新的字符串拼接后,最终合并成全新的字符串值”I am a string.”。

<var name="str" value="I "/>
<var name="str" value="${str} am "/>
<var name="str" value="${str} a "/>
<var name="str" value="${str} string."/>
<echo>${str}</echo>     <!-- print: I am a string. -->

代码7.9 变量的简单运算

[Ant][StartWithAnt] 第七章 Ant扩展包ant-contrib的使用相关推荐

  1. python - 啃书 第七章 模块、包和库 (二)

    常用第三方库 Pandas Pandas 中文网 Pandas是基于NumPy库的一种解决数据分析任务的工具库 Pandas库纳入了大量模块和一些标准的数据模型,提供了高效的操作大型数据集所需的工具 ...

  2. python - 啃书 第七章 模块、包和库 (一)

    概述 在Python中,一个模块(Module)是一个以.py结尾的Python文件,包含了Python对象和语句. 在python中,一切皆对象.数字.字符串.元组.列表.字典.函数.方法.类.模块 ...

  3. Python程序开发——第七章 模块与包

    目录 一.模块的定义 二.导入模块.调用模块 (一)import语句 (二)from-import语句 三.标准模块库 (一)sys模块 (二)os模块 (三)random模块 (四)time模块 四 ...

  4. 读书笔记-《ON JAVA 中文版》-摘要7[第七章 封装]

    文章目录 第七章 封装 1. 包的概念 2. 访问权限修饰符 3. 接口和实现 4. 类访问权限 5. 本章小结 第七章 封装 访问控制(或者隐藏实现)与"最初的实现不恰当"有关. ...

  5. 服务器架构之性能扩展-第七章(8)

    第七章Cacti系统监控邮件报警和压力测试 7.1 Cacti工作原理 原理简单来说,Cacti就是rrdtool的一个forefront,它内置了快速的获数据取工具.优秀的绘图模板以及许多设计精良的 ...

  6. 产品打包工具的制作,ant,编译源码,打jar包,打tag,打war包,备份release版本等...

    1.  在进行打包工具的制作前,需要准备的软件有: svnant-1.3.1 作用是让ant和svn相关联 apache-ant-1.9.7 需要设置ant_home,path,我的配置是: ANT_ ...

  7. 产品打包工具的制作,ant,编译源码,打jar包,打tag,打war包,备份release版本等

    1.  在进行打包工具的制作前,需要准备的软件有: svnant-1.3.1 作用是让ant和svn相关联 apache-ant-1.9.7 需要设置ant_home,path,我的配置是: ANT_ ...

  8. ANT发送邮件需要的3个JAR包

    ANT发送邮件需要的3个JAR包:activation.jar.mail.jar.commons-email-1.2.jar 将这三个jar包放到 $ANT_HOME/LIB 路径下即可 内网发送邮件 ...

  9. Laravel大型项目系列教程(七)之7 扩展包和Artisan开发

    本节教程将讲解扩展包开发和Artisan扩展开发,并浏览不同分辨率下的自适应效果.本节结束后整个教程就结束了,文章最后有完整版程序代码的下载. 1.扩展包开发 在前面开发中,我们经常要用到通知,如修改 ...

最新文章

  1. memcached原理详述及配置
  2. 流程图的制作技巧分享,手把手教你如何画流程图?
  3. 不同的PCB混装方式及加工工艺
  4. go标准命令详解0.2 go install
  5. 2021.02.01 Visual QA论文阅读
  6. 函数运用_月隐学python第10课
  7. date oracle 显示毫秒_Oracle中根据Date型转换成Java对应的long型毫秒数
  8. python syslog 接口_python接口测试之日志功能
  9. opencv实现几幅图像拼接成一整幅大图
  10. arcgisserver修改服务器地址,ArcGIS 10.1 for Server入门(7-6)ArcGIS for Server 10.1 服务迁移与恢复--多台服务器...
  11. python中列表,元组,字典常用操作方法的总结
  12. 关于WINDOWS超级终端的使用来调试MODEM,串口.
  13. Pattern 模式器: Matcher 匹配器
  14. 国家代号(CountryCode) - 常用国家地区代码和国际电话代码
  15. 手把手带你写 Vue 可视化拖拽页面编辑器
  16. grub4dos 启动ubuntu 12.04
  17. gps测试软件怎么算正常,完整的GPS测试和经济实用的解决方案
  18. android studio怎么设置,android studio快捷键如何设置 android studio快捷键设置方法
  19. java处理解析xml文件的几种方法及每种方法的区别
  20. PC_控制器_微程序控制器和硬布线控制器

热门文章

  1. uniapp引入openLayers天地图
  2. js+HTML实现组织结构图
  3. 迁移mysql数据库报错_数据库迁移失败报错
  4. 哪些服务器支持 9200系列CPU,核心暴增、修复漏洞:intel 英特尔 发布 Xeon Platinum 9200和8200系列 处理器...
  5. linux kernel内核编程基础总结
  6. [hihocoder]1238 : Total Highway Distance
  7. CC2640R2F的各个驱动文件放在哪里比较好
  8. 看inux系统中的c语言编译器,Linux系统自定义安装C语言gcc编译器图文详细教程
  9. oracle 控制文件 dump,将控制文件dump出来研究下内容
  10. 求菲波那切数列第n项