ant深入浅出

为了条理地介绍Ant,下面我分几部分来介绍Ant:

1.什么是Ant
Ant 是一种基于java的build工具,理论上来说,有点类似与(liunx)种的make,但是修复了make的缺陷,使build更加好用,更加方便。
这里有必要介绍一下为什么会产生Ant这个工具?
 既然已经有了make,gnumake,nmake,jam和其他的构建工具,为什么还有开发另外一个呢?这时因为那些工具都具有局限性,Ant的原作者(James Duncan Davidson)在开发跨平台软件时,并不能使用其中一个完成所有的任务,这就好像,在英语不是通用语言之前,你去那里,必须搞个翻译似的,降低了开发小绿绿,也急不利于大型软件开发的维护。已有的构建工具都是基于特定平台和听顶语言的,受到操作系统的限制太大。
     更重要的是,makefile有天生的痼疾,任何在liunx下调试过C程序的都碰到过可恶的Tab问题。也许一个多余的空格,就会导致一个build不能运行?你说?这方便吗?
而Ant则在所有构建工具的基于上,开发出来了跨平台,跨语言的构建工具,已成为最优秀的构建工具,几乎所有的IDE都自带了Ant工具。
2.Ant的特点
1》跨平台性,ant是基于java的,而java跨平台的性能是与庸置疑的,ant配置文件是基于XML的,而XML是格式最规范的数据格式。因而Ant跨平台的性能也不言而喻
2》功能强大
从项目的编译,打包,发布,测试到版本的控制,Ant无所不能
3》灵活方便
4》可重用性高
Ant的配置文件Build.xml以一个project为开头,以不同的target为任务模块,彼此之间相互独立,但是模块之间又可以相互联系,因而耦合性和内聚性达到了完美的统一
5》开源的
是一个优秀的开源软件
3》Ant的配置
上边简单介绍了Ant,相信没有用过的,一定很想试试,那我告诉你,如果你试过了,一定会喜欢上她的,
下面介绍一下怎么配置
和JDK配置一下,先到apache主页上下载ant最新版本,具体网址可以google/baidu。
配置大家也可以搜索,很easy的。
4》Ant如何运行呢?
和javac,java一样,直接在cmd下,输入ant就可以了,但是前提必须在该目录中有build.xml。
所以build.xml是最重要的,build.xml里详细地配置了ant如何运行和执行那些功能。
下面是我写的一个build.xml
< project  name ="encrypt"  default ="help"  basedir ="." >
<!--
  All properties should be defined in this section.Any host-specific properties should be defined
  in the build.properties file.
  In this app,the following properties are defined in build.properties:
  1.tomcat.home === the home directory of your Tomcat installation
  2.webapps.home === the place to copy the war file to deploy it.
-->
< property  file ="build.properties" />
< property  name ="app.home"  value ="." />
< property  name ="app.name"  value ="application" />
< property  name ="javadoc.pkg.top"  value ="encrypt" />

< property  name ="src.home"  value ="${app.home}/src" />
< property  name ="lib.home"  value ="${app.home}/lib" />
< property  name ="classes.home"  value ="${app.home}/classes" />
< property  name ="deploy.home"  value ="${app.home}/deploy" />
< property  name ="doc.home"  value ="${app.home}/doc" />
< property  name ="web.home"  value ="${app.home}/WebRoot" />

< property  name ="build.home"  value ="${app.home}/build" />
< property  name ="build.classes"  value ="${build.home}/WEB-INF/classes" />
< property  name ="build.lib"   value ="${build.home}/WEB-INF/lib" />

<!-- Compilatin Classpath-->
  <!--   This section creates the classpath for compilation-->
   < path  id ="compile.classpath" >
  <!-- The lib files for this application-->
   < fileset  dir ="${lib.home}" >
     < include  name ="*.jar" />
     < include  name ="*.zip" />
   </ fileset >
  
  <!-- All files/jars that Tomcat makes available-->
   < fileset  dir ="${tomcat.home}/common/lib" >
     < include  name ="*.jar" />
   </ fileset >
   < pathelement  location ="${tomcat.home}/common/classes" />
   </ path >
<!-- ==========help targe==========-->
  <!-- This is the default ant target executed if no target is specified.
    This helps avoid user just typed 'ant' and runing a default target
    that may not do what they are anticipating
  
