好看的 ANT小结

来源:互联网 发布:mac网络游戏排行榜 编辑:程序博客网 时间:2024/04/27 08:45

什么是ant(http://mmi.blogbus.com/s1019356/)

 

ANT是一个基于Java的自动化脚本引擎,脚本格式为XML。除了做Java编译相关任务外,ANT还可以通过插件实现很多应用的调用。
1)ANT的基本概念:
2)ANT的安装:解包,设置路径
3)ANT的使用:最好的学习只不过是一个简单实用的例子起步……


ANT的基本概念:Java的Makefile

当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。

每个ant脚本(缺省叫build.xml)中设置了一系列任务(target):比如对于一个一般的项目可能需要有以下任务。

任务1:usage 打印本脚本的帮助信息(缺省)
任务2:clean <-- init 清空初始化环境
任务3:javadoc <-- build <-- init 生成JAVADOC
任务4:jar <-- build <-- init 生成JAR
任务5:all <-- jar + javadoc <-- build <-- init 完成以上所有任务:jar javadoc


而多个任务之间往往又包含了一定了依赖关系:比如把整个应用打包任务(jar)的这个依赖于编译任务(build),而编译任务又依赖于整个环境初始化任务(init)等。

注:我看到很多项目的ant脚本中的命名基本上都是一致的,比如:编译一般叫build或者compile;打包一般叫jar或war;生成文档一般命名为javadoc或javadocs;执行全部任务all。在每个任务的中,ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外部应用种类非常丰富,但其实最常用的就2,3个:比如javac javadoc jar等。

ANT的安装

解包后在系统可执行路径中加入指向ant的bin的路径就可以了,比如可以在GNU/Linux上把以下配置加入/etc/profile中:
export ANT_HOME=/home/ant
export JAVA_HOME=/usr/java/j2sdk1.4.1
export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin

这样执行ant 后,如果不指定配置文件ant会缺省找build.xml这个配置文件,并根据配置文件执行任务,缺省的任务设置可以指向最常用的任务,比如:build,或指向打印帮助信息:usage,告诉用户有那些脚本选项可以使用。

ANT的使用

最好的学习过程就是看懂那些open source项目中的build.xml脚本,然后根据自己的需要简化成一个更简单的,ANT和APACHE上很多非常工程派的项目:简单易用,而且适应性非常强,因为这些项目的建立往往来源于开发人员日常最直接的需求。

ant使用简介


ant 是apache 工程的一个子工程,是一个基于java的build工具。ant类似于make工具,但没有传统的make工具的缺点。传统的make往往只能限制在某一平台上使用,ant本身用java类实现,要构建的工程的配置文件用xml格式描述,可以很方便实现多平台编译,非常适合build大型工程。

1.安装配置ant:
ant 可以从http://ant.apache.org下载,目前最新版本为1.5.2。下载完毕后直接解压缩,目录如下:
ant 
+-- bin // contains launcher scripts
|
+-- lib // contains Ant jars plus necessary dependencies
|
+-- docs // contains documentation
|    +-- ant2 // a brief description of ant2 requirements
|    |
|    +-- images // various logos for html documentation
|    |
|    +-- manual // Ant documentation (a must read )
|
+-- etc 

需要设置的环境变量:
ANT_HOME:ant的安装目录
JAVA_HOME:jdk的安装目录
PATH:把%ANT_HOME%/bin目录加到path变量,以便于从命令行下直接运行ant

假定ant装在c:/ant   jdk装d:/j2sdk1.4.0
则在命令行下执行以下命令:
set ANT_HOME=c:/ant
set JAVA_HOME=D:/j2sdk1.4.0
set PATH=%PATH%;c:/ant/bin

win2000命令提示符下工作时,每次都必须进行上面的设置,退出命令提示符后,这些变量的值又会恢复成原来的样子。为了避免这些麻烦,可以在 控制面板/系统/高级/环境变量 中设置。

