Ant 是什么?
Apache Ant 是一个基于Java 的生成工具。据最初的创始人 James Duncan Davidson 介绍,这个工具的名称是 another neat tool(另一个整洁的工具) 的首字母缩写。
Ant的作用:
生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。随着应用程序的生成过程变得更加复杂,确保在每次生成期间都使用精确相同的生成步骤,同时实现尽可能多的自动化,以便及时产生一致的生成版本,这就变得更加重要.
Ant的优势:
Ant是一种基于Java的build工具。理论上来说,它有些类似于(Unix)C中的make ,但没有make的缺陷。目前的最新版本为:Ant 1.8.4。 既然我们已经有了make, gnumake, nmake, jam以及其他的build工具为什么还要要一种新的build工具呢?因为Ant的原作者在多种(硬件)平台上开发软件时,无法忍受这些工具的限制和不便。类似于make的工具本质上是基于shell(语言)的:他们计算依赖关系,然后执行命令(这些命令与你在命令行敲的命令没太大区别)。这就意味着你可以很容易地通过使用OS特有的或编写新的(命令)程序扩展该工具;然而,这也意味着你将自己限制在了特定的OS,或特定的OS类型上,如Unix.
Ant就不同了。与基于shell命令的扩展模式不同,Ant用Java的类来扩展。(用户)不必编写shell命令,配置文件是基于XML的,通过调用target树,就可执行各种task。每个task由实现了一个特定Task接口的对象来运行。
Ant 定义生成文件之间的依赖关系,它使用跨平台的 Java 类。使用 Ant,您能够编写单个生成文件,这个生成文件在任何 Java 平台上都一致地操作(因为 Ant 本身也是使用 Java 语言来实现的),这就是 Ant 最大的优势
Ant生成文件剖析:
Ant 没有定义它自己的自定义语法;相反,它的生成文件是用 XML 编写的。存在一组 Ant 能够理解的预定义 XML 元素,而且还可以定义新的元素来扩展 Ant 的功能。每个生成文件由单个 project 元素组成,该元素又包含一个或多个 target 元素。一个目标(target)是生成过程中已定义的一个步骤,它执行任意数量的操作,比如编译一组源文件。并且这些操作本身是由其他专用任务标签执行的然后这些任务将根据需要被分组到各个 target 元素中。一次生成过程所必需的所有操作可以放入单个 target 元素中,但是那样会降低灵活性。将那些操作划分为逻辑生成步骤,每个步骤包含在它自己的 target 元素中,这样通常更为可取。这样可以执行整体生成过程的单独部分,却不一定要执行其他部分。
例如,通过仅调用某些目标,您可以编译项目的源代码,却不必创建可安装的项目文件
顶级 project 元素需要包含一个 default 属性,如果在 Ant 被调用时没有指定目标,这个属性将指定要执行的目标。然后需要使用 target 元素来定义该目标本身。
下面是一个最基本的生成文件:
1
2
3
4
5
|
<? xml version = "1.0" ?> < project default = "init" > < target name = "init" > </ target > </ project > |
Ant基本使用方式:
1. 配置环境变量:
ANT_HOME: C:\ant-1.8 -----> Ant的安装/解压目录路径
PATH后追加: C:\ant-1.8\bin ------>Ant中的BIN目录路径
2. 确认环境变量配置是否成功
打开CMD窗口,然后输入命令: ant:
看到如下显示:
由于Ant构建时需要默认有build.xml文件,因此有如上的提示,至此,说明Ant的环境已经配置成功.
3. 使用Ant创建一个名为HelloWorld的文件夹:
首先需要编辑build.xml:
1
2
3
4
5
6
|
<? xml version = "1.0" ?> < project default = "init" > < target name = "init" > < span style = "color:#FF0000;" >< mkdir dir = "HelloWorld" ></ span > </ target > </ project > |
然后切换到build.xml文件所在的目录,输入ant,若有如下提示,则创建文件夹成功:
(init 部分相当于 日志的输出)
4. 也可以使用ant创建多级嵌套的文件目录
只需要在build.xml文件中进行修改:
1
2
3
4
5
6
|
<? xml version = "1.0" ?> < project default = "init" > < target name = "init" > < span style = "color:#FF0000;" > < mkdir dir = "HelloWorld\a\b\c" /></ span > </ target > </ project > |
5. 删除如上的多级目录:
1
2
3
4
5
6
|
<? xml version = "1.0" ?> < project default = "init" > < target name = "init" > < span style = "color:#FF0000;" >< delete dir = "HelloWorld" /></ span > </ target > </ project > |
注意:此处路径只用输入最高级目录路径,这也正是ANT工具的强大之处:
Java中如果要删除目录,除非该目录为空才可以删除,否则就要逐步进行删除.
而使用Ant工具,则可以直接删除含有子目录的文件夹.
再看一个示例XML文件:
1
2
3
4
5
6
7
8
9
10
|
<? xml version = "1.0" ?> < project default = "init" name = "Project" > < description > A simple project introducing the use of descriptive tags in Ant build files. </ description > <!-- XML comments can also be used --> < target name = "init" description = "Initialize Argon database" > <!-- perform initialization steps here --> </ target > </ project > |
可以看出,XML 注释可以使用在整个生成文件中以提高清晰性。而且,Ant 定义了它自己的description 元素和 description 属性,它们可用于提供更结构化的注释。
Ant属性:
Ant 中的属性类似编程语言中的变量,它们都具有名称和值。然而与通常的变量不同,一经设置,Ant 中的属性就不可更改;它们是不可变的,就像 Java 语言中的 String 对象。 这起初看来似乎很有限制性,但这样是为了遵循 Ant 的简单原则: 毕竟,它是一个生成工具,而不是一种编程语言。如果尝试给某个现有属性赋予一个新的值,这不会被看作是一个错误,但是该属性仍然会保留其现有值
定义与使用属性:
1
|
< property name = "metal“ value=" beryllium"/> |
为了在生成文件的其他部分引用这个属性,使用以下语法:
例如,为了使用这样一个值,它是另一个属性的值的组成部分,将标签写成下面这样
1
|
< property name = "metal-database" value = "${metal}.db" /> |
location属性:
属性经常用于引用文件系统上的文件或目录,但是对于使用不同路径分隔符(例如,/ 与 \)的平台来说,这样可能在跨越不同平台时导致问题。Ant 的 location 属性专门设计用于以平台无关的方式包含文件系统路径。像下面这样使用 location 来代替value:
1
|
< property name = "database-file" location = "archive/databases/${metal}.db" /> |
用于 location 属性的路径分隔字符将被转换为当前平台的正确格式;而且由于文件名是相对的,它被认为是相对于项目的基目录。我们同样可以容易地写为下面这样:
1
|
< property name = "database-file" location = "archive\databases\${metal}.db" /> |
这个标签的两个版本都会在不同的平台具有相同的行为.
定义依赖关系:
生成一个项目一般需要许多步骤 —— 例如首先要编译源代码,然后将它打包为 Java 归档文件
(Java Archive File,JAR)。这其中许多步骤都具有清楚定义的顺序 —— 例如,在编译器从源代码生成类文件之前,您不能打包类文件。与顺序指定 target 所不同的是,Ant 采用一种更灵活的方法来定义 依赖关系 。每个目标的定义依据的是在它能够执行之前必须完成的其他所有目标。这是使用 target 元素的 depends 属性来实现的
1
2
3
4
|
< target name = "init" /> < target name = "preprocess" depends = "init" /> < target name = "compile" depends = "init,preprocess" /> < target name = "package" depends = "compile" /> |
这种方法允许您执行项目任何阶段的生成过程;Ant 会首先执行已定义的先决阶段。在上面的例子中,如果让 Ant 完成 compile 步骤,它将判断出需要首先执行 init 和preprocess 这两个目标。init 目标不依赖其他任何目标,因此它将首先被执行。然后 Ant 检查 preprocesstarget,发现它依赖 init 目标;由于已经执行了后者,Ant 不会再次执行它,因而开始执行 preprocess 目标。最后可以执行 compile 任务本身。
注意目标出现在生成文件中的顺序并不重要:执行顺序是由depends 属性唯一确定的。