-->
   < target  name ="help" >
     < echo message="Please specify a target![usage:ant <targetname >]"/>
     < echo  message ="Here is a list of possible targets:" />
     < echo  message =" clean-all .....Delete all dir,all.class and war files" />
     < echo  message =" prepare .....Create directories if required" />
     < echo  message =" compile .....Compiles source file" />
     < echo  message =" build .....Build war file form.class and other files" />
     < echo  message =" deploy .....Copy war files to the webapps directory" />
     < echo  message =" javadoc .....Generates javadoc for this application" />
   </ target >

<!-- =========="clean-all" target==========-->
   < target  name ="clean" >
     < delete  dir ="${build.home}" />
     < delete  dir ="${classes.home}" />
     < delete  dir ="${deploy.home}" />
    
    <!-- cannot delete directory if tomcat is runing-->
     < delete  dir ="${webapps.home}/${app.home}"  failonerror ="false" />
     < delete  dir ="${webapps.home}/S{app.name}.war" />
    
    <!-- delete javadoc-->
     < delete  dir ="${doc.home}" />
   </ target >
<!-- -==========="prepare" target===========-->
  <!--  This target is executed prior to any of the later targets
     to make sure the directories exist.It only creates them if
     they need to be created...
    Other,similar,preparation steps can be placed here
  
-->
   < target  name ="prepare" >
     < echo  message ="Tomcat Home =${tomcat.home}" />
     < echo message = "webapps Home = ${webapps.home}" />
    
     < mkdir  dir ="${classes.home}" />
     < mkdir  dir ="${deploy.home}" />
     < mkdir  dir ="${doc.home}" />
     < mkdir  dir ="${doc.home}/api" />
    
     < mkdir  dir ="${build.home}" />
     < mkdir  dir ="${build.home}/WEB-INF" />
     < mkdir  dir ="${build.home}/WEB-INF/classes" />
     < mkdir  dir ="${build.home}/WEB-INF/lib" />
   </ target >
  
<!-- =========="compile" target==========-->
  <!-- This only compiles java files that are newer
    than their corresponing.class files
  
-->
   < target  name ="compile" depends  ="prepare" >
     < javac  srcdir ="${src.home}"  destdir ="${classes.home}"  debug ="yes" >
       < classpath refid = "compile.classpath" />
     </ javac >
   </ target >

<!-- ============"build" target=============-->
  <!-- This target builds the war file for the application by
    first building the directory structure of the application
    in ${build.home} and then creating the war file using the
    ant <war> task
  