上述设置完成后,就可以使用ant了。

2.建立工程描述文件build.xml
用ant编译规模较大的工程非常方便,每个工程都对应一个build.xml文件,这个文件包含与这个工程有关的路径信息和任务。下面是一个build.xml的例子:

<project name="logon" basedir="." default="dist">

<property name="dist.name" value="struts_demo"/>
<property name="src" location="src"/>
<property name="build" location="WEB-INF/classes"/>
<property name="dist" location="D:/tomcat/webapps/dist"/>

<!-- Build working classpath -->
<path id="project.class.path">
<pathelement path ="WEB-INF/lib/struts.jar"/>
<pathelement path ="WEB-INF/classes"/>
<pathelement path ="${classpath}"/>
</path>

<target name="init">
<tstamp/>
<!-- Create the build directory structure used by compile -->
<delete dir="${dist}"/>
</target>

<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${build}">
<classpath refid="project.class.path"/>
</javac> 
</target>

<!-- Build binary distribution -->
<target name="dist" depends="compile"
description="Create binary distribution">
<mkdir dir="${dist}"/>
<war destfile="${dist}/${dist.name}.war"
webxml="WEB-INF/web.xml">
<lib dir="WEB-INF/lib"/>
<classes dir="WEB-INF/classes"/>
<fileset dir="${basedir}"/>
</war>
</target>

</project>

要构建的工程目录如下:
struts_demo
+--jsp
|
+--src
|
+--WEB-INF
|  +--classes
|  |
|  +--lib
|  |
|  +--web.xml
|
+--build.xml

每个build.xml文件都包含一个project和至少一个target。target包含任务元素,任务是一段可执行代码,每个任务元素都有一个id属性,以便于在文件中引用。ant有内置任务集可供使用,如上面文件中用到的property、javac和war,分别完成设置属性、编译和打包任务。当然如果需要的话也可以写自己的任务。

build.xml的根元素是progject,它有三个属性name default basedir,其中default是必需的。name指定工程的名字,basedir表示工程的基路径,设置为"."表示build.xml所在的路径。default表示默认的target,运行ant时如果不指定target,则用default指定的target.

property任务用来设置属性,一个工程可以设置很多属性,属性有名字和值,属性设置后可以在后面引用。

<property name="dist.name" value="struts_demo"/>设置一个名字为dist.name的属性,其值为struts_demo,后面使用时用${dist.name}引用,表示字符串struts_demo.

<property name="src" location="src"/&gt;设置一个名字为src的属性,它的值是一个路径,用location设置。如果location内容以/或/或D:/ C:/之类开始,表示绝对路径,否则表示相对路径,相对于project中设置的basedir.

使用path或classpath可以设置类的路径,后面引用时用id设置的值

构建工程最常用的ant内置任务:
mkdir:    创建目录,dir=要创建的目录
delete:    删除文件文件夹 dir=要删除的文件文件
javac:     编译java文件java文件放在srcdir指定的文件夹中,生成的.class文件按照 package语句组织目录,存放在destdir指定的文件夹中。要注意源文件的目录组织要与package语句相一致
war:        为web应用程序打包,destfile指定打包后生成的文件名,webxml指定所用的web.xml文件。<fileset dir="${basedir}"/>将basedir目录下所有的文件也放在包中


上面的build.xml例子中,target中的属性depends表示在执行本target之前必须要做的target,
例如dist 的depends=compile,意思是在用dist打包之前必须先用compile编译。这样当执行dist时首先执行compile



3.运行ant:
使用ant.bat可以直接运行ant,如果不带任何参数,ant会在当前路径下搜索build.xml文件,如果找到,就运行project的default指定的target.也可以带参数来选择build.xml文件和要运行的target

对于上面的例子,假定build.xml所在的目录为D:/struts_demo/ ,则下面三种执行方式效果是一样的:
    1.   cd d:/struts_demo
         ant
    2.   ant -buildfile d:/struts_demo/build.xml
    3.   ant -buildfile d:/struts_demo/build.xml    dist

