Apache Ant使用指南

1 .构建 ant 环境
要使用 ant 首先要构建一个 ant 环境,步骤很简单:
1) 安装 jdk ,设置 JAVA_HOME ,PATH ,CLASS_PATH
2) 下载 ant 地址 www.apache.org
3) 解压 ant 你得到的是一个压缩包,解压缩它,并把它放在一个尽量简单的目录,例如 D:/ant-1.7
4) 设置 ANT_HOME PATH 中添加 ANT_HOME 目录下的 bin 目录。
5) 测试一下你的设置。开始 --> 运行 -->cmd 进入命令行 --> 键入 ant 回车 , 如果看到
Buildfile: build.xml does not exist!
Build failed
配置成功。
 
2 ant 命令行使用举例
1 ant
使用当前目录下的 build.xml 运行 Ant ,执行缺省的 target
2 ant -buildfile test.xml
使用当前目录下的 test.xml 运行 Ant ,执行缺省的 target
3 ant -buildfile test.xml dist
使用当前目录下的 test.xml 运行 Ant ,执行一个叫做 dist target
4 ant -buildfile test.xml -Dbuild=build/classes dist
使用当前目录下的 test.xml 运行 Ant ,执行一个叫做 dist target ,并设定 build 属性的值为 build/classes
 
3 .编写 build.xml
Ant buildfile 是用 XML 写的。每个 buildfile 含有一个 project buildfile 中每个 task 元素可以有一个 id 属性,可以用这个 id 值引用指定的任务。这个值必须是唯一的。(详情请参考下面的 Task 小节)
 
3.1Projects
project 有下面的属性:
Attribute
Description
Required
name
项目名称
No
default
当没有指定 target 时使用的缺省 target
Yes
basedir
用于计算所有其他路径的基路径。该属性可以被 basedir property 覆盖。当覆盖时,该属性被忽略。如果属性和 basedir property 都没有设定,就使用 buildfile 文件的父目录。
No
一个项目可以定义一个或多个 target 。一个 target 是一系列你想要执行的。执行 Ant 时,你可以选择执行哪个 target 。当没有给定 target 时,使用 project default 属性所确定的 target
 
3.2Targets
一个 target 可以依赖于其他的 target 。例如,你可能会有一个 target 用于编译程序,一个 target 用于生成可执行文件。你在生成可执行文件之前必须先编译通过,所以生成可执行文件的 target 依赖于编译 target Ant 会处理这种依赖关系。
然而,应当注意到, Ant depends 属性只指定了 target 应该被执行的顺序-如果被依赖的 target 无法运行,这种 depends 对于指定了依赖关系的 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 依赖于它(看上面的例子)。
如果(或如果不)某些属性被设定,才执行某个 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 总会被执行。
可选的 description 属性可用来提供关于 target 的一行描述,这些描述可由 -projecthelp 命令行选项输出。
将你的 tstamp task (见下文例子)作为一个所谓的初始化 target 是很好的做法,其他的 target 依赖这个初始化 target 。要确保初始化 target 是出现在其他 target 依赖表中的第一个 target 。在本手册中大多数的初始化 target 的名字是 "init"
target 有下面的属性:
Attribute
Description
Required
name
target 的名字
Yes
depends
用逗号分隔的 target 的名字列表,也就是依赖表。
No
if
执行 target 所需要设定的属性名。
No
unless
执行 target 需要清除设定的属性名。
No
description
关于 target 功能的简短描述。
No
 
