`
lelong
  • 浏览: 554830 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[转帖]ant中文教程(二)

阅读更多

3 编写build.xml

Ant的buildfile是用XML写的。每个buildfile含有一个project。

buildfile中每个task元素可以有一个id属性,可以用这个id值引用指定的任务。这个值必须是唯一的。(详情请参考下面的Task小节)

3.1 Projects

project有下面的属性:
Attribute Description Required
name 项目名称. No
default 当没有指定target时使用的缺省target Yes
basedir 用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果属性和basedir property都没有设定,就使用buildfile文件的父目录。 No
项目的描述以一个顶级的<description></description>元素的形式出现(参看description小节)。

一个项目可以定义一个或多个target。一个target是一系列你想要执行的。执行Ant时,你可以选择执行那个target。当没有给定target时,使用project的default属性所确定的target。

3.2 Targets

一个target可以依赖于其他的target。例如,你可能会有一个target用于编译程序,一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过,所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。

然而,应当注意到,Ant的depends属性只指定了target应该被执行的顺序-如果被依赖的target无法运行,这种depends对于指定了依赖关系的target就没有影响。

Ant会依照depends属性中target出现的顺序(从左到右)依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。

xml 代码
  1. <target name="A"/>  
  2. <target name="B" depends="A"/>  
  3. <target name="C" depends="B"/>  
  4. <target name="D" depends="C,B,A"/>  

假定我们要执行target D。从它的依赖属性来看,你可能认为先执行C,然后B,最后A被执行。错了,C依赖于B,B依赖于A,所以先执行A,然后B,然后C,最后D被执行。

一个target只能被执行一次,即时有多个target依赖于它(看上面的例子)。

如果(或如果不)某些属性被设定,才执行某个target。这样,允许根据系统的状态(java version, OS, 命令行属性定义等等)来更好地控制build的过程。要想让一个target这样做,你就应该在target元素中,加入if(或unless)属性,带上target因该有所判断的属性。例如:

xml 代码
  1. <target name="build-module-A" if="module-A-present"/>  
  2. <target name="build-own-fake-module-A" unless="module-A-present"/>  

如果没有if或unless属性,target总会被执行。

可选的description属性可用来提供关于target的一行描述,这些描述可由-projecthelp命令行选项输出。

将你的tstamp task在一个所谓的初始化target是很好的做法,其他的target依赖这个初始化target。要确保初始化target是出现在其他target依赖表中的第一个target。在本手册中大多数的初始化target的名字是"init"。

target有下面的属性:
Attribute Description Required
name target的名字 Yes
depends 用逗号分隔的target的名字列表,也就是依赖表。 No
if 执行target所需要设定的属性名。 No
unless 执行target需要清除设定的属性名。 No
description 关于target功能的简短描述。 No

3.3 Tasks

一个task是一段可执行的代码。

一个task可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对property的引用。这些引用会在task执行前被解析。

下面是Task的一般构造形式:

<name attribute1="value1" attribute2="value2" ... />
这里name是task的名字,attributeN是属性名,valueN是属性值。

有一套内置的(built-in)task,以及一些可选task,但你也可以编写自己的task。

所有的task都有一个task名字属性。Ant用属性值来产生日志信息。

可以给task赋一个id属性:
<taskname id="taskID" ... />
这里taskname是task的名字,而taskID是这个task的唯一标识符。通过这个标识符,你可以在脚本中引用相应的task。例如,在脚本中你可以这样:
<script ... >
task1.setFoo("bar");
</script>
设定某个task实例的foo属性。在另一个task中(用java编写),你可以利用下面的语句存取相应的实例。
project.getReference("task1").
注意1:如果task1还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。

注意2:未来的Ant版本可能不会兼容这里所提的属性,因为很有可能根本没有task实例,只有proxies。

3.4 Properties

一个project可以有很多的properties。可以在buildfile中用property task来设定,或在Ant之外设定。一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在"${"和"}"之间并放在属性值的位置来实现的。例如如果有一个property builddir的值是"build",这个property就可用于属性值:${builddir}/classes。这个值就可被解析为build/classes。

内置属性

如果你使用了<property> task 定义了所有的系统属性,Ant允许你使用这些属性。例如,${os.name}对应操作系统的名字。

要想得到系统属性的列表可参考the Javadoc of System.getProperties。

除了Java的系统属性,Ant还定义了一些自己的内置属性:
basedir project基目录的绝对路径 (与<project>的basedir属性一样)。
ant.file buildfile的绝对路径。
ant.version Ant的版本。
ant.project.name 当前执行的project的名字;由<project>的name属性设定.
ant.java.version Ant检测到的JVM的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".

例子

xml 代码
  1. <project name="MyProject" default="dist" basedir=".">    
  2.   
  3. <!-- set global properties for this build -->  
  4. <property name="src" value="."/>  
  5. <property name="build" value="build"/>  
  6. <property name="dist" value="dist"/>    
  7.   
  8. <target name="init">  
  9. <!-- Create the time stamp -->  
  10. <tstamp/>  
  11. <!-- Create the build directory structure used by compile -->  
  12. <mkdir dir="${build}"/>  
  13. </target>  
  14.   
  15. <target name="compile" depends="init">  
  16. <!-- Compile the java code from ${src} into ${build} -->  
  17. <javac srcdir="${src}" destdir="${build}"/>  
  18. </target>  
  19.   
  20. <target name="dist" depends="compile">  
  21. <!-- Create the distribution directory -->  
  22. <mkdir dir="${dist}/lib"/>  
  23. <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->  
  24. <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>  
  25. </target>  
  26.   
  27. <target name="clean">  
  28. <!-- Delete the ${build} and ${dist} directory trees -->  
  29. <delete dir="${build}"/>  
  30. <delete dir="${dist}"/>  
  31. </target>  
  32.   
  33. </project>  

3.5 Path-like Structures
你可以用":"和";"作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。

当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是

xml 代码
  1. <classpath>  
  2. <pathelement path="${classpath}"/>  
  3. <pathelement location="lib/helper.jar"/>  
  4. </classpath>  


location属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径--其他情况下,应该用多个location属性。

为简洁起见,classpath标签支持自己的path和location属性。所以:
<classpath>
<pathelement path="${classpath}"/>
</classpath>
可以被简写作:
<classpath path="${classpath}"/>
也可通过<fileset>元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。

xml 代码
  1. <classpath>  
  2. <pathelement path="${classpath}"/>  
  3. <fileset dir="lib">  
  4. <include name="**/*.jar"/>  
  5. </fileset>  
  6. <pathelement location="classes"/>  
  7. </classpath>  


上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着是classes目录。

如果你想在多个task中使用相同的path-like structure,你可以用<path>元素定义他们(与target同级),然后通过id属性引用--参考Referencs例子。
path-like structure可能包括对另一个path-like structurede的引用(通过嵌套<path>元素):

xml 代码
  1. <path id="base.path">  
  2. <pathelement path="${classpath}"/>  
  3. <fileset dir="lib">  
  4. <include name="**/*.jar"/>  
  5. </fileset>  
  6. <pathelement location="classes"/>  
  7. </path>  
  8. <path id="tests.path">  
  9. <path refid="base.path"/>  
  10. <pathelement location="testclasses"/>  
  11. </path>  


前面所提的关于<classpath>的简洁写法对于<path>也是有效的,如:

xml 代码
  1. <path id="tests.path">  
  2. <path refid="base.path"/>  
  3. <pathelement location="testclasses"/>  
  4. </path>  


可写成:
<path id="base.path" path="${classpath}"/>
命令行变量

有些task可接受参数,并将其传递给另一个进程。为了能在变量中包含空格字符,可使用嵌套的arg元素。
Attribute Description Required
value 一个命令行变量;可包含空格字符。 只能用一个
line 空格分隔的命令行变量列表。
file 作为命令行变量的文件名;会被文件的绝对名替代。
path 一个作为单个命令行变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。

例子
<arg value="-l -a"/>
是一个含有空格的单个的命令行变量。
<arg line="-l -a"/>
是两个空格分隔的命令行变量。
<arg path="/dir;/dir2:\dir3"/>
是一个命令行变量,其值在DOS系统上为\dir;\dir2;\dir3;在Unix系统上为/dir:/dir2:/dir3 。

References

buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块,这一属性就很有用--如多次使用<classpath>结构。

下面的例子:

xml 代码
  1. <project ... >  
  2. <target ... >    
  3. <rmic ...>    
  4. <classpath>    
  5. <pathelement location="lib/"/>    
  6. <pathelement path="${java.class.path}/"/>    
  7. <pathelement path="${additional.path}"/>    
  8. </classpath>    
  9. </rmic>    
  10. </target>  
  11. <target ... >  
  12. <javac ...>  
  13. <classpath>  
  14. <pathelement location="lib/"/>  
  15. <pathelement path="${java.class.path}/"/>  
  16. <pathelement path="${additional.path}"/>  
  17. </classpath>  
  18. </javac>  
  19. </target>  
  20. </project>  


可以写成如下形式:

xml 代码
  1. <project ... >    
  2. <path id="project.class.path">    
  3. <pathelement location="lib/"/>  
  4. <pathelement path="${java.class.path}/"/>    
  5. <pathelement path="${additional.path}"/>    
  6. </path>  
  7. <target ... >  
  8. <rmic ...>  
  9. <classpath refid="project.class.path"/>  
  10. </rmic>  
  11. </target>  
  12. <target ... >    
  13. <javac ...>  
  14. <classpath refid="project.class.path"/>  
  15. </javac>  
  16. </target>  
  17. </project>  


所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。



分享到:
评论
1 楼 cissyqz 2012-03-06  
我现在有一个target,我想调用多遍,可以吗
比如 ant -f build.xml targetName
我这个targetName怎样才可以运行多次

相关推荐

    ANT全套资料20100322

    最后,"[转帖]ant中文教程(二).ziw"可能是对ANT的中文解释,适合初学者理解和掌握ANT的基本概念和用法。 综上所述,这套ANT资料集全面覆盖了从入门到实践的多个层次,对于想要深入理解和掌握ANT的开发者来说,是...

    论坛转帖工具.rar

    标题中的“论坛转帖工具.rar”表明这是一个用于在论坛之间转移帖子的软件工具,通常用于帮助用户方便地将一个论坛的帖子内容复制到另一个论坛,可能是为了分享信息、讨论或保存重要的帖子。这类工具可能包括自动抓取...

    转帖】CE最新过NP教程.docx

    【CE最新过NP教程】 本教程主要针对网络游戏的反作弊机制,特别是针对那些检测Cheat Engine(CE)的登录器,如纸鹤登录器。CE是一款强大的内存编辑工具,允许玩家在游戏中修改内存数据以获得优势,但同时也可能被...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    贴吧转帖工具

    对于不太熟悉这些操作的用户,可能需要查阅相关教程或寻求帮助。在使用过程中,如果遇到问题,可以查看软件自带的帮助文档,或者联系开发者获取技术支持。 总的来说,【贴吧转帖工具】通过自动化操作,为百度贴吧...

    编辑人员转帖去水印工具

    本篇文章将详细探讨“编辑人员转帖去水印工具”,并介绍如何使用名为Teorex Inpaint的1.0.0.2版本的软件来实现这一目标。 首先,我们要理解什么是水印。水印通常是指在图像或视频中添加的半透明标记,它可以是文字...

    交互原型设计软件 Axure RP Pro 5 中文教程

    交互原型设计软件 Axure RP Pro 5 中文教程 一直在用visio做交互原型和画pageflow,朋友推荐用Axure RP 4,试用了一下果然不错,特别在网上找到教程转帖给需要朋友。(作者:Hawking原创) 文章转载自“折折熊de交互...

    discuz X2转帖工具、采集工具

    二、批量转帖功能 1. 内容抓取:工具具备采集功能,可以从其他网站或者论坛抓取感兴趣的内容,快速转贴到自己的Discuz! X2论坛上,增加论坛的信息来源和内容丰富度。 2. 自动格式转换:采集到的内容会自动适应Discuz...

    IDA实战教程

    IDA入门教程.doc提供了基础的IDA操作指南,包括如何打开二进制文件、浏览反汇编代码、识别函数和数据结构等。这部分内容将帮助新手熟悉IDA的界面和基本操作,是学习IDA的第一步。 IDA实例教程.rar包含一系列具体...

    [转帖]世界编程大赛第一名写的程序

    标题和描述中的“世界编程大赛第一名写的程序”这一知识点,实际上指向了计算机科学与编程竞赛领域的一个重要概念:即在高水平的编程比赛中,优胜者所编写的代码往往蕴含着高级算法、数据结构以及编程技巧。...

    转帖工具ConvertX fordiscuz7.1/7.2 修改增强版.rar

    1.修改自Convert X转帖工具 2.新增批量替换关键词(原来是单个词语替换,可以利用这个功能删除一些网站的防转帖代码) 3.批量随机新增文字(新增内容可自定义,从而实现伪原创) 4.cookie记录替换和新增关键词(避免每次...

    转帖工具插件 for PHPwind 7.5 正式版.rar

    "转帖工具插件 for PHPwind 7.5 正式版" 是专门为 PHPwind 7.5 版本设计的一个功能插件,旨在提供便捷的帖子转移功能,帮助管理员或者用户将内容从一个地方轻松移动到另一个地方,而无需直接编辑论坛的原始文件。...

    转帖图片提取工具 v1.0.zip

    转帖图片提取工具可以对论坛图片附件信息进行清除,只保留图片代码,操作很简单,推荐有需要转帖图片工具的朋友下载 转帖图片提取工具使用方法: 将IP138上处理过的东西复制到上方的编辑框内,点击只要图片,下面...

    使用InstallShield制作ASP安装程序(6) asp教程

    【转帖】用InstallShield进行ASP软件的打包和自动安装 - 项目脚本 - 中国软件打包技术论坛 installshield 1220082009中文教程wise打包install安装程序制作installshield - Powered by Discuz!.htm InstallShield 12 ...

    一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0.rar

    《一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0》 本文将深入探讨“一键转帖功能插件”在帝国CMS 6.0系统中的应用与实现,该插件适用于GBK及UTF-8编码环境,旨在提升网站内容的分享与传播效率。我们将从安装...

    Html2UBBMaxcj_Softii论坛专用转帖工具

    HTML2UBBMaxcj 是一款专为Softii论坛设计的转帖工具,它主要用于将HTML格式的帖子内容转换成UBB代码,以便在论坛中更好地显示和分享。UBB(Universal BBCode)是一种轻量级的标记语言,常用于网络论坛,与HTML类似,...

    一键转帖功能插件 for 帝国CMS v1.0.rar

    "一键转帖功能插件 for 帝国CMS v1.0.rar" 是一个专为帝国CMS设计的扩展工具,其主要目标是简化用户在网站上分享内容的过程,提高用户体验。这个插件允许用户轻松地将网站上的文章或信息复制并转发到其他平台,如...

    超级无敌转帖手

    看到论坛里帖子由精美的图片想转过来,或者批量提取地址时很好用

    高三政治教学总结(转帖)教学工作总结.doc

    高三政治教学总结(转帖)教学工作总结.doc

Global site tag (gtag.js) - Google Analytics