Ant 阅读笔记

Ant 笔记
(0)概述:
Ant, 感觉上类似于原来的make文档。
主要的作用是方便项目的自动部署,现在有一个更新的Meaven可以作为Ant的替代品,不过Ant的应用目前仍然十分广泛。

Ant可以理解为以xml为基础编写的脚本,自动执行以完成一系列的任务。这点和bat也有相似的地方,总之是一个很简单但及其有用的东西。
Ant通常不用作为项目release的组建发布,实际上它一般是在项目开发,部署期间提供的一个发布工具。用ant会简化很多本该手动完成的 文件操作/编译任务。

随便找了一个Ant的Ebook, 资料不多30多页,大致看看,验证我对Ant的猜测是否正确。然后也顺便系统的了解一下Ant的思想和实现。

Ant 需要安装,并且需要设置path环境变量,这样ant 本身发布的命令才能够在命令行环境中执行,这点和JDK的java,javac.等命令是一个意思。

Ant 有个很重要的扩展点是,我们可以很方便地编写自定义的ant任务.

--另外,手上的这本教程是一个UK IBM的工程师写的.
--Ant 的缩写居然是 Another neat tool(另一个灵巧地工具)....

Ant 有一个特性是跨平台,当然这个特性是从Java继承得到的.

 

(1)Ant脚本(xml)的基本结构:

-project
 |
 |-target1
 |-target2
 |-target3

其中target是步骤地抽象.
target中可以包含任意数量的操作.
这些target中的操作按照一定顺序执行,整个project的任务就实现了.这个project也可以理解为一个ant项目.

 

(2)Ant的属性:
类似于程序语言中的变量.
名称与键值对的抽象.
具体类似于如下,在脚本的其他位置可以对定义的属性进行引用.
<property name="metal" value="beryllium"/>
引用语法为:
${metal}

Ant中有许多预定义的属性.如Java环境设置.
如:${user.home}
属性经常用于引用文件系统上的文件或者目录.
如果属性是为了定义系统路径,那么使用location 比使用value好.

<property name="srcpath" location="archive/databases/"/>
优于:
<property name="srcpath" value="archive/databases/"/>

因为不同的操作系统,有的用"\"作为路径分隔符,有的用"/"做路径分隔符.
使用location, ant将自动将路径转换成操作系统合法的路径名.从而增加了ant脚本的移植性。
或者干脆同时维护一个win_build.xml和unix_build.xml.

(3)依赖(depends)
<target>可能依赖其它的target.
这句话的意思是指,要完成一个target, 需要优先完成其他的target.
例如:
<target name="init"/>
<target name="preprocess" depends="init"/>
<target name="compile" depends="init,preprocess"/>
<target name="package" depends="compile"/>

如果我们让ant执行任务 package. 那么它会自动先执行init, preprocess, compile, 最后才是package.
这个依赖关系很好理解,但对于ant来说,及其重要,我认为依赖是ant思想的核心。
这样,我也可以只执行compile. 那么操作序列将只进行到compile, 不会执行package.

另外一点需要着重说明: ant中target的执行顺序与target在脚本中出现的位置没有关系。
target的执行由依赖唯一确定。

 

(4) 运行ant
ant 在eclipse的运行(或其他IDE)不理会了。只关心命令行。IDE也只是用UI来替代了命令行的调用。
ant -file build_prop.xml
运行ant可以编写一个bat来完成。


(5)生成项目
<编译任务>:
由于 Ant 的主要目标是生成 Java 应用程序,它能够内在地、出色地支持调用 javac 编译器以及
其他 Java 相关任务就毫不奇怪了。下面是编译 Java 代码的任务的编写方式:
<javac srcdir="src"/>
这个标签寻找 src 目录中以 .java 为扩展名的所有文件,并对它们调用 javac 编译器,从而在相
同的目录中生成类文件。当然,将类文件放在一个单独的目录结构中通常会更清晰;可以通过添加
destdir 属性来让 Ant 做到这点。其他有用的属性包括:
· classpath:等价于 javac 的 -classpath 选项。
· debug="true":指示编译器应该带调试信息编译源文件。


