Ant学习补充--自定义任务和监听器

一、              用户自定义任务

a)         Javac exec 在处理为预见的错误和向用户提供详细的声明方面功能都是有限的。定制任务能更好的解决这个问题,构建错误,事件和消息均由任务发起,并由 Ant 引擎管理。 Ant 对这些事情做出响应,并以一种受控的方式加以处理,将他们传递给其子集的监听者或者是传递给其他用户编写的监听者。

b)         任务很擅长对简单操作进行抽象,并可以利用一个一致的接口和额外的功能使之变得更为强大。对于某些常用的跨平台 shell 功能,有些 ant 任务甚至还能处理他们之间的非一致性。

c)         Ant 的任务模型

                         i.              Ant 使用 java 的类层次和反射功能来完成其工作。所有 ant 任务都直接间接派生自抽象类 org.apache.tools.ant.Task ant 引擎在这一级别上管理所有的任务对象,但只对 task 对象进行处理。对于引擎,每个任务都派生自相同的类而且,有与各个其他任务相同的核心方法和特性。

                       ii.              Xml 解析和方法命名方案的结合使得 ant 可以使用 task 的所有子类

                      iii.              Ant 采用一种固定的方式处理任务,循环的对每一个任务进行处理

                      iv.              理解 task 类的层次结构, task 的子类不仅表示构建文件的任务,他们还表示包括有一些功能的类,而这些功能对于其他任务是有用的。有时候,一个子类甚至不是任务。 (你应当了解那些设计得与你的需求接近的任务。

                       v.              属性和嵌套元素基本是互斥的选择。属性的使用和理解先对容易,但是可读性和灵活性差。

                      vi.              Ant 与任务的通信

1.         Project 类:作为一个公共实例变量在每个任务中可用。表示整个构建文件和其中包含的所有内容,可以使你访问所有任务,目标,特性和其他构建文件部分,

a)         Project 类可用保证对构建文件的每个任务,目标和特性进行访问,甚至还可以访问某些定义构建文件应当如何执行的核心设置。

b)         Project 为所有任务定义了系统范围的常量和全局方法。常量用于系统调用参数,全局方法则提供了大量功能

c)         常用方法调用和常量

                                                                   i.              Project.getGlobalFilterSet()

                                                                 ii.              Project.getBaseDir()

                                                                iii.              Project.translatePath()

                                                                iv.              Project.toBoolean()

2.         构建异常:通过 BuildException 类实现,可以为任务提供一种向 Ant 构建引擎通知错误情况的机制。异常中包括一条错误消息和一个 Location 对象, Location 类包括构建文件名以及引擎当前所解析行的行号。

3.         日志系统:可通过 project 类访问,为任务提供一种向用户显示进展信息的方法。 Log() 方法向一个构建的已注册日志监听者发送消息,此监听者再根据其设计处理此消息字符串。默认的日志监听者将在控制台打印出所有内容。显示级别: ERROR,WARNING,INFO,VERBOSE,DEBUG

a)         Log(message) 默认 info 级别

b)         Log(message,level)

c)         Log(message,level,task) 仅用于构建引擎中

                    vii.              任务的生命周期:

1.         解析时 : ant xml 读取任务开始,任务名、任务属性、嵌套元素被包装到一个 xml 元素对象中,并存储到 ant 的内存中 dom

a)         对任务类进行实例化:利用 xml 元素的名字和自省对任务的相应类进行实例化。

b)         创建对 project 和父目标对象的引用

c)         增加 id 引用

d)         调用 init 方法

e)         嵌套元素得到解析,并利用 addXXX()— 一个已实例化对象的引用 ,adddConfiguredXXX()--- 在传递引用钱完全的处理元素和 createXXX()--- 实例化一个元素对象本身 --- 等方法得到处理

f)           

2.         运行时:从解析时阶段完成时开始(保证任务的原子化

a)         任务的所有属性得到设置

