Java的Build工具Ant

发布时间:   来源:文档文库   
字号:
1Ant概述
1Ant是什么
它是一个自动化脚本引擎
它是一种基于JavaBuild工具而且是一个自动化脚本引擎,脚本格式为XML。理论上来说,它有些类似于C中的make,但比make优越。
与其它平台下的make文件的不同点
现在存在的大多数Build工具,如makegnumakenmakejam等都存在这样或那样的不足,比如依赖于特定的平台、配置文件过于复杂或者对格式无法检查而容易出错等。
而不同的是Ant可以运行在多种操作平台上,满足开发者跨平台构建项目代码的需要Ant与其它IDE的集成
Ant是一个独立的开发工具,但也可以被其他开发工具集成,目前Ant已经被一些著名的可视化的开发工具所集成,如NetBeansEclipse等。2)特性
与前面的这些工具相比较,Ant的两个特性决定了它是一款优秀的Build工具:
基于Java的实现。具有良好的跨平台性,同时可以通过增加新的Java类来扩展Ant的功能,而
无需去了解不同平台上不同的脚本语言。
基于XML的配置文件。AntXML树来描述Target/Task的关系,文件结构清晰、易读易写,
且利用XML对格式的控制来避免由于配置文件的错误造成的Build操作失败。
3)为什么要提供Ant
当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中make脚本来帮助这些工作的批量完成。
Java中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。
2ANT的安装1)下载Ant
Apache的网站http://www.apache.org或者从Apache组织Ant项目的网站http://ant.apache.org下载Ant。下载之后将压缩包解压。

2)设置环境变量
JAVA_HOME=JDKHome目录ANT_HOME=antHome目录

path=antHome目录下的bin目录;

3)在项目所在的目录下启动Ant
C>ant
如果不指定配置文件,ant会缺省找build.xml这个配置文件(在项目的目录下应该有build.xml文件)并根据配置文件执行任务。
3Ant的工作原理
它是将项目的构建任务分解,它分为工程、目标和任务3个层次;在Ant中的所有设定要素都是遵守XML规范的,并存储在默认的build.xml文件中。
工程用来描述处于项目层次的内容
目标由用户来编写,不同的目标对应于用户在使用上的一个操作任务单元
基本的和面向特定行为的操作会由Ant在任务的层次上完成,所有任务都可以被目标调用,在目
标内被组合装配起来完成用户自定义的一个过程,实现自动化工作的需要。

4Antbuild.xml文件
1)它是一个标准的XML文件
AntBuild文件是一个标准的XML文件,它包含一个根节点Project,每个Project定义了至少一个或多个Target,每个Target又是一系列Task(每个Task是一段可被执行的代码,比如利用javac或者jar等工具进行操作)的集合。2)各个元素标签之间的关系
要用好Ant工具,关键是要编写好一个build.xml文件。它们之间的关系如下图所示。



下面以一个示例来说明上面的含义
J2EEStrutsXML编程>技术">name="XML用法"/>
name="XML进行解析"/>
应用技术">name="Struts应用环境搭建"/>
name="Struts应用组件"/>
应用技术">name="Tomcat平台下的WebService应用技术"/>
name="Tomcat平台下的WebService应用技术"/>

5build.xml文件中的常用的标签1build.xml文件中的工程project
工程是对一个项目整个任务过程的抽象,它在build.xml中由标签表示并且是build.xml
的根标签。






工程(project)标签中主要包含有3个属性:
basedir指定此工程所在的根目录位置。name设定这个工程的名称。
default设置此工程的build执行时默认的目标(target)入口。

2build.xml文件中的目标target
目标target标签在工程project标签之内,一个工程project标签内可以包含任意多个目标target

标签