<JAR任务>
在编译 Java 源文件之后,结果类文件通常被打包到一个 JAR 文件中,这个文件类似 zip 归档文
件。每个 JAR 文件都包含一个清单文件,它可以指定该 JAR 文件的属性。
下面是 Ant 中 jar 任务的一个简单使用例子:
<jar destfile="package.jar" basedir="classes"/>
这将创建一个名为 package.jar 的 JAR 文件,并把 classes 目录中的所有文件添加到其中(JAR
文件能够包含任意类型的文件,而不只是类文件)。此处没有指定清单文件,因此 Ant 将提供一个
基本的清单文件。
manifest 属性允许指定一个用作该 JAR 文件的清单的文件。清单文件的内容还可以使用 manifest
任务在生成文件中指定。这个任务能够像文件系统写入一个清单文件,或者能够实际嵌套在 jar 之
内,以便一次性地创建清单文件和 JAR 文件。 例如:
<jar destfile="package.jar" basedir="classes">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-class" value="package.Main"/>
</manifest>
</jar>


(6)文件系统操作
<创建/删除目录>
最基本的文件系统操作之一就是创建目录或文件夹。做这项工作的任务名为 mkdir,毫不奇怪,它
非常类似于具有相同名称的 Windows 和 UNIX/Linux 命令。
<mkdir dir="archive/metals/zinc"/>

首先要注意 / 被用作目录分隔符,这是 UNIX 和 Linux 的惯例。您可能认为这不是很平台无关的,
但是 Ant 知道如何处理它,并针对它运行所在的平台做恰当的事情,这与我们在前面定义基于位置
的属性时所看到的方式相同。我们能够同样容易地使用 \,而不管平台是什么 —— Ant 能够处理
任一种形式,甚至能够处理两种形式的混合。
mkdir 任务的另一个有用特性是它的如下能力:在父目录还不存在时创建它们。考虑一下上面的清
单,设想 archive 目录存在,但是 metals 目录不存在。如果使用底层平台的 mkdir 命令,您需
要首先显式地创建 metals 目录,然后第二次调用 mkdir 命令来创建 zinc 目录。但是 Ant 任务
Ant 使用指南
Java爱好者 第 20页 http://www.javafan.net
比这更加智能,它能够一次性创建这两个目录。类似地,如果目标目录已经存在,mkdir 任务不会
发出错误消息,而只是假设它的工作已经完成,从而什么也不做。
删除目录同样也很容易:
<delete dir="archive/metals/zinc"/>
这将删除指定的目录连同它包含的所有文件以及子目录。使用 file 属性而不是 dir 属性可以指定
要删除的单个文件。

<复制/移动文件/目录>
在 Ant 中制作文件的一份拷贝很简单。例如:
<copy file="src/Test.java" tofile="src/TestCopy.java"/>
您还可以使用 move 来执行重命名操作而不是拷贝文件:
<move file="src/Test.java" tofile="src/TestCopy.java"/>
另一个常用的文件系统操作是将文件复制或移动到另一个目录。做这项工作的 Ant 语法同样也很简
单:
<copy file="src/Test.java" todir="archive"/>
<move file="src/Test.java" todir="archive"/>

<压缩/解压缩>
<zip destfile="output.zip" basedir="output"/>
Ant 使用指南
Java爱好者 第 21页 http://www.javafan.net
相同的语法也可用于创建 tar 文件。 还可以使用 GZip 和 BZip 任务来压缩文件。例如:
<gzip src="output.tar" zipfile="output.tar.gz"/>
解压缩和提取文件同样也很简单:
<unzip src="output.tar.gz" dest="extractDir"/>
还可以包括 overwrite 属性来控制覆盖行为。默认设置是覆盖与正在被提取的归档文件中的条目相
匹配的所有现有文件。相关的任务名称是 untar、unjar、gunzip 和 bunzip2。


<替换文件中的标记>
我们将在本节考察的最后一个文件系统操作是 replace 任务,它执行文件中的查找和替换操作。
token 属性指定要查找的字符串,value 属性指定一个新的字符串,查找到的标记字符串的所有实
例都被替换为这个新的字符串。例如:
<replace file="input.txt" token="old" value="new"/>