b)         处理来自 xml 文件的 CDATA 文本

c)         所有嵌套元素的属性得到设置

d)         Execute 得到调用

 

                   viii.              Jar 任务类的分析

1.         各个主题:属于深层次结构的一部分,展示了通过继承实现的重用(派生自 ZIP ,而 ZIP 进一步派生自 MatchingTask jar 任务对象没有自己的 execute 方法实现,依赖于 zip 类中的相应方法实现。 Jar 任务还用了大量的属性和嵌套元素,从而为我们提供了如何处理所有这些功能的好例子。

2.         实现步骤:

a)         利用已有的实现

b)         实现属性设置方法

c)         实现嵌套元素的处理

                                                                   i.              addXXX(): 在增加一个嵌套元素时,会通知 ant 在调用 addXXX() 方法之前先实例化该类。如果嵌套元素的对应对象没有默认构造函数, ant 就无法作此工作,并抛出一个错误。如果有默认构造函数, ant 则将实例化的嵌套对象对象传递至你的任务对象,在此可以根据需要对该对象进行处理(例如将它保存在一个集合中等待)建议的做法是,如果仅仅是要避免嵌套元素属性为设置而可能带来的问题,那么就应该在任务的执行阶段再真正使用嵌套元素对象(即,调用方法或由它获取值)

                                                                 ii.              addConfiguredXXX(): 要求 ant 不仅进行实例化,还会在将嵌套元素对象传递给任务对象之前对它进行配置。换句话说: ant 可以保证对于给定的嵌套元素,其属性和嵌套元素在到达对象之前均得到设置和处理。由于该技术打破了任务生命期,所以有一定风险。

                                                                iii.              createXXX(): 如果 ant 调用一个 createXXX() 方法,那么对于将嵌套元素解析为任务对象就提供了完全的控制, ant 没有向任务传递对象而是需要任务返回嵌套元素的对象。这有一些好的副作用,其中最显著的就是消除了嵌套元素对象必须有默认构造函数的要求。其缺点就是你要理解元素对象在初始化时是如何工作的。

d)         实现 execute 方法

e)         验证:大部分情况下,这种验证都发生在设置方法中,不过由于 ant 调用设置方法并没有固定顺序,两个或多个属性之间的关系验证应该在 execute 中完成,所有运行时验证也是这样

f)          完成实际工作

g)         错误处理

h)         编译任务

i)           部署和声明任务: ant.jar 中的 defaults.properties ,是一个名值对列表。可以对此特性表进行扩展从而声明我们的定制任务。

                      ix.              清单文件:利用它,你可以增加关于压缩文件中包括哪些内容的描述。通常,这些描述为版本号或库名。能够在一个构建文件中指定清单项,这可以减少在源代码中管理清单文件的需要。在编写原始的 jar 任务时,开发人员提供了一个 manifest 对象,由它管理清单信息,而且可以利用信息写到磁盘上从而包含在 jar 中。另外此 manifest 对象了解并且可以出来嵌套的 <attribute> 元素。

二、              Ant 自定义监听器

a)         Ant 引擎将重要信息放入一个 BuildEvent 对象中,并将其传递给它的监听者,从而使其监听者了解到有关构建的更多信息。有时候,由于实现和设计上存在的约束, ant 可能会限制这些对象中的信息量。

b)         常用函数

                         i.              getProject

                       ii.              getTarget

                      iii.              getTask

                      iv.              getException

                       v.              getPriority

                      vi.              getMessage

 

c)         事件类型及其接口

                         i.              buildStarted(BuildEvent event)

                       ii.              buildFinished(BuildEvent event)

                      iii.              targetStarted(BuildEvent event)

                      iv.              targetFinished(BuildEvent event)

                       v.              taskStarted(BuildEvent event)

                      vi.              taskFinished(BuildEvent event)

                    vii.              messageLogged(BuildEvent event)

       

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值