Chinaunix首页 | 论坛 | 博客
  • 博客访问: 635620
  • 博文数量: 233
  • 博客积分: 2221
  • 博客等级: 大尉
  • 技术积分: 3184
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-16 14:01
个人简介

瓜瓜派的瓜瓜

文章分类

全部博文(233)

文章存档

2013年(28)

2012年(197)

2011年(8)

分类: IT业界

2012-01-09 17:05:54

好久没有用Ant了,最近让MyEclipse、JBuilder2008逼的重回Ant上了。手生了,写了一个脚本后,重新总结下。参考了官方的文档和网上一些资料。

一、ANT的介绍
Ant的全名是"Another Neat Tool",是由James Duncan Davidson在Make工具无法满足他的需求下所撰写出来的构建(build)工具。

Ant用Java编写,服务于Java。

二、ANT的安装配置
1、获取ANT


2、安装ANT
set ANT_HOME=c:\ant
set JAVA_HOME=c:\jdk-1.5.0.05
set PATH=%PATH%;%ANT_HOME%\bin

三、使用ANT
Ant的build脚本是一个XML文件,称为Buildfile,每个Buildfile包含一个project和若干个target元素,每个target又可以包含若干个task元素,每个task元素可以有一个id属性。当然id属性必须在整个文档中是唯一的。结构如下:


   
      
      
   

   
      
   

  

1、project
有三个属性,这些属性都不是必须的。比如:

属性说明如下:
name:指定项目的名字。
basedir:指定项目根路径,用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果属性和basedir property都没有设定,就使用buildfile文件的父目录。
default:指定当没有指定执行目标时,所要执行的目标。

2、target

一个target可以依赖于其他的target。例如,你可能会有一个target用于编译程序,一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过,所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。

Ant会依照depends属性中target出现的顺序(从左到右)依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。




假定我们要执行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因该有所判断的属性。例如:


如果没有if或unless属性,target总会被执行。

可选的description属性可用来提供关于target的一行描述,这些描述可由-projecthelp命令行选项输出。

target有下面的属性,仅仅name属性是必须的。:
name: target的名字。
depends: 用逗号分隔的target的名字列表,也就是依赖表。
if 执行target所需要设定的属性名。
unless 执行target需要清除设定的属性名。
description 关于target功能的简短描述。

3、task
task不是一个Buildfile的元素,是一个泛称。

一个task是一段可执行的代码。

一个task可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对property的引用。这些引用会在task执行前被解析。

下面是Task的一般构造形式:

这里name是task的名字,attributeN是属性名,valueN是属性值。

有一套内置的(built-in)task,以及一些可选task,但你也可以编写自己的task。

所有的task都有一个task名字属性。Ant用属性值来产生日志信息。

可以给task赋一个id属性:

这里taskname是task的名字,而taskID是这个task的唯一标识符。通过这个标识符,你可以在脚本中引用相应的task。
例如,在脚本中你可以这样:

设定某个task实例的foo属性。
在另一个task中(用java编写),你可以利用下面的语句存取相应的实例。
project.getReference("task1").

注意1:如果task1还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。

注意2:未来的Ant版本可能不会兼容这里所提的属性,因为很有可能根本没有task实例,只有proxies。

4、Properties
一个project可以有很多的properties。可以在buildfile中用property task来设定,或在Ant之外设定。如果是在外部设定的,则可以通过下面的方式来引入properties配置文件。


一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在"${"和"}"之间并放在属性值的位置来实现的。例如如果有一个propertybuilddir的值是"build",这个property就可用于属性值:${builddir}/classes。这个值就可被解析为build/classes。


Ant内置属性

如果你使用了 task 定义了所有的系统属性,Ant允许你使用这些属性。例如,${os.name}对应操作系统的名字。

要想得到系统属性的列表可参考the Javadoc of System.getProperties。

除了Java的系统属性,Ant还定义了一些自己的内置属性: 
basedir project基目录的绝对路径 (与的basedir属性一样)。
ant.file buildfile的绝对路径。
ant.version Ant的版本。
ant.project.name 当前执行的project的名字;由的name属性设定.
ant.java.version Ant检测到的JVM的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".

例子


   
   
   
   

   
        
        
        
        
   


   
        
        
   


   
        
        
        
        
   


   
        
        
        
   




4、PATH和CLASSPATH

你可以用":"和";"作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。

当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是

   
   

location属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径--其他情况下,应该用多个location属性。

为简洁起见,classpath标签支持自己的path和location属性。所以:

   

可以被简写作:

也可通过元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。

   
   
      
   

   

上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着是classes目录。

