1 / 33

Ant 指南

Ant 指南. 主讲教师:张志宇 zhang_zhiyu@263.net. 目录. 1. Ant 是什么? 2. 安装 Ant 3. 运行 Ant 4. 编写 build.xml. Ant 是什么?. Ant 是一种基于 Java 的 build 工具。 理论上来说,它有些类似于( Unix ) C 中的 make ,但没有 make 的缺陷。 make 的工具本质上是基于 shell (语言)的:

trevor
Download Presentation

Ant 指南

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ant指南 主讲教师:张志宇 zhang_zhiyu@263.net

  2. 目录 • 1. Ant是什么? • 2. 安装Ant • 3. 运行Ant • 4. 编写build.xml

  3. Ant是什么? • Ant是一种基于Java的build工具。 • 理论上来说,它有些类似于(Unix)C中的make ,但没有make的缺陷。 • make的工具本质上是基于shell(语言)的: • 他们计算依赖关系,然后执行命令(这些命令与你在命令行敲的命令没太大区别)。这就意味着你可以很容易地通过使用OS特有的或编写新的(命令)程序扩展该工具;然而,这也意味着你将自己限制在了特定的OS,或特定的OS类型上,如Unix。 • Ant就不同了。与基于shell命令的扩展模式不同,Ant用Java的类来扩展。 • 不必编写shell命令,配置文件是基于XML的,通过调用target树,就可执行各种task。每个task由实现了一个实现了特定Task接口的对象来运行。

  4. 安装Ant • 由于Ant是一个Open Source的软件,所以有两种安装Ant的方式,一种是用已编译好的binary 文件安装Ant,另一种是用源代码自己build Ant。 • binary 形式的Ant可以从http://jakarta.apache.org/builds/ant/release/v1.4.1/bin下载。 • 如果你希望你能自己编译Ant,则可从 http://jakarta.apache.org/builds/ant/release/v1.4.1/src下载。

  5. 运行Ant • 运行Ant非常简单,当你正确地安装Ant后,只要输入ant就可以了。 • 没有指定任何参数时,Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。 • 如果你用 -find选项。Ant就会在上级目录中寻找buildfile,直至到达文件系统的根。 • 要想让Ant使用其他的buildfile,可以用参数 -buildfile file,这里file指定了你想使用的buildfile。

  6. 运行Ant • 你也可以设定一些属性,以覆盖buildfile中指定的属性值。 • 可以用 -Dproperty=value选项,这里property是指属性的名称,而value则是指属性的值。 • 也可以用这种办法来指定一些环境变量的值。 • 你也可以用property task来存取环境变量。 • 只要将 -DMYVAR=%MYVAR% (Windows)或 -DMYVAR=$MYVAR (Unix)传递给Ant -你就可以在你的buildfile中用${MYVAR}来存取这些环境变量。

  7. 运行Ant • -quite,告诉Ant运行时只输出少量的必要信息。 • -verbose,告诉Ant运行时要输出更多的信息。 • 可以指定执行一个或多个target。当省略target时,Ant使用标签<project>的default属性所指定的target。 • 如果有的话,-projecthelp选项输出项目的描述信息和项目target的列表。先列出那些有描述的,然后是没有描述的target。

  8. 命令行选项总结 • ant [options] [target [target2 [target3] ...]]Options:-help print this message-projecthelp print project help information-version print the version information and exit-quiet be extra quiet-verbose be extra verbose-debug print debugging information-emacs produce logging information without adornments-logfile file use given file for log output-logger classname the class that is to perform logging-listener classname add an instance of class as a project listener-buildfile file use specified buildfile-find file search for buildfile towards the root of the filesystem and use the first one found-Dproperty=value set property to value

  9. 例子 • Ant • 使用当前目录下的build.xml运行Ant,执行缺省的target • ant -buildfile test.xml • 使用当前目录下的test.xml运行Ant,执行缺省的target。 • ant -buildfile test.xml dist • 使用当前目录下的test.xml运行Ant,执行一个叫做dist的target。 • ant -buildfile test.xml -Dbuild=build/classes dist • 使用当前目录下的test.xml运行Ant,执行一个叫做dist的target,并设定build属性的值为build/classes。

  10. 文件 • 在Unix上,Ant的执行脚本在做任何事之前都会source(读并计算值)~/.antrc 文件; • 在Windows上,Ant的批处理文件会在开始时调用%HOME%\antrc_pre.bat,在结束时调用%HOME%\antrc_post.bat。 • 你可以用这些文件配置或取消一些只有在运行Ant时才需要的环境变量。 • 看下面环境变量的例子。 • 包裹脚本(wrapper scripts)使用下面的环境变量(如果有的话): • JAVACMD Java可执行文件的绝对路径。用这个值可以指定一个不同于JAVA_HOME/bin/java(.exe)的JVM。 • ANT_OPTS 传递给JVM的命令行变量-例如,你可以定义属性或设定Java堆的最大值

  11. 手工运行Ant • 如果你自己动手安装(DIY)Ant,你可以用下面的命令启动Ant:java -Dant.home=c:\ant org.apache.tools.ant.Main [options] [target] • 这个命令与前面的ant命令一样。选项和target也和用ant命令时一样。 • 这个例子假定你的CLASSPATH包含: • ant.jar • jars/classes for your XML parser • the JDK's required jar/zip files

  12. 编写build.xml • Ant的buildfile是用XML写的。每个buildfile含有一个project。project有下面的属性:

  13. Targets • 一个项目可以定义一个或多个target。 • 一个target是一系列你想要执行的。执行Ant时,你可以选择执行那个target。当没有给定target时,使用project的default属性所确定的target。 • 一个target可以依赖于其他的target。 • 例如,你可能会有一个target用于编译程序,一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过,所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。 • 然而,应当注意到,Ant的depends属性只指定了target应该被执行的顺序-如果被依赖的target无法运行,这种depends对于指定了依赖关系的target就没有影响。

  14. Target执行的顺序 • Ant会依照depends属性中target出现的顺序(从左到右)依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。 • <target name=“A”/><target name=“B” depends=“A”/><target name=“C” depends=“B”/><target name=“D” depends=“C,B,A”/> • 假定我们要执行target D。从它的依赖属性来看,你可能认为先执行C,然后B,最后A被执行。错了,C依赖于B,B依赖于A,所以先执行A,然后B,然后C,最后D被执行。 • 一个target只能被执行一次,即时有多个target依赖于它

  15. if(或unless)属性 • 如果(或如果不)某些属性被设定,才执行某个target。这样,允许根据系统的状态(java version, OS, 命令行属性定义等等)来更好地控制build的过程。 • 要想让一个target这样做,你就应该在target元素中,加入if(或unless)属性,带上target应该有所判断的属性。 • 例如:<target name="build-module-A" if="module-A-present"/><target name="build-own-fake-module-A" unless="module-A-present"/>如果没有if或unless属性,target总会被执行。

  16. 编写初始化target • 可选的description属性可用来提供关于target的一行描述, • 这些描述可由-projecthelp命令行选项输出。 • 编写初始化target是很好的做法, • 其他的target依赖这个初始化target。 • 要确保初始化target是出现在其他target依赖表中的第一个target。 • 大多数的初始化target的名字是"init"。

  17. target属性

  18. Tasks • 一个task是一段可执行的代码。 • 一个task可以有多个属性 • 属性只可能包含对property的引用。这些引用会在task执行前被解析。 • 下面是Task的一般构造形式:<name attribute1="value1" attribute2="value2" ... />这里name是task的名字,attributeN是属性名,valueN是属性值。

  19. Tasks • 有一套内置的(built-in)task,以及一些可选task,但你也可以编写自己的task。 • 所有的task都有一个task名字属性。Ant用属性值来产生日志信息。 • 可以给task赋一个id属性: • <taskname id="taskID" ... /> • 这里taskname是task的名字,而taskID是这个task的唯一标识符。通过这个标识符,你可以在脚本中引用相应的task。

  20. Tasks • 例如,在脚本中你可以这样:<script ... >task1.setFoo("bar");</script>设定某个task实例的foo属性。在另一个task中(用java编写),你可以利用下面的语句存取相应的实例。project.getReference("task1"). • 注意1:如果task1还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。 • 注意2:未来的Ant版本可能不会兼容这里所提的属性,因为很有可能根本没有task实例,只有proxies。

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

  22. 内置属性 • 如果你使用了<property> task 定义了所有的系统属性,Ant允许你使用这些属性。例如,${os.name}对应操作系统的名字。 • 要想得到系统属性的列表可参考 System.getProperties。 • 除了Java的系统属性,Ant还定义了一些自己的内置属性: • Basedirproject基目录的绝对路径 (与<project>的basedir属性一样)。 • ant.file buildfile的绝对路径。 • ant.version Ant的版本。 • ant.project.name 当前执行的project的名字;由<project>的name属性设定. • ant.java.versionAnt检测到的JVM的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".

  23. Token Filters • 一个project可以有很多tokens,这些tokens在文件拷贝时会被自动扩展,这要求在支持这一行为的task中选择过滤拷贝功能。这一功能可用filter task在buildfile中设定。 • 既然这很可能是一个有危害的行为,文件中的tokens必须采取@token@的形式,这里token是filter task中设定的token名。这种token语法与其他build系统执行类似filtering的语法相同,而且与大多数的编程和脚本语言以及文档系统并不冲突, • 注意:如果在一个文件中发现了一个@token@形式的token,但没有filter与这个token关连,则不会发生任何事;因此,没有转义方法-但只要你为token选择合适的名字,就不会产生问题。 • 警告:如果你在拷贝binary文件时打开filtering功能,你有可能破坏文件。这个功能只针对文本文件。

  24. Path-like Structures • 你可以用“:”和“;”作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。 • 当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是 <classpath> <pathelement path="${classpath}"/> <pathelement location="lib/helper.jar"/> </classpath> • location属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径 • 其他情况下,应该用多个location属性。

  25. Path-like Structures • 为简洁起见,classpath标签支持自己的path和location属性。所以: <classpath> <pathelement path="${classpath}"/> </classpath> 可以被简写作: <classpath path="${classpath}"/>

  26. Path-like Structures • 也可通过<fileset>元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。 <classpath> <pathelement path="${classpath}"/> <fileset dir="lib"> <include name="**/*.jar"/> </fileset> <pathelement location="classes"/> </classpath> • 上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着是classes目录。

  27. Path-like Structures • 如果你想在多个task中使用相同的path-like structure,你可以用<path>元素定义他们(与target同级),然后通过id属性引用。 • path-like structure可能包括对另一个path-like structurede的引用(通过嵌套<path>元素) <path id="base.path"> <pathelement path="${classpath}"/> <fileset dir="lib"> <include name="**/*.jar"/> </fileset> <pathelement location="classes"/> </path> <path id="tests.path"> <path refid="base.path"/> <pathelement location="testclasses"/> </path>

  28. Path-like Structures • 前面所提的关于<classpath>的简洁写法对于<path>也是有效的, • 如: <path id="tests.path"> <path refid="base.path"/> <pathelement location="testclasses"/> </path> • 可写成:<path id="base.path" path="${classpath}"/>

  29. 命令行变量 • 有些task可接受参数,并将其传递给另一个进程。为了能在变量中包含空格字符,可使用嵌套的arg元素。

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

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

  32. References 下面的例子 • <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>

  33. References 可以写成如下形式 • <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> • 所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。

More Related