-->
   < target  name ="build"  depends ="compile" >
    <!-- Copy all the wabapp content(jsp's,html,tld's,xml,etc...-->
     < copy  todir ="${build.home}" >
       < fileset  dir ="${web.home}" />
     </ copy >
    
    <!-- copy all java class files-->
     < copy  todir ="${build.home}/WEB-INF/classes" >
       < fileset  dir ="${classes.home}" />
     </ copy >
    
    <!-- Now, copy all the properties files,etc that go on the classpath-->
     < copy  todir ="${build.home}/WEB-INF/classes" >
       < fileset  dir ="${src.home}" >
         < include  name ="**/*.properties" />
         < include  name ="**/*.prop" />
       </ fileset >
     </ copy >
    
    <!-- Now,copy all the jar files we need-->
     < copy  todir ="${build.home}/WEB-INF/lib" >
       < fileset  dir ="${lib.home}" />
     </ copy >
    
    <!-- create the <war> file-->
     < jar  jarfile ="${deploy.home}/${app.name}.war"  basedir ="${build.home}" />
   </ target >
<!-- ================"deploy" target============-->
  <!--  This target simply copies the war file from the deploy
    directory into the Tomcat webapps directory.
  
-->
   < target  name ="deploy"  depends ="build" >
    
    <!-- copy the contents of the build directory-->
     < copy  todir ="${webapps.home}"  file ="${deploy.home}/${app.name}.war" />
   </ target >

<!-- ================="doc" target=========-->
  <!--  This task create javadoc.It is dependent upon only the 'compile' target
    it is not executed in a normal build.As a result,the target needs to 
    be run on its own.
  
-->
   < target  name ="javadoc"  depends ="compile" >
     < javadoc  sourcepath ="${src.home}"  destdir ="${doc.home}/api"
         packagenames ="${javadoc.pkg.top}.*" />
   </ target >
</ project >
    
下边是build.properties的文件内容:
tomcat.home=F:\\Java\\Tomcat 5.5
webapps.home=F:\\Java\\Tomcat 5.5\\webapps
大家如果仔细看了build.xml,会发现build.xml只有个project,下边会有几个target。确实是这样,每个build.xml只有一个project,属性default必须的。
而每个target执行不同的功能,具体的语法,大家可以看apace ant的介绍。过后我在写。今天就写到这里。只是一点小小的认识,抛砖引玉而已!
O(∩_∩)O


上一篇介绍了一下Ant的产生和特点,在最后给大家看看了build.xml。其实Ant的核心就是build.xm。如何编写适合自己工程的build.xml是最重要的。
1.build.properties
tomcat.home=F:\\Java\\Tomcat 5.5
webapps.home=F:\\Java\\Tomcat 5.5\\webapps
build.properties文件是存储一些公共变量的,比如你机子上tomcat的绝对路径。
其实也用到了面向对象的原理,如果你的环境变了,只需要更改build.properties文件就可以了。而不用去更改build.xm里的相关属性。build.properties也可以加上你想加的东西,比如公共的jar文件。。
2.build.xml
2.1 build.xml的project
project代表一个工程,有4个常见属性:
(1). default 表示默认的运行目标,是必须的
(2). basedir 表示工程的基准目录,"."表示和build.xml所在的目录。
(3). name 表示工程的名字
(4).description 对工程的描述,可写可不写,写上更清楚对以后的debug
下面是build.xml所存放的位置:
这就是basedir="."的原因了
2.2 project 的property
    每个property都有name和value两个属性,name是对该property的声明,而value就是值了!也是为了后边方便而设置的。
2.3 build.xml的target
每个build.xml只有个project,但是可以有多个target(目标).
target 有5个属性:
(1) name 自然是标识了,代表一个特定的target
(2) depends 表示所依赖的target。即执行该target时,必须先执行
depends 后边跟那个target。
比如:
< target  name ="compile" depends  ="prepare" >
         < javac  srcdir ="${src.home}"  destdir ="${classes.home}"  debug ="yes" >
             < classpath refid = "compile.classpath" />
         </ javac >
     </ target >
在执行compile之时,必须先执行prepare。
(3) if 表示仅当属性设置时才执行
(4)unless 表示当属性没有设置时才执行
< target  name ="myTarget"  depends ="myTarget.check"  if ="myTarget.run" >
         < echo >Files foo.txt and bar.txt are present. </ echo >
</ target >

< target  name ="myTarget.check" >
         < condition  property ="myTarget.run" >
                 < and >
                         < available  file ="foo.txt" />
                         < available  file ="bar.txt" />
                 </ and >
         </ condition >
</ target>
Note: If no if an dno unless attribute si prresent, the target will always
be executed.
(5) Description 对target的描述
介绍完target,大家就会对build.xml有了一个更清楚的认识,更深地清楚了build.xml的框架
下面就介绍每个target中可以用那些命令,ant就是依靠这些命令去完成project 构建的。
ant内置任务常用的有7个
1.mkdir----创建目录
2.copy----copy文件
3.delete---delete文件
4.javac----编译java文件
5.war-----打包发布
6.javadoc---javadoc文件
7.move---移动文件
ant还有其他内置的任务,不如zip等等,但是不常用就不介绍了
今天简单介绍一下这7个任务的运用。
1.mkdir---make a new directory
Creates a directory. Also non-existent parent directories are created, when necessary. Does nothing if the directory already exist.
创建一个目录,如果该目录存在,则设么也不做。
Attribute Description Required
dir the directory to create. Yes
Example:
<mkdir dir="${dist}"/>
creates a directory  ${dist}.
<mkdir dir="${dist}/lib"/>
creates a directory  ${dist}/lib.
2.copy--copy文件
Description:copies a file or resource collection to a new file or directory
. By default, files are only copied if the source file is newer than the destinatio
file,or when the destination file does not exist. However, you can explicityly
overwrite files with the overwrite attribute.
copy文件从指定的目录或者文件到目的目录。如果文件没有更新,则不会发生copy。
如果想覆盖,可以通过设置属性才达到覆盖。
Atribution:
(1) file 要copy的文件
(2) preservelastmodified 给出所要copy文件最近修改的时间
默认是false,不常用
(3) tofile copy的文件
(4) todir copy 到那里
(5) overwrite 是否覆盖已经原有的文件加入该文件没有更新,就是和所copy的文件一模一样
default 是false,即不overwrite
(6) filtering 过滤文件
还有几个属性,不常用,就浪费大家时间了。呵呵

你可能感兴趣的:(ant)