如果你想在多个task中使用相同的path-like structure,你可以用元素定义他们(与target同级),然后通过id属性引用--参考Referencs例子。

path-like structure可能包括对另一个path-like structurede的引用(通过嵌套元素):

   
   
      
   

   


   
   


前面所提的关于的简洁写法对于也是有效的,如:

   
   

可写成:


5、命令行变量

有些task可接受参数,并将其传递给另一个进程。为了能在变量中包含空格字符,可使用嵌套的arg元素。
Attribute Description Required
value 一个命令行变量;可包含空格字符。 只能用一个
line 空格分隔的命令行变量列表。 
file 作为命令行变量的文件名;会被文件的绝对名替代。 
path 一个作为单个命令行变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。

例子

是一个含有空格的单个的命令行变量。

是两个空格分隔的命令行变量。

是一个命令行变量,其值在DOS系统上为\dir;\dir2;\dir3;在Unix系统上为/dir:/dir2:/dir3 。



6、ID引用

buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块,这一属性就很有用--如多次使用结构。

下面的例子:

        
              
                    
                        
                        
                      
            
    
        
 
   

   
        
            
               
               
               
            

        

   


可以写成如下形式:
 
     
        
           
         
   

   
        
            
        

   

     
        
            
        

   


所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。


四、Ant内置的常用任务

Ant中内置的任务很多很多,要想记住每个任务几乎异想天开,对于开发者来说,我们仅仅需要知道一些常见的任务使用即可。对于不常用的任务,可以在使用的时候直接到[/url]里去查看使用手册。

Ant中的任务可以为3类。
核心任务。核心任务是Ant自带的任务。
可选任务。可选任务实来自第三方的任务,因此需要一个附加的JAR文件。
用户自定义的任务。用户自定义的任务实用户自己开发的任务。


下面是Ant中常用的一些任务用法的简单总结:

1、
创建一个目录,如果他的父目录不存在,也会被同时创建。它有一个属性dir用来指定所创建的目录名,其代码如下:

如果build不存在,也会被同时创建。


2、
删除文件或者目录, 如:

属性如下:
file表示要删除的文件。
dir表示要删除的目录。
includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。
failonerror 表示指定当碰到错误是否停止,默认值是自动停止。
verbose 表示指定是否列出所删除的文件,默认值为不列出。

(1). 删除一个文件

(2). 删除指定目录及其子目录

(3). 删除指定的一组文件

   

(4). 删除指定目录及其子目录,包括他自己

   


3、
该标签用来生成一个jar文件,其属性如下。
destfile 表示jar文件名。
basedir  表示被归档的文件夹。
includes 表示被归档的文件模式。
exchudes 表示被排除的文件模式。
例如:

   
   
   



4、
该标签用于编译一个或一组java文件,其属性如下。
srcdir 表示源文件的目录。
destdir 表示class文件的输出目录。
include 表示被编译的文件的模式。
excludes 表示被排除的文件的模式。
classpath 表示所使用的类路径。
debug 表示包含的调试信息。
optimize 表示是否使用优化。
verbose 表示提供详细的输出信息。
fileonerror 表示当碰到错误就自动停止。

5、
该标签用来执行编译生成的.class文件,其属性如下。
classname 表示将执行的类名。
jar 表示包含该类的JAR文件名。
classpath 所表示用到的类路径。
fork 表示在一个新的虚拟机中运行该类。
failonerror 表示当出现错误时自动停止。
output 表示输出文件。
append 表示追加或者覆盖默认文件。
例如:

   
   
   




6、
该标签用于文件或文件集的拷贝,其属性如下。
file 表示源文件。
tofile 表示目标文件。
todir 表示目标目录。
overwrite 表示指定是否覆盖目标文件,默认值是不覆盖。
includeEmptyDirs 表示制定是否拷贝空目录,默认值为拷贝。
failonerror 表示指定如目标没有发现是否自动停止,默认值是停止。
verbose 表示制定是否显示详细信息,默认值不显示。

(1). 拷贝单个的文件: 

(2). 拷贝单个的文件到指定目录下

(3). 拷贝一个目录到另外一个目录下

   

(4). 拷贝一批文件到指定目录下

   
      
   




   

(5). 拷贝一批文件到指定目录下,将文件名后增加.bak后缀

   
   

(6). 拷贝一组文件到指定目录下,替换其中指定<标签>内容

   
   
      
   



7、
移动或重命名一个(组)文件、目录

(1). 移动或重命名一个文件


(2). 移动或重命名一个文件到另一个文件夹下面


(3). 将一个目录移到另外一个目录下