如果执行ant -buildfile d:/struts_demo/build.xml  compile,则执行compile target

有关ant使用和build.xml文件内容,在ant的manual中有详细的描述。

 

使用 ANT 开发 Java 程序

常听大家讨论哪个 Java 开发工具比较好,JBuilder,Virtual Cafe ?

今天介绍一个简单易用的 Java 开发,编译,集成,测试工具:Jakarta Ant
他被称为 java 环境里的 make (make 在 C 程序开发里人人皆知)
Java 程序编辑器爱用啥用啥,我喜欢用 UltraEdit。
以 HelloWorld 为例介绍他的使用。


此示例可在此下载:
ftp://cinc.dns2go.com/pub/doc/code/ant/HelloWorld.zip

.下载 ant :(最新版 1.5)
  http://jakarta.apache.org/builds/jakarta-ant/release/v1.5/bin/
  windows 下请下载 zip 文件
  unix 下请下载 tar.gz 文件

.安装 JDK:
 安装到 c:/jdk,并确认能找到 c:/jdk/bin/java

.安装 ant:
 把 ant 解压到本地硬盘 c:/ant,并确认能找到 c:/ant/bin/ant.bat

.设置环境变量:
 JDK_HOME:c:/jdk
 ANT_HOME:c:/ant
 PATH:在原来的 PATH 开头加上 c:/ant/bin;c:/jdk/bin
 注:
   windows 下做操作:我的电脑 -> 属性 -> 高级 -> 环境变量 -> 用户变量
   每次修改完环境变量,要重新打开 MS-DOS 窗口才能生效
 

.开始开发:

一个 ant 项目目录结构:
  c:/HelloWorld :项目主目录
        /src :源程序目录
        /classes :编译后的 class 文件目录
        /lib :开发项目所需要的类库目录,比如开发数据库时所需要的 jdbc lib(这次没用到)
        /jar :打包好的 jar 程序目录(这次没用到)
        /build.xml :项目配置文件
          
1.建立一个项目的主目录
  mkdir c:/Helloworld

2.创建项目配置文件:

c:/HelloWorld/builder.xml
-----------------------------------------------------------------------------
<?xml version="1.0"?>

<project default="build" basedir=".">

    <property name="appname" value="HelloWorld" />
    <property name="base" value="." />
    <property name="src" value="src" />
    <property name="build" value="classes" />
    <property name="myclasspath" value="${build}" />

    <target name="build">
        <mkdir dir="${build}" />
        <javac classpath="${myclasspath}" srcdir="${src}" destdir="${build}">
            <include name="**/*.java" />
        </javac>
    </target>

    <target name="run" depends="build">
        <exec executable="java">
            <arg line=" -classpath ${myclasspath} HelloWorld" />
        </exec>
    </target>

    <target name="clean">
        <delete includeEmptyDirs="true">
            <fileset dir="${build}" />
        </delete>
    </target>

</project>
-----------------------------------------------------------------------------

3.建立源代码目录,所有的 Java 程序放在里面
  mkdir c:/HelloWorld/src

4.创建 HelloWorld.java

c:/HelloWorld/src/HelloWorld.java
-----------------------------------------------------------------------------
/**
 * Demo class for run HelloWorld by ANT
 */
 
public class HelloWorld {
    public static void main(String args[]){
        System.out.println ("Hello World!");
    }
} //EOC
-----------------------------------------------------------------------------

5.编译 HelloWorld
C:/HelloWorld>ant build
Buildfile: build.xml

build:

BUILD SUCCESSFUL
Total time: 2 seconds
说明:
调用 builder.xml 中的 target build
在 c:/HelloWorld/classes 里会出现 HelloWorld.class
此命令会把 src 目录下所有的 java 文件(包括子目录下的)都编译


6.运行 HelloWorld
C:/HelloWorld>ant run
Buildfile: build.xml

build:

run:
     [exec] Hello World!

BUILD SUCCESSFUL
Total time: 2 seconds
调用 builder.xml 中的 target run
注意 target run 后的 depends="build",只有 build 成功后 run 才可以被调用


7.清除 class 文件:
C:/HelloWorld>ant clean
Buildfile: build.xml

clean:
   [delete] Deleting 1 files from C:/Helloworld/classes
   [delete] Deleted 1 directory from C:/Helloworld/classes

BUILD SUCCESSFUL
Total time: 2 seconds

使用 ANT 的好处:
  1.相对于其他项目管理工具,只有一个文本配置文件 build.xml,配置简单
  2.命令简单,一学就会,ant run, ant clean ...
  3.安装简单,占用资源少,只要安装 Jdk, ANT 就可以运行


用 ANT 进行 Java 程序开发,已经成了 Java 界的一个共识。
在此基础上,可以建立更复杂的项目
在以后会继续介绍:
  用 ANT 开发 数据库项目
  用 ANT 开发 WEB 应用
  用 ANT 和 CVS 开发多人项目,并进行项目版本管理。
  
推荐阅读:
  Apache Ant 1.5 Manual
  http://jakarta.apache.org/ant/manual/index.html
  如果有时间,应该阅读,能发现许多 ant 的强大功能。

 

=====================================================

build.xml的配置 

 使用ant发布war包build.xml的配置

<project basedir="." default="usage" name="myceaas">  
 
 
 <target name="init">  
 
 
 
  <property name="Name" value="myceaas" />  
  <property name="name" value="myceaas" />  
  <property name="version" value="0.2" />  
  <property name="year" value="2006" />  
 
 
 
  <echo message="----------- ${Name} ${version} [${year}] ------------" />  
 
 
 
  <property name="debug" value="off" />  
  <property name="optimize" value="on" />  
  <property name="deprecation" value="on" />  
 
 
 
  <!--<property name="mycedatasycn.location" value="D:/project/myce/mycedatasycn" />-->  
 
 
 
<!--   java源文件路径 -->  
 
  <property name="src.dir" value="${basedir}/src" />  
 
 
 
<!--   jar包路径 -->  
  <property name="lib.dir" value="${basedir}/myceaas/WEB-INF/lib" />  
 
 
 
<!--   webapp路径 -->  
  <property name="webapp.dir" value="${basedir}/myceaas" />  
  <property name="packages" value="com.ce.myceaas.*" />  
 
 
 
<!--   准备源文件路径 -->  
  <property name="build.src" value="${basedir}/AntBuild/build" />  
 
 
 
<!--   编译源文件路径 -->  
  <property name="build.dest" value="${basedir}/AntBuild/bin" />  
 
 
 
<!--   准备webapp文件路径 -->  
  <property name="buildwar.dest" value="${basedir}/AntBuild/warsrc" />  
 
 
 
<!--   准备javadoc文件路径 -->  
  <property name="build.javadocs" value="${basedir}/AntBuild/doc" />  
 
 
 
<!--   打包jar文件路径 -->  
  <property name="jar.dest" value="${basedir}/AntBuild/jar" />  
 
 
 
<!--   打包war文件路径 -->  
  <property name="war.dest" value="${basedir}/AntBuild/war" />  
    
  <!--   resin-home路径 -->  
  <property name="resin.home" value="C:/resin-pro-3.0.17"/>  
 
 
 
<!--   tomcat-home路径 -->  
  <property name="tomcat.home" value="C:/tomcat5.5.12"/>    
  <property name="j2eelib.dir" value="C:/Program Files/MyEclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_3.9.210/data/libraryset/1.4" />  
 
 
 
