`
7090
  • 浏览: 279613 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)Ant的“宏”- macrodef

    博客分类:
  • Ant
阅读更多
案例
< target name ="ejbca:install" depends ="check:bootstrapdone, ejbca:init" description ="Install" >
< echo message ="Initializing CA with ${ca.name} '${ca.dn}' ${ca.tokentype} ${ca.tokenpassword} ${ca.keyspec} ${ca.keytype} ${ca.validity} ${ca.policy} ${ca.signaturealgorithm} ${ca.tokenproperties}..." />
< ejbca:cli name ="ca" arg ='init "${ca.name}" "${ca.dn}" ${ca.tokentype} ${ca.tokenpassword} ${ca.keyspec} ${ca.keytype} ${ca.validity} ${ca.policy} ${ca.signaturealgorithm} ${ca.tokenproperties}' />
</ target >
 

< macrodef name ="cli" uri ="ejbca" >
         < attribute name ="name" />
         < attribute name ="arg" />
         < sequential >
         < echo message ="@{name} @{arg}" />
         < java classname ="org.ejbca.ui.cli.@{name}" classpathref ="classpath" fork ="true" >
         < arg line ="@{arg}" />
        </ java >
        </ sequential >
</ macrodef >
 
 
相关资料
 
假设 web 应用程序拥有依赖于目标系统的不同的 web 部署描述符,并为开发环境使用了一个不同的 JSP 集合以及一个不同的资料库集合。配置信息将放在属性中,创建 web 存档的任务看起来将类似于   
< target name ="war" depends ="jar" >
        < war destfile ="${war.name}"
                 webxml ="${web.xml}" >
            < lib refid ="support-libraries" />
            < lib file ="${jar.name}" />
            < fileset dir ="${jsps}" />
        </ war >
</ target >
其中 support-libraries 是引用一个在其它位置定义的 <fileset> ,该引用指向您的应用程序所需的附加资料库的一个公共集合。
如果您只想一次创建一个 web 存档,那么您只需要正确地设置属性。比如说,您可以从一个您的目标专有的属性文件中加载它们。
 
利用 Ant 1.5 创建存档
现在,假定您想为测试系统和生产系统同时创建存档,以确保您真正为两个系统打包了相同的应用程序。利用 Ant 1.5,您可能使用 <antcall> 来调用拥有不同属性设置的 "war" 目标,类似:  
< target name ="production-wars" >
        < antcall target ="war" >
            < param name ="war.name" value ="${staging.war.name}" />
            < param name ="web.xml" value ="${staging.web.xml}" />
        </ antcall >
        < antcall target ="war" >
            < param name ="war.name" value ="${production.war.name}" />
            < param name ="web.xml" value ="${production.web.xml}" />
        </ antcall >
</ target >
当然,这假定两个目标系统都将使用相同的 jar 和 JSP。
但这种方法有一个主要缺点 — 就是速度慢。 <antcall> 重新分析编译文件,并为每一次调用重新运行调用的目标所依赖的所有目标。在上面的例子中,"jar" 目标将被运行两次。我们希望这对第二次调用没有影响,因为 "war" 目标依赖于它。
 
利用 Ant 1.6 创建存档
使用 Ant 1.6,您可以忘掉用 <antcall> 来实现宏的方法,相反您可以通过参数化现有的任务来创建一个新的任务。因而上面的例子将变为:   
< macrodef name ="makewar" >
        < attribute name ="webxml" />
        < attribute name ="destfile" />
        < sequential >
            < war destfile ="@{destfile}"
                     webxml ="@{webxml}" >
                < lib refid ="support-libraries" />
                < lib file ="${jar.name}" />
                < fileset dir ="${jsps}" />
            </ war >
        </ sequential >
</ macrodef >
这定义了一个名称为 makewar 的任务,该任务可以和任何其它的任务一样使用。该任务有两个必需的属性,webxml 和 destfile。要使属性可选,我们必需在任务定义中提供一个默认值。这个示例假定 ${jar.name} ${jsps} 在编译期间为常量,从而它们仍然作为属性指定。注意,属性在使用任务时展开而不是在定义宏的地方展开。
 
所用任务的特性几乎完全和属性一样,它们通过 @{} 而不是 ${} 展开 。与属性不同,它们是可变的,也就是说,它们的值可以(并将)随着每一次调用而改变。它们也只在您的宏定义程序块内部可用。这意味着如果您的宏定义还包含了另一个定义了宏的任务,那么您内部的宏将看不到包含的宏的属性。
 
于是新的 production-wars 目标将类似于:  
< target name ="production-wars" >
        < makewar destfile ="${staging.war.name}"
                         webxml ="${staging.web.xml}" />
        < makewar destfile ="${production.war.name}"
                         webxml ="${production.web.xml}" />
</ target >
这个新的代码段不仅执行得快一些,而且也更易读,因为属性名称提供了更多的信息。
宏任务还可以定义嵌套的元素。<makewar> 定义中的 <war> 任务的嵌套 <fileset> 可以是这种嵌套元素的一种。可能开发目标需要一些额外的文件或想从不同的位置中挑选 JSP 或资源。以下代码段将一个可选的嵌套 <morefiles> 元素添加到了 <makewar> 任务中
< macrodef name ="makewar" >
        < attribute name ="webxml" />
        < attribute name ="destfile" />
        < element name ="morefiles" optional ="true" />
        < sequential >
            < war destfile ="@{destfile}"
                     webxml ="@{webxml}" >
                < lib refid ="support-libraries" />
                < lib file ="${jar.name}" />
                < fileset dir ="${jsps}" />
                < morefiles />
            </ war >
        </ sequential >
    </ macrodef >
调用将类似于:
< makewar destfile ="${development.war.name}"
                     webxml ="${development.web.xml}" >
        < morefiles >
            < fileset dir ="${development.resources}" />
            < lib refid ="development-support-libraries" />
        </ morefiles >
    </ makewar >
这就像 <morefiles> 的嵌套元素直接在 <war> 任务内部使用的效果一样。
即使迄今为止的示例仅显示了包装单个任务的 <macrodef>,但它不限于此。
下面的宏不仅将创建 web 存档,还将确保包含最终存档的目录在试图写入之前存在。在一个实际的编译文件中,您可能在调用任务之前使用一个设置目标来完成这个操作。
< macrodef name ="makewar" >
        < attribute name ="webxml" />
        < attribute name ="destfile" />
        < element name ="morefiles" optional ="true" />
        < sequential >
            < dirname property ="@{destfile}.parent"
                             file ="@{destfile}" />
            < mkdir dir ="${@{destfile}.parent}" />
            < war destfile ="@{destfile}"
                     webxml ="@{webxml}" >
                < lib refid ="support-libraries" />
                < lib file ="${jar.name}" />
                < fileset dir ="${jsps}" />
                < morefiles />
            </ war >
        </ sequential >
    </ macrodef >
这里注意两件事情:
首先,特性在属性展开之前展开,因此结构 ${@{destfile}.parent} 将展开一个名称包含了 destfile 特性的值和 ".parent" 后缀的属性。这意味着您可以将特性展开嵌入到属性展开中,而不是将属性展开嵌入特性展开中。
其次,这个宏定义了属性,该属性的名称基于一个特性的值,因为 Ant 中的属性是全局的并且不可改变。第一次尝试使用
< dirname property ="parent" file ="@{destfile}" />
相反将不会在 "production-wars" 目标中的第二次 <makewar> 调用产生期望的结果。第一次调用将定义一个新的名称为 parent 的属性,该属性指向父目录 ${staging.war.name}。第二次调用将查看这个属性但不会修改它的值。
 
 
提示:如果您查看您的编译文件时发现使用了 < antcall > 代替宏,那么强烈建议您考虑使用 macrodef 将其转换成真正的宏。性能影响可能非常显著,并且还可能产生更易读和更易于维护的编译文件。
 

本文出处http://danni505.blog.51cto.com/15547/174508

 

 

分享到:
评论

相关推荐

    apache-ant-1.9.14.zip

    - **宏定义(Macrodef)**:Ant允许用户定义自己的宏,以复用复杂的任务逻辑。 - **自定义任务(Custom Tasks)**:如果内置任务不能满足需求,开发者可以编写Java类来创建自定义任务。 6. **Ant与其他工具的集成...

    apache官方ant-1.10.11版本压缩包

    6. **宏定义(Macrodef)**:宏定义是可重用的任务集合,它们可以封装复杂的构建逻辑,提高代码的可维护性。 7. **插件(Plugins)**:Ant的可扩展性主要通过插件实现,这些插件可以添加新的任务或功能,如Maven...

    apache-ant-1.8.2

    Ant还支持条件语句(If/Unless)、循环(For/ForEach)、包含其他构建文件(Import)以及宏定义(Macrodef),这些使得Ant的构建脚本可以实现复杂的逻辑。 在VanetMobiSim的构建过程中,Ant可能会执行以下步骤: 1....

    apache-ant-1.7.0

    6. **宏定义(Macrodef)**:宏定义允许用户创建自定义的任务,这些自定义任务可以有参数,类似于函数,提高了代码的重用性。 7. **Ant的版本控制集成**:虽然1.7.0相对较旧,但它已经支持与版本控制系统(如CVS和...

    关于ANT脚本中使用macrodef

    在Ant构建工具中,`macrodef`是一个非常重要的特性,它允许我们定义可重用的任务或片段,类似于编程语言中的函数或宏。这使得Ant脚本更加模块化,提高了代码的可读性和维护性。本资源是作者在处理将文件复制到远程...

    apache-ant-1-8-3

    宏定义(MacroDef)允许用户创建可重用的任务模板,减少代码重复。在Ant 1.8.3中,你可以定义自己的宏并多次调用,提高构建脚本的复用性。 **九、插件(Contrib Tasks)** 除了内置任务外,Ant 1.8.3还支持社区贡献的...

    apache-ant安装包

    4. **宏定义**:宏定义(macrodef)允许创建可重用的任务模板,提高代码复用性。 5. **属性系统**:Ant拥有一个内置的属性系统,允许设置和引用变量,简化配置。 6. **插件机制**:Ant可以通过扩展点添加自定义...

    apache-ant-1.7.0.rar

    - **宏定义(MacroDef)**: 宏定义允许用户创建可重用的任务模板,减少构建文件的重复代码。 - **条件语句**: Ant 1.7.0引入了条件语句,可以根据特定条件决定是否执行某部分构建逻辑。 - **Java 5支持**: 这个...

    apache-ant-1.9.4-manual.zip

    7. **宏任务(Macrodef)**:宏任务允许创建可重用的任务模板,类似于函数或者类,可以在构建文件的不同地方重复使用。 8. **插件(Plugins)**:虽然Ant内建了一些任务,但它的强大之处在于可以通过插件扩展功能。...

    apache-ant-1.6.2

    6. **宏定义(Macros)**:宏定义类似于函数,可以封装一系列任务,提高代码复用性。通过`&lt;macrodef&gt;`元素,你可以创建自定义的任务模板。 7. **条件(Conditions)**:Ant提供了条件语句,如`&lt;if&gt;`和`&lt;unless&gt;`,使得...

    apache-ant-1.9.9

    7. **宏定义(Macrodef)**:宏定义允许开发者创建可重用的任务模板,这有助于代码复用和构建脚本的模块化。 8. **目标(Targets)**:Ant中的目标是构建流程的一系列任务集合,它们之间可以通过依赖关系定义执行...

    ant-1.6.2直接解压使用

    - **宏定义(Macrodef)**:用于创建可重用的任务模板,提高代码复用性。 - **脚本任务**:可以集成JavaScript或其它脚本语言,执行更复杂的逻辑。 - **依赖关系**:任务之间可以设置依赖,确保执行顺序。 - **...

    ant-1.7下载附学习资料

    5. **宏定义**:宏定义(macrodef)是Ant的一种自定义任务机制,它允许开发者创建自己的任务模板,提高代码复用性。 6. **文件集**:Ant中的文件集(fileset)和文件列表(filelist)可以用来指定一组文件,它们...

    ANT-build.xml命令详解

    - **宏定义(Macrodef)**:自定义任务模板,提高代码复用性。 - **引入(Import)**:将其他`build.xml`文件引入当前文件,便于组织大型项目。 Ant的强大之处在于其灵活性和扩展性。通过熟练掌握`build.xml`文件的...

    apache-ant

    6. **宏(Macros)** 和 **宏定义(Macrodef)**:用于创建可重用的任务集合,提高构建脚本的可读性和复用性。 7. **依赖(Dependencies)**:通过`depends`属性,一个目标可以依赖于另一个目标,确保先执行依赖的目标。 ...

    Ant权威指南电子书-中文版

    此外,《Ant权威指南》还会深入讨论Ant的宏定义(macrodef)和条件语句,使构建脚本具备更高的复用性和灵活性。宏定义可以封装常用的任务组合,而条件语句则允许根据不同的环境或参数执行不同的构建步骤。 对于大型...

    Ant 学习资料大全--详细说明Ant

    6. **宏定义(Macrodef)**:允许创建可重用的任务模板。 Ant的灵活性还体现在可以使用自定义任务(custom tasks),这些任务可以扩展Ant的功能,满足项目的特殊需求。此外,Ant还可以与其他构建工具(如Maven、...

    ant1.7使用手册指南

    8. **宏定义(Macrodef)**:掌握如何创建可重用的宏定义,以简化构建脚本,提高代码复用性。 9. **Ant 1.7的新特性**:了解1.7版本中可能增加的新功能,例如新的任务、属性处理的改进、性能优化等。 10. **Ant与...

Global site tag (gtag.js) - Google Analytics