演示目标"name="main">
目标(target)标签中主要包含6个属性:
description对于这个任务的描述。name这个任务的名称。
depends这个任务所依赖的任务,执行这个任务时会先执行所依赖的任务。depends标记内
可以添加多个目标。例如下面的示例(在这个build中的目标执行顺序是:y,z,x


if检查某个属性是否被设置了,只有这个属性被设置时此任务才被执行。例如:
演示目标"name="main">.

unless检查某个属性是否被设置了,和if相反,只有在这个属性没有被设置时此任务才被执行。
id用于标示这个任务的id

目标的命名
ant脚本中的命名基本上都是一致的,比如:编译一般叫build或者compile;打包一般叫jarwar生成文档一般命名为javadocjavadocs执行全部任务allusage告诉用户有那些脚本选项可以使用。
3build.xml文件中的任务taskdef
任务可以用来执行一个特定的工作,在Ant中已经实现了很多任务也就是在Ant中定义了大量的
核心Task
当然,Ant也支持用户自己开发任务,只要在使用之前声明这个任务就可以了,例如:

classpathref="path"classname="xdoclet.modules.ejb.EjbDocletTask"name="ejbdoclet"/>
classpathref="path"classname="xdoclet.modules.jboss.net.JBossNetEJBSubTask"name="jbossnet"/>

destDir="src">
includes="**/*.java"/>


destDir="src/META-INF"/>webDeploymentName="Hello"prefix="hello"destdir="build/hello/wsr/META-INF"targetNameSpace="http://com.liuyang.book/hello"/>


4build.xml文件中的属性property
属性标记用来设定工程中的一些全局性的量值,从而在各个JSP页面中封上信息例如:
设置名称为“foo.dist”的属性,其值为“dist
从外部属性文件“foo.properties”中读取属性,而在外部属性文件foo.properties”中包含有如下的属性项目
build.compiler=jikesdeploy.server=luckydeploy.port=8080
deploy.url=http://${deploy.server}:${deploy.port}/


http://www.mysite.com/bla/props/foo.properties中获得属性值
从名称为“foo.properties”的资源中获得属性
定义一个名称为“source”的属性,其值为“src,并将该属性命名为“ref
对名称为“ref”的属性进行引用,并定义为名称为“src”的属性
属性(property)有两种类型:一种是通过name来自定义属性(请见前面的示例),另一种是从
其它资源获取属性(请见下面的示例)


引用了一个外部的task.properties文件
标签中的各个常用的属性的含义
属性名NameValue
描述属性的名称属性的值
Location设置相对于当前的project中的basedir为父目录的子目录路径Refid
对已经定义的其它对象进行引用
Resource属性文件的资源名称Fileurl
属性文件的文件名称
给定所要读出属性的文件的URL
在任务中引用属性的值
采用"${属性名称}"

实例:
src"location="src"/>
build"location="build"/>dist"location="dist"/>
build}"/>
description="compilethesource">
src}"destdir="${build}"/>
5build.xml文件中的路径classpath问题
Ant中可以使用classpath在任务中设置Java的类路径
例如:



target="${javac.target}">



也可以使用path设置全局的路径,然后在其他位置引用例如:




引用前面所定
义的path
target="${javac.target}">
refid="pathID"/>
6)在build.xml文件中常用的一些任务标签

Jar任务:创建*.jar包文件
其中的主要属性
basedir:需要打包的源文件所在的目录
includes:代表所要打包的文件,一般为*或者文件的类型
manifest:指定打包时所需要的manifest文件,可以是manifest的位置设置
示例1
destfile="${dist}/lib/app.jar"basedir="${build}/classes"/>
${build}/classes目录下的文件打包为app.jar,并将目标jar文件放在${dist}/lib目录下
示例2
destfile="${dist}/lib/app.jar"basedir="${build}/classes"excludes="**/Test.class"/>
${build}/classes目录下(但除掉Test.class文件)的文件打包为app.jar并放在${dist}/lib目录示例3
destfile="${dist}/lib/app.jar"basedir="${build}/classes"includes="mypackage/test/**"excludes="**/Test.class"/>
${build}/classes目录下的mypackage/test子目录(但不包括Test.class文件)中的各个文件打包为app.jar并放在${dist}/lib目录下。
示例4

excludes="**/Test.class"/>
打包目录${build}/classes${src}/resources目录内的各个文件(但不包括Test.class文件)为app.jar并放在${dist}/lib目录中

Javac:完成编译任务其中的主要的属性为
srcdir:需要编译的java源文件的目录
destdir:编译后的结果*.class文件的目录定位includes:所要包括的文件名称或者文件类型excludes:不需要包括的文件名称或者文件类型
示例1
destdir="${build}"fork="true"source="1.2"target="1.2"/>编译${src}目录下的所有的*.java文件,并将编译的结果*.class文件放在${build}目录中。
示例2
destdir="${build}"classpath="xyz.jar"debug="on"source="1.4"/>编译${src}目录下的所有的*.java文件,并将编译的结果*.class文件放在${build}目录中,并设置在编译过程中所需要的xyz.jar文件作为所引用的外部jar文件
示例3
destdir="${build}"includes="mypackage/p1/**,mypackage/p2/**"excludes="mypackage/p1/testpackage/**"classpath="xyz.jar"debug="on"/>
编译${src}目录下的mypackage/p1(但不包括其中的mypackage/p1/testpackage目录中的文件)和mypackage/p2子目录中的所有的*.java文件,并将编译的结果*.class文件放在${build}目录中,并设置在

编译过程中所需要的xyz.jar文件作为所引用的外部jar文件。
上面的内容,也可以改写为下面的形式:
destdir="${build}"classpath="xyz.jar"debug="on">


echo:显示输出指定的信息
属性messagefileappendlevel
描述
需要显示的信息
将信息写入文件时的文件名称
有些属性也可以以子标签的形式出现
是否以追加方式写入文件中(取值为true或者false
设置信息的级别,可以是"error","warning","info","verbose","debug"等中一种
示例:
Embedanother:${line.separator}Thisisalongermessagestretchingover
twolines.

Thisisalongermessagestretchingoverthreelines;thefirstlineisablank


Imminentfailureintheantimattercontainmentfacility.Pleasewithdrawtosafelocationatleast50kmaway.
#\!/bin/tcshjava-1.3.1-mx1024m${project.entrypoint}$$*
7)在build.xml文件中与文件相关的操作任务标签
build中用得很多的是文件相关标记,下面举例介绍。filesetfileset用来描述一些文件对象的集合
dir属性:设置fileset的根目录位置;
exclude子标签:设置fileset不包含的文件;include子标签:设置fileset包含的文件。示例







