Ant介绍 (1.0)

1.什么是Ant

Ant是一种构建工具,设计这个小型的程序的目的在于帮助软件团队开发大型的程序。它可以将所有的繁琐的工作任务自动化完成,包括编译代码,运行测试以及程序打包和重发布。Ant是用Java编写的,其特点是跨平台,易用,可扩展和可伸缩等。它既然可以用于小型的个人项目,也可以用于大型的,多团队协作的软件项目。Ant的目标是,将整个构建过程自动化。

 

2.Ant的核心概念

Ant是基于Java的,它会尽可能地隐藏所有平台细节。另外,Java本身就是高度可扩展的。这就使得我们很容易通过Java代码,Java平台的各种功能以及第三方的库去扩展Ant。同时你可以在Ant自身所在的Java虚拟机内部运行Java程序,这会令构建过程非常迅速。

 

构建文件

Ant使用一个名为构建文件的XML文件来描述如果构建一个项目。在构建文件中,开发这可以列出各种不同的高层构建意图,即目标(target),以及完成每个目标所需的动作,即任务(task)。

一个构建文件中包含一个项目(project)

每个构建文件都描述了如何构建一个项目。非常大的项目可能由多个更小的项目组成,每个小项目都拥有自己的构建文件。高层的构建文件能够协调众多子项目的构建过程。

每个项目中包含多个目标(target)

在构建文件内唯一的项目中,你可以声明多种不同的目标。这些目标既可以表现构建过程中的实际输出,比如可重发布的文件,也可以表现具体的动作,比如编译源代码运行测试。

目标还可以依赖于其他目标

在声明一个目标的同时,你还可以声明哪些目标必须在该目标之前先行构建。这样可以确保测试执行之前,代码已经完成编译;或者应用程序不会被上传,直到测试全部通过。Ant构建项目时,会按照声明中暗示的顺序执行各个目标。

目标中包含任务(task)

在每个目标的内部,你可以声明在这个构建过程阶段,该目标需要完成那些工作。做法就是列出组成这个阶段的每一个任务来。当Ant执行一个目标的时候,它会一个接一个地执行内部的任务。

任务完成具体的工作

Ant任务是XML元素,Ant在运行时会把它转换为动作(action)。任务的背后就是一个Java类,它会完成由任务属性和内部数据共同描述的工作。这些任务都是非常聪明的————它们可以自己执行参数验证,依赖性检查和错误报告等。

通过添加新任务扩展Ant

使用者可以很容易地编写新的类来扩展Ant,这也是Ant的核心优势。通常,总会有人曾经遇到过你正在面对的构建步骤,并且已经写好了相关的任务来执行它。这样你只要享用他们的成果就可以了。否者的话,你可以自己编写Java程序来扩展Ant,创造另一个可重用的Ant任务或者datatype。

总结一下,Ant能够读取包含一个项目(project)的构建文件。在项目中,各个目标描述了项目需要做的不同的事情。目标的内部是任务(target),后者将完成构建过程中的每个独立步骤。Ant按照目标的依赖性声明中暗示的顺序执行各个目标,而任务则包含在其中,一点点地构建应用程序。

 

3.构建文件概念图

 
一个典型的构建过程所用构建文件

<?xml version="1.0"?>
<project name="structured" default="archive">
   <!--创建输出目录-->
   <target name="init">
       <mkdir dir="build/classes" />
	   <mkdir dir="dist" />
   </target>
   
   <!--将编译结果保存在输出目录-->
   <target name="compile" depends="init">
       <javac srcdir="src" destdir="build/classes" />
       <echo>compilation complete!</echo>
    </target>
	
   <!--创建javadoc文档:<javadoc>任务为所有的org.*源代码文件创建javadoc文档-->
   <target name="doc" depends="init">
       <javadoc destdir="build/classes" sourcepath="src" packagenames="org.*" />
    </target>
	
	<!--创建归档文件:archive目标使用<jar>任务创建JAR文件,这个JAR文件包含了build/classes下的所有文件-->
	<target name="package" depends="compile,doc" >
	   <jar destfile="dist/project.jar" basedir="build/classes" />
	</target>
	
	<!--删除输出目录:clean目标通过删除输出目录,完成清理任务。它用到一个新任务<delete>-->
	<target name="clean" depends="init">
	   <delete dir="build" />
	   <delete dir="dist"  />
	</target>
	
	<!--将dist目录下的所有文件上传到ftp服务器上-->
	<target name="deploy" depends="package" >
	   <ftp server="${server.name}" 
	        userid="${ftp.username}"
			password="${ftp.password}" >
		 <fileset dir="dist" />
	   </ftp>
	</target>	
</project>
使用如下命令执行构建:ant -propertyfile ftp.properties
 
由于Ant任务都是Java类,因此调用每个任务的开销非常小。Ant会为每个任务线创建一个Java对象,然后设置它,最后调用它的execute()方法。像<mkdir>这种建档的任务只需要调用一个Java库方法来创建一个目录。像<ftp>这种稍微复杂些的任务需要调用第三方的FTP库来和远程服务器对话,然后可选地执行相关的检查,保证只上传比服务器上更新的文件。
使用如下命令执行构建:ant -propertyfile ftp.properties   由于Ant任务都是Java类,因此调用每个任务的开销非常小。Ant会为每个任务线创建一个Java对象,然后设置它,最后调用它的execute()方法。像<mkdir>这种建档的任务只需要调用一个Java库方法来创建一个目录。像<ftp>这种稍微复杂些的任务需要调用第三方的FTP库来和远程服务器对话,然后可选地执行相关的检查,保证只上传比服务器上更新的文件。

猜你喜欢

转载自weigang-gao.iteye.com/blog/2166719
今日推荐