(7)重要的模式匹配 与文件选择器
在前面考察文件系统任务时,我们仅使用了单独地命名的文件和目录。然而,一次对一组文件执行
那些操作经常是有用的 —— 例如对给定目录中以 .java 结尾的所有文件执行操作。正如等价的
DOS 和 UNIX 命令提供了这样的功能一样,Ant 也提供了这样的功能。这是使用通配符字符来完成
的:*,它匹配零个或多个字符;以及 ?,它仅匹配一个字符。因而匹配以 .java 结尾的所有文件
的模式不过就是 *.java。
也可以对目录执行模式匹配。例如,模式 src*/*.java 将匹配带 src 前缀的任何目录中的所有
Java 文件。 还有另一种模式结构:**,它匹配任意数量的目录。例如,模式 **/*.java 将匹配当
前目录结构下的所有 Java 文件。
您能够以相当一致的方式对文件系统任务使用模式,比如嵌套的 fileset 元素。先前,我们使用这
个任务来复制单个文件:
<copy file="src/Test.java" todir="archive"/>
如果我们想要使用一个模式,可以将 file 属性替换为一个 fileset 元素,如下所示:
<copy todir="archive">
<fileset dir="src">
<include name="*.java"/>
</fileset>
</copy>
fileset 默认情况下包含指定 src 目录下的所有文件,因此为了仅选择 Java 文件,我们对模式使
用一个 include 元素。类似地,我们可以对另一个模式添加一个 exclude 元素,从而潜在地排除
include 指定的匹配项。甚至可以指定多个include 和 exclude 元素;这样将得到一组文件和目录,
它们包含 include 模式的所有匹配项的并集,但排除了 exclude 模式的所有匹配项。
注意还有一个通常很有用的文件集特性,但是对于没有意识到它的人来说,这个特性偶尔会产生混
淆。这个特性称为 默认排除:即自动从文件集内容中排除的内置模式列表。该列表包括与名为 CVS
的目录相匹配的条目,以及以 ~ 字符结尾的文件,它们可能是备份文件。您通常不想在文件系统操
作中包括这类文件和目录,因此排除这些文件是默认行为。然而,如果确实想无例外地选择 所有 文
件和目录,可以将文件集的 defaultexcludes 属性设置为 no。


正如我们已经看到的,文件集用于指定一组文件,并且这个组的内容可以使用 include 和 exclude
模式来指定。也可以结合称为 选择器 的特殊元素使用include 和 exclude 来选择文件。下面是
对 Ant 可用的核心选择器的列表:
· size:这个选择器用于根据文件的字节大小选择文件(除非使用 units 属性来指定了不同
的单位)。when 属性用于设置比较的性质(less、more 或者 equal),value 属性定义每
个文件将与之作比较的目标大小。
· contains:只有包含给定文本字符串(由text 属性指定)的文件才匹配这个选择器。默认
情况下,查找操作是大小写敏感的;添加casesensitive="no" 可以改变默认设置。
· filename:name 属性指定文件名要与之匹配的模式。它本质上与 include 元素相同,以及
与指定了negate="yes" 时的 exclude 元素相同。
· present:从当前目录结构中选择如下文件:它们与指定的 targetdir 目录中的文件具有相
同的名称和相对目录结构。
· depend:这个选择器与 present 选择器具有相同的效果,只不过匹配的文件被限制到相对
于 targetdir 位置中的对应文件来说,最近已修改过的那些文件。
· date:这个选择器基于其最后修改日期选择文件。when 属性指定作比较的性质是 before、
after 还是 equal,datetime 属性指定与之作比较的日期和时间,这个日期和时间具有给
定的固定格式 MM/DD/YYYY HH:MM AM_or_PM。注意 Windows 平台上有一个内置的 2 秒偏移,
以允许底层文件系统的不精确性 —— 这可能导致匹配的文件数量超过预期。允许的回旋时
间量可以使用 granularity 属性来更改(以毫秒为单位来指定)。
· depth:这个选择器检查每个文件的目录结构层次数目。min 和/或 max 属性用于选择具有
想要的目录层次数目的的文件。
Ant 使用指南
Java爱好者 第 24页 http://www.javafan.net
还可以通过在一个选择器 容器 内嵌套一个或多个选择器来组合选择器。 最常用的选择器容器 and
仅选择它包含的所有选择器都选择了的文件。其他选择其容器包括 or、not、none 和 majority。
下面是一个文件集的例子,它仅选择那些大于 512 字节并且包含字符串“hello”的文件。
<fileset dir="dir">
<and>
<contains text="hello"/>
<size value="512" when="more"/>
</and>
</fileset>


(
后面还有文件链接和 自定义Ant任务没有察看。
具体的运用可以具体分析,如此。利用于ant的能力,可以设想一个项目的release过程:
(1)调用cvs任务,以某个只读权限从服务器下载项目。
(2)调用javac任务对项目进行编译。
(3)调用文件系统任务(包含模式匹配和文件选择器)对已生成的.class文件和资源文件进行部署。
(4)调用文件系统任务对配置文件进行部署。
....
整个一条龙服务。。。
)

posted @ 2008-05-09 15:33  BearOcean  阅读(1361)  评论(0编辑  收藏  举报