dirsetdirset用来描述一些目录对象的集合
dir属性:设置dirset的根目录位置;
exclude子标签:设置dirset不包含的目录;include子标签:设置dirset包含的目录。示例

dir="${build.dir}">




mkdirmkdir用来创建文件目录,其dir属性则可以设置被创建目录的位置。




copycopy用来实现文件复制的任务
todir属性:设置复制文件的目的位置;
fileset子标签:作为需要被复制的文件集合,在copy中可以放置多个fileset和其它代表文件
对象的标记。
示例


deletedelete用来实现文件删除的任务,其fileset子标签作为需要被删除的文件集合,在delete中可以放置多个fileset和其他代表文件对象的标记。示例


注意:对其它的任务标签可以参考ant的文档帮助


8)目录及其内的子目录和文件的表示形式**/CVS/*
CVS/Repositoryorg/apache/CVS/Entriesorg/apache/jakarta/tools/ant/CVS/Entries
但不匹配如下的foo/bar/目录:org/apache/CVS/foo/bar/Entries
org/apache/jakarta/**匹配如下情况:org/apache/jakarta/tools/ant/docs/index.html
org/apache/jakarta/test.xml但不匹配如下的:org/apache/xyz.java
org/apache/**/CVS/*匹配如下情况:org/apache/CVS/Entriesorg/apache/jakarta/tools/ant/CVS/Entries
但不匹配如下的:org/apache/CVS/foo/bar/Entries**/test/**
匹配目录中包含有test”字符串的各个目录

build.xml中可以不需要XML的文档声明和DTD
6build.xml文件的示例
引用,但如果包含有中文,则需要设置编码格式(缺
1)一个相对比较通用的示例
省为UTF-8


一个简单的build.xml的示例

下面将开始对build.xml内容进行解析"/>


规定后面的DSTAMP
日期格式为中文方式



下面将开始编译Java程序a"/>

下面将开始进行jar包的创建"/>


下面将开始创建JavaDoc文档"/>
windowtitle="本项目中的JavaDoc文档(版本号${project.version}">


下面将开始删除${build}目录"/>实验:
将上面的标签保存为build.xml文件


在该目录(d:\antProject)下建一个src子目录,并在src子目录中放入一些正确的*.java
程序的文件(这些程序代表我们开发的项目中的程序)

启动DOS并进入该目录,输入ant后将出现下面的状态提示

最后产生如下的任务结果


2)对开源的软件进行重构

3)下面给出一个实现打包、发布一个EJBbuild.xml配置文件片断
simpleexamplebuildfile



























7、建立应用工程的目录1)结构调用
Ant中不仅可以使用一个build文件,还支持多个build之间的操作,同一build中的多个任务之间也可以相互调用。
antant可以用来调用其他的build文件,实现了多个子项目一起工作的方式。其中的
antfile指定的外部build文件;
target指定的外部build中的一个任务target的名称。
如:
...

...
antcallantCall可以用来调用其他任务。其中的
target指定的任务名称;param调用时传递的参数。
如:
...



...

sequentialsequential实现了一些任务的顺序处理,在sequential中的任务将被顺序执行。如:
...

...
parallelparallel实现了一些任务的并行处理,在parallel中的任务将被并行执行。如:
...




2)简单的工程中的目录结构
一般要根据工程的实际情况来建立工程的目录结构。但是,有一些比较通用的组织形式可供参考,比如所有的jakarta项目都使用类似的目录结构。下面让我们来看一下这种目录结构的特点。
目录binbuilddistdoc/javadocslibsrc
文件
公共的二进制文件,以及运行脚本临时创建的文件,如类文件等目标输出文件,如生成Jar文件等。文档。
需要导出的Java源文件

3)复杂的项目中的目录结构
如果我们开发的是一个比较复杂的项目,包括多个子项目,并且各个子项目是由不同的开发人员来完成的,那么要如何来设计它的目录结构?
首先有一点是需要确定的,不同的子项目应该拥有不同的Build文件,并且整个项目也应该有一
个总的Build文件。
可以通过Ant任务或是AntCall任务调用子项目的Build文件,如下例:


在各个子项目的耦合不是非常紧密的情况下,各个子项目应该有各自独立的目录结构,也就是说
它们可以有自己的srcdocbuilddist等目录及自己的build.xml文件,但是可以共享libbin目录。
而对于那些耦合紧密的子项目,则推荐使用同一个src目录,但是不同的子项目有不同的子目录,
各个子项目的build.xml文件可以放在根目录下,也可以移到各个子项目的目录下。

本文来源:https://www.2haoxitong.net/k/doc/d40d2f37ee06eff9aef807ce.html

《Java的Build工具Ant.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式