(4). 将一组文件移动到另外的目录下


  
  



(5). 移动文件过程中增加.bak后缀


  




五、Ant的数据类型
在构建文件中为了标识文件或文件组,经常需要使用数据类型。数据类型包含在org.apache.tool.ant.types包中。下面介绍构建文件中一些常用的数据类型。

1、argument 类型
由Ant构建文件调用的程序,可以通过元素向其传递命令行参数,如apply,exec和java任务均可接受嵌套元素,可以为各自的过程调用指定参数。

以下是的所有属性:
values 是一个命令参数。如果参数种有空格,但又想将它作为单独一个值,则使用此属性。
file 表示一个参数的文件名。在构建文件中,此文件名相对于当前的工作目录。
line 表示用空格分隔的多个参数列表。
path 表示路径。

2、ervironment 类型
由Ant构建文件调用的外部命令或程序,元素制定了哪些环境变量要传递给正在执行的系统命令,

元素可以接受以下属性:
file 表示环境变量值得文件名。此文件名要被转换位一个绝对路径。
path 表示环境变量的路径。Ant会将它转换为一个本地约定。
value 表示环境变量的一个直接变量。
key 表示环境变量名。
注意  file path 或 value只能取一个。

3、filelist类型
filelist是一个支持命名的文件列表的数据类型,包含在一个filelist类型中的文件不一定是存在的文件。

以下是其所有的属性:
dir是用于计算绝对文件名的目录。
files 是用逗号分隔的文件名列表。
refid 是对某处定义的一个的引用。
注意  dir 和 files 都是必要的,除非指定了refid(这种情况下,dir和files都不允许使用)。

4、fileset类型
fileset数据类型定义了一组文件,是一个文件的集合,并通常表示为元素。不过,许多ant任务构建成了隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。

以下为fileset 的属性列表:
dir 表示fileset 的基目录。
casesensitive 的值如果为false,那么匹配文件名时,fileset不是区分大小写的,其默认值为true.
defaultexcludes 用来确定是否使用默认的排除模式,默认为true。
excludes 是用逗号分隔的需要派出的文件模式列表。
excludesfile 表示每行包含一个排除模式的文件的文件名。
includes 是用逗号分隔的,需要包含的文件模式列表。
includesfile 表示每行包括一个包含模式的文件名。

5、patternset类型 
fileset是文件的集合,而patternset是对模式的集合,他们是紧密相关的概念。

支持4个属性:
includes excludex includexfile 和 excludesfile,与fileset相同。
还允许以下嵌套元素:include,exclude,includefile 和 excludesfile。

6、filterset类型
filterset定义了过滤器集合,这些过滤器将在文件移动或复制时完成文件的文本替换。

主要属性如下:
begintoken 表示嵌套过滤器所搜索的记号,这是标识其开始的字符串。
endtoken 表示嵌套过滤器所搜索的记号这是标识其结束的字符串。
id 是过滤器的唯一标志符。
refid 是对构建文件中某处定义一个过滤器的引用。

7、path类型 
path元素用来表示一个类路径,不过它还可以用于表示其他的路径。在用作这个属性时,路经中的各项用分号或冒号隔开。在构建的时候,此分隔符将代替当前平台中所有的路径分隔符。

path拥有的属性如下:
location 表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。
refid 是对当前构建文件中某处定义的一个path的引用。
path 表示一个文件或路径名列表。

8、path与classpath类型
参看第三部分中的介绍。

 
     
     
         
   
 
     
     
         
         
   
 
     


 
 
 
 
 

9、mapper类型
mapper类型定义了一组输入文件和一组输出文件间的关系。

其属性如下。
classname 表示实现mapper类的类名。当内置mapper不满足要求时,用于创建定制mapper.
classpath 表示查找一个定制mapper时所用的类型路径。
classpathref 是对某处定义的一个类路径的引用。
from 属性的含义取决于所用的mapper.
to 属性的含义取决于所用的mapper.
type 属性的取值为identity,flatten glob merge  regexp  其中之一,它定义了要是用的内置mapper的类型。

10、echo
该任务的作用是根据日志或监控器的级别输出信息。
它包括message、file、append和level四个属性,
举例如下:



六、下面是一个Java工程的build文件



   
   
   
   
   
   
   

   
        
        
   


   
        
        
        
   


   
        
            
        

   


   
        
   


   
        
        
        
   


   
        
        
                         author="true"
                 use="true"
                 windowtitle="${project.name} API">
            
            ${project.name}]]>
            Document by Leizhimin 2008.]]>
        

   


   
        
            
            
            
        

   



----完----
阅读(1037) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~