<!--   classpath -->  
  <path id="classpath">  
     
   <fileset dir="${j2eelib.dir}">  
    <include name="**/*.jar"/>  
   </fileset>  
   <fileset dir="${lib.dir}">  
    <include name="**/*.jar"/>  
   </fileset>  
   <!--<pathelement location="lib/"/>-->  
  </path>  
 
 
 
  <filter token="year" value="${year}" />  
  <filter token="version" value="${version}" />  
  <filter token="date" value="${TODAY}" />  
  <filter token="log" value="true" />  
  <filter token="verbose" value="true" />  
 
 
 
 </target>  
 
 
 
  <!-- =================================================================== -->  
 <!-- Help on usage -->  
 <!-- =================================================================== -->  
 <target name="usage" depends="init">  
  <echo message="${Name} Build file" />  
  <echo message="-------------------------------------------------------------" />  
  <echo message="" />  
  <echo message=" available targets are:" />  
  <echo message="" />  
  <echo message=" jar --> generates the ${name}.jar file" />  
  <echo message=" build --> compiles the source code" />  
  <echo message=" javadoc --> generates the API documentation" />  
  <echo message=" clean --> cleans up the directory" />  
  <echo message="" />  
  <echo message=" Please rename build.properties.default to build.properties" />  
  <echo message=" and edit build.properties to specify JSDK 2.3 classpath." />  
  <echo message="" />  
  <echo message=" See the comments inside the build.xml file for more details." />  
  <echo message="-------------------------------------------------------------" />  
  <echo message="" />  
  <echo message="" />  
 </target>  
 
 
 
 <!-- =================================================================== -->  
 <!-- 准备源文件-->  
 <!-- =================================================================== -->  
 <target name="prepare-src" depends="init">  
  <!-- create directories -->  
  <mkdir dir="${build.src}" />  
  <mkdir dir="${build.dest}" />  
  <mkdir dir="${jar.dest}" />  
  <mkdir dir="${war.dest}" />  
  <mkdir dir="${buildwar.dest}" />  
    
    
  <!-- copy src files -->  
  <copy todir="${build.src}">  
   <fileset dir="${src.dir}" />  
  </copy>  
  <copy todir="${buildwar.dest}">  
   <fileset dir="${webapp.dir}" />  
  </copy>  
   
 </target>  
 
 
 
 <!-- =================================================================== -->  
 <!-- 编译源文件-->  
 <!-- =================================================================== -->  
 <target name="build" depends="prepare-src">  
  <javac srcdir="${build.src}" destdir="${buildwar.dest}/WEB-INF/classes" debug="${debug}" optimize="${optimize}">  
   <classpath refid="classpath" />  
  </javac>  
  <copy todir="${buildwar.dest}/WEB-INF/classes">  
   <fileset dir="${build.src}" >  
    <include name="**/*.xml"/>  
   </fileset>  
  </copy>  
 </target>  
 
 
 
 <!-- =================================================================== -->  
 <!-- 打war包-->  
 <!-- =================================================================== -->  
 
 <target name="myceaas.war" depends="build">  
  <war warfile="${war.dest}/myceaas.war" webxml="${buildwar.dest}/WEB-INF/web.xml">  
   <lib dir="${buildwar.dest}/WEB-INF/lib"/>  
   <classes dir = "${buildwar.dest}/WEB-INF/classes"/>  
   <fileset dir="${buildwar.dest}">  
   </fileset>  
  </war>  
   
 </target>  
 
 
 
 <!-- =================================================================== -->  
 <!-- 发布到本的resin和tomcat-->  
 <!-- =================================================================== -->  
 
 <target name="publish" depends="myceaas.war,clean">  
  <copy todir="${resin.home}/webapps">  
   <fileset dir="${war.dest}" >  
    <include name="**/*.war"/>  
   </fileset>  
  </copy>  
  <copy todir="${tomcat.home}/webapps">  
   <fileset dir="${war.dest}" >  
    <include name="**/*.war"/>  
   </fileset>  
  </copy>  
    
 </target>  
 <!--  
 <target name="SyncMain">  
         <java classname="com.ce.synchronization.main.SyncMain" failonerror="true" fork="yes">  
             <classpath refid="classpath"/>  
         </java>  
 </target>  
 -->  
 <!-- =================================================================== -->  
 <!-- 产生javadoc api 文档-->  
 <!-- =================================================================== -->  
 <target name="javadoc" depends="build">  
  <mkdir dir="${build.javadocs}" />  
  <javadoc packagenames="${packages}" sourcepath="${build.src}" destdir="${build.javadocs}" author="true" version="true" use="true" splitindex="true" windowtitle="${Name} API" doctitle="${Name}">  
   <classpath refid="classpath" />  
  </javadoc>  
 </target>   
 <!-- =================================================================== -->  
 <!-- 清除临时文件-->  
 <!-- =================================================================== -->  
 <target name="clean" depends="init">  
  <delete dir="${build.src}"/>  
  <delete dir="${build.dest}/org"/>  
  <delete dir="${build.dest}/com"/>  
  <delete dir="${buildwar.dest}"/>  
  <delete>  
   <fileset dir="${build.dest}" includes="**/*.class"/>  
  </delete>  
 </target>  
 
 
 
