02 Ant进阶

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第2讲Ant进阶21回顾上一讲学习了上一讲,相信已经激起大家的兴趣,或许还有不少感触。当然上一讲我们只了解了Ant的九牛一毛,这一讲将会更加深入的介绍Ant的方方面面。32核心概念详解2.1project属性首先看上一讲中的例子:projectname=HelloWorlddefault=runbasedir=.可以看出project有下面的属性:AttributeDescriptionRequiredname项目名称,可自由定义。否default定义一个缺省(默认)的target,当我们执行没有指定target的build.xml时,就会执行这个缺省的target。是basedir用于定义项目的基路径。否description表示项目的描述否项目的描述以一个顶级的description元素的形式出现。2.2property属性一个项目可以有很多的property。可以在buildfile中用propertytask来设定,或者在ant之外设定。一个property有一个名字和一个值。Property可以用于task的属性值。这是通过将属性名放在“${}”之间并放在属性值的位置来实现的。例如有一个propertybuilddir的值是“build”,这个property就可用于属性值:${builddir}/classes。这个值就可被解析为build/class。典型的如第一讲中的例子,首先设定property:propertyname=srcvalue=src/propertyname=destvalue=classes/然后在其他地方引用property:targetname=compiledepends=initjavacsrcdir=${src}destdir=${dest}//target2.3内置属性如果你使用了property定义了所有的系统属性,Ant允许你使用这些属性,例如${os.name}对应操作系统的名字。要想得到系统属性的列表可以参考thejavadocofSystem.getProperties。使用如下测试代码可以查看一下:publicvoidtestProperties(){Propertiesp=System.getProperties();for(Enumeration?e=p.propertyNames();e.hasMoreElements();){4Stringkey=(String)e.nextElement();System.out.println(key+:+p.getProperty(key));}}上面的代码就不做详细描述了,这些应该是看这个文档的人应该能看懂的。除了Java的内置属性外,Ant还定义了一些自己的内置属性:AttributeDescriptionbasedir可以理解为project项目的绝对路径,于project中的basedir属性一样ant.filebuildfile的绝对路径ant.versionant的版本ant.propertie.name当前执行的project的名字,由project的name属性设定ant.java.versionant检测到的jvm版本。…………2.4target属性还是看上一讲中的例子:targetname=compiledepends=init,target可以有如下几个属性。AttributeDescriptionRequirednametarget的名字。是depends用逗号分隔的target的名字列表,也就是依赖列表否if执行target需要清除设定的属性名否unless执行target需要清除设定的属性名否description描述target的功能,这些描述可由-projexthelp命令行输出。否2.4.1dependstarget中的depends属性指定了target的执行顺序,也就是说一个target可以依赖其他的target。Ant会依照depends属性中的target出现顺序依次执行每个target。在执行前,首先需要执行它所依赖的target。例如,有一个用于编译的target,一个用于生成执行文件的target。在生成执行文件之前必须先编译通过,所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。我们还要注意到,Ant的depends属性只指定了target应该被执行的顺序。如果被依赖的target无法运行,这种depends对于指定了依赖关系的其他target没有影响。Ant会依照depends属性中target出现的顺序依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。看下面的例子。targetname=A/假设我们默认的target是D,因为D依赖于C,C5targetname=Bdepends=A/targetname=Cdepends=B/targetname=Ddepends=C/依赖于B,B依赖于A。所以先执行A,再执行B,然后是C,最后D被执行。还可以写为这样的格式:targetname=Ddepends=C,B,A/,执行顺序和上面的一样。另外,一个target只能执行一次,即使有多个target依赖于它,也只执行一次。2.4.2if/unless如果执行某个target,由某些属性是否被设定来决定。这样,就能根据系统的状态(javaversion,OS,命令行属性定义等等)来更好的控制build的过程。要想让一个target这样做,你就应该在target元素中,加入if或unless属性,带上target应该有所判断的属性。看下面的例子。targetname=install-windowsif=osfamily-windowstargetname=install-unixif=osfamily-unix如果没有if或者else,target总会被执行。2.5task属性一个task是一段可执行的代码。task可以有多个属性(也可以叫变量)。属性值可能包含对property的引用。这些应用会在task执行前被解析。还是看上一讲中的例子:targetname=compiledepends=initjavacsrcdir=${src}destdir=${dest}//target其中的javacsrcdir=${src}destdir=${dest}/就是一个task。其中的${src}就是对前面定义的property的引用。再执行javac之前这些${*}会被解析。下面是task的一般构造形式:nameattribute1=”value1”attribute2=”value2”…/这里name是task的名字,attribute是属性名,value是属性值。另外,我们可以使用内置的task和一些可选的task,我们也可以编写自己的task。63Ant常用task3.1设置classpath(1)当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是classpathpathelementpath=${classpath}/pathelementlocation=lib/jar.jar//classpathlocation属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径--其他情况下,应该用多个location属性。注意:你可以用:和;作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。为简洁起见,classpath标签支持自己的path和location属性。所以:classpathpathelementpath=${classpath}//classpath可以被简写作:classpathpath=${classpath}/(2)也可通过fileset元素指定路径。构成fileset的多个文件加入classpath的顺序是未定的。classpathpathelementpath=${classpath}/filesetdir=libincludename=**/*.jar//filesetpathelementlocation=${dest}//classpath上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着是${dest}目录。(3)References如果我们想在多个task中使用相同的classpath,可以用path元素定义它们(与target同级),然后通过id属性引用buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块,这一属性就很有用--如多次使用classpath结构。下面的例子:rmic代表任意一个taskproject…target…rmic…classpathpathelementlocation=lib//7pathelementpath=${java.class.path}//pathelementlocation=${dest}//classpath/rmic/targettarget…javac……classpathpathelementlocation=lib//pathelementpath=${java.class.path}//pathelementlocation=${dest}//classpath/target/project可以写成如下形式:project…pathid=project.class.pathpathelementlocation=lib//pathelementpath=${java.class.path}//pathelementlocation=${dest}//pathtarget…rmic…classpathrefid=project.class.path//rmic/targettarget…javacclasspathrefid=project.class.path//javac/target/project3.2使用classpathtargetjavacclasspathrefid=project.class.path/8/javac/target3.3输出信息可以有多种输出信息的写法:写法1:输出一段话echomessage=”XXXXXX”写法2:输出一段话echoXXXXXX/echo写法3:输出一段XMLechoxmlfile=”subbuild.xml”projectdefault=”foo”targetname=”foo”echofoo/echo/target/project/echoxml3.4设置property(1)设置属性name-valuepropertyname=srcvalue=src/(2)读取属性文件中的属性配置propertyfile=foo.properties/(3)读取网络中的property-setpropertyurl=(4)读取文件中的属性配置propertyresource=foo.properties/(5)读取环境变量propertyenvironment=env/(6)读取属性文件中的属性,并作为全局引用propertyfile=/

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功