1、 Ant简介:这里引用Ant帮助文档中对Ant的介绍:
Apache Ant是一个基于Java的构建工具。从理论上讲,也是一种类似于Make的工具,只是去除了Make工具的缺点。
既然已经有了make, gnumake, nmake, jam以及其他的构件工具,为什么还要Ant呢?因为Ant的早期开发者发现所有以上这些工具都或多或少的有一些局限性,使得在跨平台开发软件成为困难。类似于Make的工具都是传统的基于Shell的--首先进行依赖性检查,然后执行命令。这意味着你可以轻易的通过使用或者编写程序来扩展这些工具,以满足不同的平台。当然,这也意味着你将局限于特定的平台,至少可以说局限于特定类型的平台,例如:Unix平台。
同时,Make文件也有一些先天的缺陷。好多人都会遇到恐怖的tab问题。Ant的最初开发者多次说“我的命令不能执行因为我在tab前面加了一个空格!”。一些工具如Jam一定程序上解决了这个问题,但仍有其它的格式问题。
Ant与从基于命令的那些扩展开来的那些工具不同,Ant是由java类扩展的。不用编写shell命令,而是配置基于XML的文件,形成多个任务的目标配置树。每一个任务都是通过一个实现了一个规定接口的java类来运行的。
ant缺少了一些直接执行shell命令的能力,如find .
-name foo -exec rm {},但它给用户提供了跨平台的能力,可以在任何地方工作。实际上,Ant也提供了命令execute用来执行shell命令,这就是它的任务,它允许执行基于操作系统的命令。
简单的说,Ant是一个基于Java,并且主要用于Java工程的构建工具。Ant本意是Another Neat Tool,也就是另一种整洁的工具,取首字符就是Ant。
构建工具就是为了减少重复工作而产生的。
2、 Ant的一些核心概念
XML:构建文件是以XML文件来描述的,采用XML格式有很多好处。这里就不一一列举。
陈述式语法:构建文件短小精悍,且易于理解。
每个构建文件包含一个工程(project)。
每个工程包含若干个目标(target)。
目标可以依赖于其他的目标(depends)。
目标包含任务(task)。
易于使用Java语言增加新的任务---易于扩展(自定义)。
3、 Ant中的关键元素介绍
Ant 的构件文件是基于xml编写的,默认名称为 build.xml 。为了更清楚的了解 Ant ,在这里编写一个简单的Ant 程序,用来展现 Ant 的功能,让读者对 Ant 有一个初步的了解。首先在建立一个 build.xml 文件,内容如下:
<? xml version="1.0" ?> < project name ="helloWorld"> < target name ="sayHelloWorld"> < echo message ="Hello,Amigo"/> </ target > </ project >
Build.bat 默认执行build.xml。
下面以项目中的ant脚本为例粗略介绍一下ant脚本的执行情况及结构。脚本如下:
<?xml version="1.0" ?> <project name="TPFBL_build" default="war" basedir="."> <property name="source_src" value="./src" /> <property name="source_conf" value="./conf" /> <property name="source_webroot" value="./WebRoot" /> <property name="source_lib" value="./WebRoot/WEB-INF/lib" /> <property name="source_class" value="./WebRoot/WEB-INF/classes" /> <property name="source_webxml" value="./WebRoot/WEB-INF/web.xml" /> <property name="TPF_jar" value="./WebRoot/WEB-INF/lib/TPF_BaseLine.jar" /> <property name="TPF_war" value="./TPF_BaseLine.war" /> <property name="out_lib" value="./lib" /> <path id="all-libs"> <fileset dir="${source_lib}"> <include name="**/*.jar" /> </fileset> <fileset dir="${out_lib}"> <include name="**/*.jar" /> </fileset> </path> <target name="clean" description="Clean all output dirs (build, etc), and release versions"> </target> <target name="compile" depends="clean"> <javac srcdir="${source_src}" destdir="${source_class}" excludes="junit/**" encoding="utf-8"> <classpath refid="all-libs" /> </javac> <copy todir="${source_class}" overwrite="yes"> <fileset dir="${source_conf}"> </fileset> </copy> </target> <target name="jar" depends="compile"> <jar destfile="${TPF_jar}" update="true" includes="**/*.class" excludes="junit/**" basedir="${source_class}"> <manifest> <attribute name="Built-By" value="huawei" /> </manifest> </jar> </target> <target name="war" depends="jar"> <war warfile="${TPF_war}" basedir="${source_webroot}" excludes="" webxml="${source_webxml}"> <exclude name="WEB-INF/classes/com/**" /> </war> <delete file="${TPF_jar}" /> </target> <target name="usage"> <echo message="" /> <echo message="TPFBL Server build script" /> <echo message="-----------------------------------------" /> <echo message="" /> <echo message="Among the available targets are:" /> <echo message="" /> <echo message="all jars --> create all JAR files" /> <echo message="release_tomcat --> make tomcat war" /> <echo message="" /> <echo message="The base dir is: ${basedir}" /> <echo message="-----------------------------------------" /> <echo message="Java Version: ${ant.java.version}" /> </target> </project>
a) Project元素
project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会发生错误。在每个 project 元素下,可包含多个 target 元素。接下来向读者展示一下 project 元素的各属性。
i. Name属性
用于指定 project 元素的名称。
ii. default属性
用于指定 project 默认执行时所执行的 target 的名称。
iii. basedir属性
用于指定基路径的位置。该属性没有指定时,使用 Ant 的构件文件的附目录作为基准目录。
从上面的脚本我们可以看出default="war",当运行ant命令时若为指明执行的target时默认执行name="war"的target。
此处设定了basedir=".",所以 basedir 属性的值变成了设置的值(当前目录)。若不设置basedir属性,则basedir目录则为build.xml的父目录。
b) Target元素
Ant 的基本执行单元,它可以包含一个或多个具体的任务。多个 target 可以存在相互依赖关系。属性介绍:
i. Name属性
Ant 的基本执行单元,它可以包含一个或多个具体的任务。多个 target 可以存在相互依赖关系。
ii. Depends属性
用于描述 target 之间的依赖关系,若与多个 target 存在依赖关系时,需要以“ , ”间隔。 Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target 。被依赖的 target 会先执行。
iii. If属性
用于验证指定的属性是否存在,若不存在,所在 target 将不会被执行。
iv. Unless属性
该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行
v. description属性
该属性是关于 target 功能的简短描述和说明。
vi.
c) Property元素
该元素可看作参量或者参数的定义, project 的属性可以通过 property 元素来设定,也可在 Ant 之外设定。若要在外部引入某文件,例如 build.properties 文件,可以通过如下内容将其引入: <property file=” build.properties”/> 。
property 元素可用作 task 的属性值。在 task 中是通过将属性名放在“ ${ ”和“ } ”之间,并放在 task 属性值的位置来实现的。
d)
4、 Ant常用任务
在 Ant 工具中每一个任务封装了具体要执行的功能,是 Ant 工具的基本执行单位。
a) copy任务
该任务主要用来对文件和目录的复制功能。现举例如下:
Eg1. 复制单个文件:
<copy file="file.txt" tofile="copy.txt"/>
Eg2. 对文件目录进行复制:
<copy todir="../newdir/dest_dir"> <fileset dir="src_dir" includes="*.jar"/> </copy>
Eg3. 将文件复制到另外的目录:
<copy file="file.txt" todir="../other/dir"/>
b) delete任务
对文件或目录进行删除,举例如下:
Eg1. 删除某个文件:
<delete file="photo/*.jar"/>
Eg2. 删除某个目录:
<delete dir="photo"/>
Eg3. 删除所有的备份目录或空目录:
<delete includeEmptyDirs="true">
<fileset dir="." includes="**/*.bak"/>
</delete>
c) mkdir任务创建某个指定的目录
<mkdir dir="build/classes" />
d) move任务 剪切文件
<move todir="some/new/dir"> <fileset dir="my/src/dir"> <include name="**/*.jar"/> <exclude name="**/ant.jar"> </fileset> </move>
5、 Ant的其他介绍略