本文为翻译官方文档而来,不当之处请指正。html
Ant的构建文件写在xml文件当中,每个构建文件包含一个project和至少一个(默认的)target。Targets包含task elements。每个task element都有一个id属性,能够提供给此值的引用。固然id属性是惟一的。java
一个project有三个属性web
属性 | 描述 | 必须的 |
---|---|---|
name | 项目名称 | 否 |
default | 若是没有任何target的话,须要这个默认的target | 否,自从蚂蚁1.6.0,每一个项目包括一个隐含的目标,包含全部的顶级任务和/或类型。这一目标将永远做为项目的初始化部分执行,即便当蚂蚁运行时有projecthelp选项。 |
basedir | 用于指定基路径的位置。该属性没有指定时,使用 Ant 的构件文件的父目录做为基准目录 | 否 |
<project name="XXX" default="xxxx" basedir="."> … </project>
属性 | 描述 | 必须的 |
---|---|---|
name | Target名 | 是 |
depends | 依赖 | 否 |
if | 某property必须设置了才能够运行这个target或者property扩展属性评估是true | 否 |
unless | 某property必须没有设置才能够运行这个target或者property扩展属性评估是false | 否 |
description | Target功能的描述 | 否 |
extensionOf | 当这个target添加到extension-point的依赖列表中,1.8.0开始 | 否 |
onMissingExtensionPoint | 若是这个target视图扩展丢失的extension-point该怎么办 | 否 |
能够是任何xml文件中合法的string,例如空字符串””,逗号”,”和空格” ”,尽可能避免用这些字符串命名你的target,ant未来的版本可能不会支持由于不一样的IDE中对这些字串的解释并不相同。apache
以连字符开始是不合法的,例如”-restart”,由于他们不能被命令行直接命令。由于ant会默认连字符开始的是它本身的而不是一个target。api
一个target能够依赖其余的targets.例如,你有一个编译的target,还有一个建立可分配的target,你只能在你已经编译的时候才能构建一个可分配的,由于这个可分配的target依赖编译target。Ant能够解决这些依赖关系。缓存
须要注意的是,ant依赖属性只指定了执行targets的顺序,若是依赖的目标不须要执行,则不影响指定依赖关系的目标是否执行,即虽然我只能在你后面执行,若是你不执行,那么我就直接执行。oracle
<target name="clean"> … </target> <target name="init" depends="clean"> … </target>
若是由于某些缘由clean这个target不会执行,那么init这个target依旧执行app
<target name="A"/> <target name="B" depends="A"/> <target name="C" depends="B"/> <target name="D" depends="C,B,A"/> D的时候,执行的顺序是A --> B --> C --> D 为何呢?由于D依赖C,C又依赖B,B又依赖A,因此顺序是这样的。 <target name="A"/> <target name="B"/> <target name="C"/> <target name="D" depends="C,B,A"/> 这样写的话,顺序才是C,B,A,D
<target name="build-module-A" if="module-A-present"/> <target name="build-own-fake-module-A" unless="module-A-present"/>
第一句话意思是若是module-A-present这个属性被设置了,我就执行build-module-A这个target
第二句话的意思是若是module-A-present这个属性没有被设置,我就执行build-own-fake-module-A这个targetless
须要注意的是只要设置了这个属性就被控制,而没有规定其中设置什么值,例如jvm
<property name=” module-A-present”/>
即便没有设置什么值,我也会运行第一个target,也就是build-module-A
若是想要根据值来控制,能够运用if/unless attributes 属性扩展
1.7.1前不支持,即便这个property中没有设置value或是空字串,1.8.0ant支持属性扩展。即true,on,yes(相反值:false,off,no)可让他运行(不运行)
<target name="build-module-A" if="{module-A-present}"/>
If/unless中只能够有一个property
If/unless只控制他们本身,其实他们的depends在他们以前都已经运行完毕了。
和target相似的是他们拥有一个name和依赖列表,能够从命令行直接执行,他们在构建过程当中表明着一种状态。
和target不一样的是他们不包含任何tasks,他们主要的目的就是收集那些在他们的依赖列表中为所需状态作出贡献的targets 。
Targets能够经过extensionOf属性把他们本身加到extension-points的依赖列表中,若是多个target写在一块儿,相对位置没有意义。
扩展点的主要用途是充当要导入
(Import详见http://ant.apache.org/manual/Tasks/import.html)的构建文件的扩展点。在导入的文件中,扩展点定义必须到达的状态,而且来自其余构建文件的目标能够加入所述扩展点的依赖列表,以便对该状态做出贡献。
例如你要导入的构建文件可能须要编码:
<target name="create-directory-layout"> ... </target> <extension-point name="ready-to-compile" depends="create-directory-layout"/> <target name="compile" depends="ready-to-compile"> ... </target> create-directory-layout --> 'empty slot' --> compile
须要在编译以前生成一些源代码,而后在主构建文件中使用相似于
<target name="generate-sources" extensionOf="ready-to-compile"> ... </target> create-directory-layout --> generate-sources --> compile
这样能够确保generate-sources这个target在compile target以前执行。
不要使用依赖列表,若是使用了依赖列表,generate-sources这个target只能经过它本身的依赖属性显示地依赖他们。
一个task是一段能够执行的代码。一个task能够有不少属性attribute,属性attribute的值能够包含property的引用。在task执行前,这些相关的property就能够被解决。Task的id属性用来标识这个task
若是“任务”尚未运行,那么它没有配置(即,没有属性已设置),若是是要配置后,任何你所作的实例能够被改写。
Ant有一系列内置的task(详见:http://ant.apache.org/manual/tasklist.html),想写本身的task也很容易(详见:http://ant.apache.org/manual/develop.html#writingowntask)
属性是自定义构建过程的一种重要方式,或者只为在构建文件中重复使用的字符串提供快捷方式。在最简单的表单中,属性在生成文件中定义(例如,属性任务),也能够在Ant以外设置。属性有名称和值;名称区分大小写。属性可用于任务属性值或支持它们的任务的嵌套文本中。这是经过将属性名放在属性值中的“”和“}”之间完成的。例如,若是有一个“builddir”属性的值“创建”,那么这多是用于属性是这样的:”和“}”之间完成的。例如,若是有一个“builddir”属性的值“创建”,那么这多是用于属性是这样的: { builddir } /classes。这在运行时做为buld/classes。
<property name="classes.dir" value="${webcontent.webinf.dir}/classes" description="原项目默认编译位置"/> <!--清理目标位置 --> <target name="clean"> <delete dir="${classes.dir}" /> </target>
从ant1.8.0开始属性扩展比简单的键值对变得更增强大
许多task均可以设置properties,最经常使用的就是property 这个task,此外,属性能够经过命令行参数或来自Ant外部的相似机制定义。
它只表示字符串数据的名-值对。除了字符串之外,任何其余数据类型均不能与特性相关联。
Ant命令行声明的特性老是比其余位置定义的特性有更高的优先级。在此以后,ant会根据其什么时候首次发现所声明的特性来肯定优先级。
<property name=”property.one” value=”${property.two}:one”> <property name=”property.two” value=”two”>
Property.one的值时什么呢,因为顺序,它的值是${property.two}:one而不是two:one
<target name=”target1”> <property name=”prop2” value=”two”> </target>
一旦构建了property prop2那么剩余的构建文件部分均可以使用prop2特性。
Ant提供对全部系统属性的访问,就像它们是使用< property >任务定义的同样。例如,${os.name }操做系统的名称。系统属性详见:https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#getProperties%28%29
basedir
做为的属性,它表示该项目的绝对路径
ant.file
构建文件的绝对路径
ant.version
Ant的版本
ant.project.name
目前运行的项目名称,的属性
ant.project.default-target
目前运行的项目默认target,的属性
ant.project.invoked-targets
当调用当前的项目时,命令行或IDE指定的以逗号分隔的targets列表
当第一个目标被执行时,此属性将被正确设置。
若是您在隐式目标中使用它(直接在“项目”标签下)列表将为空。
若是没有指定目标,将包含该项目的默认目标。
ant.java.version
JVM版本,目前它持有, “9”, “1.8”,”1.7”, “1.6”, “1.5”, “1.4”, “1.3” “1.2”.
ant.core.lib
ant.jar文件的绝对路径
还有另外一个属性,但这是由Launcher 的脚本,所以也许不在IDE:
ant.home
ant的home目录
下面的属性只设置若是蚂蚁开始经过发射类(这意味着它可能没有设置在IDE的):
ant.library.dir
下载的ant的jar包的目录,大多数状况下是ANT_HOME/lib
相似路径的结构
您能够指定路径和路径的类型引用使用“:”和“;”分隔符。Ant将将分隔符转换为当前操做系统的正确字符。
Property特性定义容许咱们避免在构建文件中将目录名硬编码。这些路径一般都是相对于<project>
元素所指定的基目录
<project name="XXX" default="xxxx" basedir="."> <property name=”src.dir” value=”src”> </project>
在须要指定路径值的地方,可使用嵌套元素。这是通常形式的:
<classpath> <pathelement path="${classpath}"/> <pathelement location="lib/helper.jar"/> </classpath>
classpath属性指定与项目的基目录(或绝对文件名)相关的单个文件或目录,而path属性接受冒号或分号分隔的location列表。path属性意在与预约义路径一块儿使用——在任何其余状况下,都应该首选具备location属性的多个元素
从1.8.2开始location属性能够以通配结束为了java6 介绍的classpaths通配符使用。Java6之前的jvm使用时,ant将不会解释这个通配符,即path不能正常工做(以通配符结束)。
做为一种快捷方式,<classpath>
标签支持path和本身的location属性,因此:
<classpath> <pathelement path="${classpath}"/> </classpath>
能够被缩写为:
<classpath path="${classpath}"/>
此外,一个或多个资源集合能够指定为嵌套元素(这些必须仅包含文件类型资源)。此外,应该指出的是,虽然资源集合的顺序处理遇到的,必定的资源的集合类型,如fileset,dirset和files方面的顺序是不肯定的。
<classpath> <pathelement path="${classpath}"/> <fileset dir="lib"> <include name="**/*.jar"/> </fileset> <pathelement location="classes"/> <dirset dir="${build.dir}"> <include name="apps/**/classes"/> <exclude name="apps/**/*Test*"/> </dirset> <filelist refid="third-party_jars"/> </classpath>
若是您想要为几个任务使用相同的路径结构,您能够在与目标相同的级别上使用一个元素来定义它们,并经过它们的id属性引用它们.
<project ... > <target ... > <rmic ...> <classpath> <pathelement location="lib/"/> <pathelement path="${java.class.path}/"/> <pathelement path="${additional.path}"/> </classpath> </rmic> </target> <target ... > <javac ...> <classpath> <pathelement location="lib/"/> <pathelement path="${java.class.path}/"/> <pathelement path="${additional.path}"/> </classpath> </javac> </target> </project>
能够这样简写:
<project ... > <path id="project.class.path"> <pathelement location="lib/"/> <pathelement path="${java.class.path}/"/> <pathelement path="${additional.path}"/> </path> <target ... > <rmic ...> <classpath refid="project.class.path"/> </rmic> </target> <target ... > <javac ...> <classpath refid="project.class.path"/> </javac> </target> </project>
默认状况下,一个相似路径的结构将在使用时从新评估全部嵌套的资源集合,这可能致使对文件系统进行没必要要的从新扫描。由于蚂蚁1.8.0路径有一个可选的缓存属性,若是设置为true,该路径实例只会扫描其嵌套资源集合一次,假设它不会改变在创建了(缓存默认仍然是错误的)。即便只在单个任务中使用路径,若是使用复杂的嵌套结构,则能够提升总体性能,将缓存设置为true。
一个相似路径的结构能够经过嵌套的<路径>元素包括对另外一个路径结构(路径自己就是资源集合)的引用:
<path id="base.path"> <pathelement path="${classpath}"/> <fileset dir="lib"> <include name="**/*.jar"/> </fileset> <pathelement location="classes"/> </path> <path id="tests.path" cache="true"> <path refid="base.path"/> <pathelement location="testclasses"/> </path>
前面提到的<路径>快捷方式也适用于<路径>。例如:
<path id="base.path"> <pathelement path="${classpath}"/> </path>
能够简写为:
<path id="base.path" path="${classpath}"/>
Ant1.6中path增长了一个快捷方式
${toString:pathreference}
<path id="lib.path.ref"> <fileset dir="lib" includes="*.jar"/> </path> <javac srcdir="src" destdir="classes"> <compilerarg arg="-Xbootclasspath/p:${toString:lib.path.ref}"/> </javac>
一类表示复杂数据集合的元素,例如fileset和path
数据元素data element这个词包含了特性property和datatype
好比:
<property file=”user.properties”>
可表示在当前目录下找user.properties文件
有的时候property来表示文件路径很是麻烦:
<property name=”classpath” value=”${lib.dir}/j2ee.jar:${lib.dir}/activation.jar:${lib.dir}/servlet.jar:${lib.dir}/jasper.jar”>
并且在这个库中增长和删除jar都意味着你必须对此路径字符串作相应的增长和删除
这个时候你使用datatype就是很是好的办法:
<path id=”classpath”> <fileset dir=”${lib.dir}”> <include name=”j2ee.jar”/> <include name=”activation.jar”/> <include name=”servlet.jar”/> … </fileset> </path> 固然jar都在同一个目录下,使用通配符指定一个模式(而property却不能够指定模式) <path id=”classpath”> <fileset dir=”${lib.dir}”> <include name=”**/*.jar”/> </fileset> </path>
Fileset只是可用DataType中的一种,如下列出其余可用的DataType:
对于由一个ant构建文件调用的程序,向其传递命令行参数
对于由一个ant构建文件调用的外部命令或程序,指定向其传递的环境变量
定义一个文件的命名列表,这些文件无需确实存在
定义一个文件的命名列表,这些文件必须确实存在
将一组模式分组在一块儿
将一组过滤分组在一块儿
以某种在不一样操做系统间可移植的方式指定路径
定义一组输入文件和一组输出文件间的复杂关系。
语法:ant [option [option…]] [target[target…]]
ant -help可查出全部命令行命令
咱们从包括build.xml文件的目录键入如下命令:
ant
Ant将打开一个默认的构建文件,即build.xml并执行此构建文件的默认目标(即project的default属性)(若是默认目标有依赖目标就会先去执行依赖目标再执行默认目标;若是默认目标不存在会返回一个错误)
指定构建文件名
ant -buildfile proj.xml
执行指定的target
ant -buildfile proj.xml clean
关于这个工程的构建详情
ant -projecthelp
Buildfile:build.xml
Default target:
Compile Compiles all sources code
Main targets:
All cleans,compiles,then builds the jar file
Clean removes all generated files
Compile compiles all source codes
Substargets:
Prepare
BUILD SUCCESSFUL
Total time:2 seconds
这个工程的帮助详情,其中targets被分为主目标和子目标,是根据有无描述descrption来区分的,可是执行的时候并没有区别。在此只是为了显示。
All cleans,compiles,then builds the jar file
右侧的为all这个target的descrption属性
cc-lady, Ant笔记(二)Ant使用, https://blog.csdn.net/cc907566076/article/details/78604487