</project> 

(2)
.控制台在firsttest目录,输入ant后回车就打包完成了!
  注:输入ant回车自动执行init,compile,dist命令。要想执行clean命令,输入ant clean即可。

<?xml version="1.0" encoding="UTF-8"?>
                                    
<project name="ant_firsttest" default="dist" basedir=".">
  <description>ant firsttest!</description>
                                       
  <!-- set global properties for this build -->
  <!--设定变量,之后用。location为文件夹路径-->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist" location="dist"/>
  <property name="web" location="web"/>
          
  <!--设置properties文件位置.这里没用到。-->
  <!--<property file="nbproject/project.properties"/>-->

  <!--初始化命令-->
  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
               
    <!--mkdir是建立文件夹,${build}即刚才设定的变量。这几行都在干这事。-->
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}/WEB-INF/lib"/>
    <mkdir dir="${build}/WEB-INF/classes"/>
                                         
    <mkdir dir="${build}/WEB-INF/classes/javafile/package1"/>
    <mkdir dir="${build}/WEB-INF/classes/javafile/package2"/>
                                        
  </target>

  <!--编译-->
  <target name="compile" depends="init"
        description="compile the source " >
                                           
    <!-- Compile the java code from ${src} into ${build} -->
    <!--javac标签用来设置编译程序的参数,srcdir为java文件路径,destdir为编译后class文件的保存路径。-->
    <javac srcdir="${src}/javafile/package1" destdir="${build}/WEB-INF/classes/javafile/package1"/>
    <javac srcdir="${src}/javafile/package2" destdir="${build}/WEB-INF/classes/javafile/package2"/>
    <!--如果路径下还有别的文件需要一起打包,用copy 命令。-->
    <copy file="${src}/hello_ant.xml" tofile="${build}/WEB-INF/classes/hello_ant.xml" />
                                       
  </target>
           
  <!--编译后就要打包了。-->
  <target name="dist" depends="compile"
        description="generate the distribution" >
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}"/>
                     
       <!--像jsp,jar这些直接用不用编译的文件,直接用copy命令。-->
    <copy file="${web}/image/a.gif" tofile="${build}/image/a.gif" />
    <copy file="${web}/WEB-INF/web.xml" tofile="${build}/WEB-INF/web.xml" />
    <copy file="${web}/WEB-INF/lib/a.jar" tofile="${build}/WEB-INF/lib/a.jar" />
    <copy file="${web}/index.jsp" tofile="${build}/index.jsp" />
           
    <!--最后用jar命令打成jar/war文件,文件名和后缀随便起。basedir为欲打包的原文件路经-->
    <jar jarfile="${dist}/ant_firsttest.jar" basedir="${build}"/>
  </target>
   
  <!--删除-->
  <target name="clean"
        description="clean up" >
    <!--设定删除命令要删的路径。-->
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>
 