3.3Tasks
一个 task 是一段可执行的代码。 一个 task 可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对 property 的引用。这些引用会在 task 执行前被解析。
下面是 Task 的一般构造形式:
<name attribute1="value1" attribute2="value2" ... />
这里 name task 的名字, attributeN 是属性名, valueN 是属性值。 有一套内置的( built-in task ,以及一些可选 task ,但你也可以编写自己的 task 所有的 task 都有一个 task 名字属性。 Ant 用属性值来产生日志信息。
可以给 task 赋一个 id 属性:
<taskname id="taskID" ... />
这里 taskname task 的名字,而 taskID 是这个 task 的唯一标识符。通过这个标识符,你可以在脚本中引用相应的 task 。例如,在脚本中你可以这样:
<script ... >
task1.setFoo("bar");
</script>
设定某个 task 实例的 foo 属性。在另一个 task 中(用 java 编写),你可以利用下面的语句存取相应的实例。
project.getReference("task1").
注意 1 :如果 task1 还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。
注意 2 :未来的 Ant 版本可能不会兼容这里所提的属性,因为很有可能根本没有 task 实例,只有 proxies
 
3.4Properties
一个 project 可以有很多的 properties 。可以在 buildfile 中用 property task 来设定,或在 Ant 之外设定。一个 property 有一个名字和一个值。 property 可用于 task 的属性值。这是通过将属性名放在 "${" "}" 之间并放在属性值的位置来实现的。例如如果有一个 property builddir 的值是 "build" ,这个 property 就可用于属性值: ${builddir}/classes 。这个值就可被解析为 build/classes
内置属性:
如果你使用了 <property> task 定义了所有的系统属性, Ant 允许你使用这些属性。例如, ${os.name} 对应操作系统的名字。
要想得到系统属性的列表可参考 the Javadoc of System.getProperties
除了 Java 的系统属性, Ant 还定义了一些自己的内置属性:
basedir project 基目录的绝对路径 ( <project> basedir 属性一样 )
ant.file buildfile 的绝对路径。
ant.version Ant 的版本。
ant.project.name 当前执行的 project 的名字;由 <project> name 属性设定。
ant.java.version Ant 检测到的 JVM 的版本; 目前的值有 "1.1", "1.2", "1.3" and "1.4"
 
4 ant 中的 HelloWorld
1 )首先你要知道你要干什么,我现在想做的事情是:
- 编写一些程序
- 编译它们
- 把它打包成 jar
- 把他们放在应该放置的地方
- 运行它们
这里为了简单起见,只写一个程序,就是 HelloWorld.java 程序代码如下:
package test.ant;
public class HelloWorld{
  public static void main(String[] args){
  System.out.println("Hello world ");
  }
}
 
2 )要运行 ant 需要有一个 build.xml
下边就是一个完整的 build.xml
<?xml version="1.0" encoding="UTF-8" ?>
<project name="HelloWorld" default="rerun" basedir=".">
  <property name="src" value="src"/>
  <property name="dest" value="classes"/>
  <property name="lib"  value="lib"/>
  <property name="hello_jar" value="hello1.jar"/>
 
  <target name="init">
  <mkdir dir="${dest}"/>
  </target>
 
  <target name="compile" depends="init">
  <javac srcdir="${src}" destdir="${dest}"/>
  </target>
 
  <target name="build" depends="compile">
  <mkdir dir="${lib}"/>
  <jar jarfile="${lib}/${hello_jar}" basedir="${dest}"/>
  </target>
 
  <target name="run" depends="build">
  <java classname="test.ant.HelloWorld" classpath="${lib}/${hello_jar}"/>
  </target>
 
  <target name="clean" depends="run">
  <delete dir="${dest}" />
  </target>
 
  <target name="rerun" >
  <ant target="run" />
  </target>
</project>
 
解释:
<project name="HelloWorld" default="run" basedir=".">
</project>
ant 的所有内容必须包含在这个里边, name 是你给它取的名字, basedir 是工作的根目录 . 代表当前目录。 default 代表默认要做的事情。
<property name="src" value="src"/>
类似程序中的变量。各个 target 的用途依次是:编译( compile ),做 jar 包( build ),运行( run )。
为了不用拷贝,我们可以在最开始定义好目标文件夹,这样 ant 直接把结果就放在目标文件夹中了:新建文件夹( init )。
另外两个 target :删除生成的文件( clean ),再次运行,这里显示了如何在一个 target 里边调用其他的 target rerun )。
 
测试:
1 )新建一个 src 的文件夹,然后把 HelloWorld.java 按照包目录放进去。
2 )做好 build.xml 文件。放在与 src 同级的目录。
3 )将当前目录转换到 build.xml 所在目录。在命令行下键入 ant, 你会发现一个个任务都完成了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值