2.用Ant编译Java Web程序

Head First的Servlets&JSP中不提倡刚学写Servlet、JSP时就使用Eclipse、NetBeans那样的集成开发环境,最好在命令行编译。我倒是一直照做的,另外Linux上的命令行用起来也确实很方便。最近接触了一下struts,这才发现在命令行下一个一个地编译文件实在是太痛苦了,但又不想用Eclipse,毕竟还没有工作,还是想尝些新鲜的。所以就想到了Ant。上网看了一堆文章,现学现用,写了一个令自己比较满意的 build.xml。

Ant这个东西很强大。

先看一下项目的目录结构:

source目录里放Java源程序,classes目录里放编译好的class文件。这两个目录里的文件都要按包结构组织好。当然,classes目录也可以不必事先建立,这可以交给Ant去做。以下是我写的build.xml,放在Hello目录下:


 <?xml version="1.0" encoding="UTF-8" ?>
<project name="hello" default="compile" basedir=".">
    <property name="tomcat.lib" value="/home/albert/Applications/apache-tomcat-5.5.26/common/lib" />
    <property name="dest.dir" value="WEB-INF/classes" />
    <property name="src.dir" value="source" />
    <target name="init">
        <mkdir dir="${dest.dir}" />
    </target>
    <target name="compile" depends="init">
        <javac srcdir="${src.dir}" destdir="${dest.dir}">
            <classpath>
                <fileset dir="${tomcat.lib}">
                    <include name="*.jar" />
                </fileset>
                <fileset dir="WEB-INF/lib">
                    <include name="*.jar" />
                </fileset>
            </classpath>
        </javac>
    </target>
    <target name="clean">
        <delete dir="${dest.dir}" />
    </target>
</project>
 

在Ant的构建文件build.xml中,最重要的是target(目标)。一个build.xml往往包含了多个target,定义了一个软件项目的构建过程以及每步之间的依赖关系。例如对于这个项目来说,“编译”必须要在创建完classes目录后才能进行。此外,在进行编译时,ant还会比较源文件和对应的class文件的时间戳,以此来判断源文件在上次编译后是否被更新,是否需要重新编译。知道了这些,就可以大体说下各项的含义了。

最外层的project元素定义了项目的名称(name),默认构建目标(default)和构建的基本目录(basedir,当前目录 “.”)。basedir即设定文件中的相对路径是相对于谁而言的。接下来有一些property元素,你可以把它们当成一些变量的定义,这是为了接下来引用的方便。

然后定义了三个target元素。第一个target的名字是init。名字的作用是:如果你想执行某个target的任务,只需在命令行下执行 ant 即可。如果省略了,ant会执行在project元素中定义的默认目标。在里面用mkdir定义了一个任务,即创建classes目录。这里引用了刚才定义的property,注意引用property的写法:”${dest.dir}”。

第二个是compile目标。depends=”init”说明它依赖于init。即当Ant发现init目录没有完成时(classes目录还没有创建时),Ant会先执行init目标。compile目标里面用javac元素描述了编译任务。srcdir和destdir分别指定了源文件的目录和编译后class文件的目录。尽管因为包结构的原因,source目录下还有子目录,但Ant会把source目录下的所有Java源文件进行编译,并且在classes目录下建立相应的包结构目录,把所有的class文件放在正确的位置上。所有这一切都只是用这两个参数来描述的。再往里是 classpath元素,用来设定编译时的classpath,以便引用servlet-api.jar和struts库里的类。我偷了个懶,把所有的 jar文件都包含进来了。用的是fileset,指定好目录和要包含的文件名(可以有通配符)就行了。

最后一个target clean是清除编译生成的文件,用delete元素来完成。这样当在命令行下执行ant clean后,classes目录就被删除了。

把这个build.xml放在项目目录Hello中,以后只要在Hello目录下执行ant,就会自动把所有需要编译的文件编译好后放在classes目录里了,非常方便。

 

原创粉丝点击