??xml version="1.0" encoding="utf-8" standalone="yes"?> 一Q?span style="font: 7pt &apos">
]]><?xml version="1.0"?>
<project name="javaTest" default="jar" basedir=".">
<target name="clean">
<delete dir="build"/>
</target>
<path id="classpath">
<fileset dir="lib">
<include name="*.jar"/>
</fileset>
</path>
<target name="compile" depends="clean">
<mkdir dir="build/classes"/>
<javac srcdir="src" destdir="build/classes" encoding="UTF-8">
<classpath refid="classpath"/>
</javac>
</target>
<target name="run" depends="compile">
<java classname="Main">
<classpath>
<!--<classpath refid="classpath"/>-->
<pathelement path="build/classes"/>
</classpath>
</java>
</target>
<target name="copyConfig" depends="run">
<copy todir="build/classes">
<fileset dir="src">
<include name="*.png" />
</fileset>
</copy>
</target>
<target name="jar" depends="copyConfig">
<pathconvert property="mf.classpath" pathsep=" ">
<mapper>
<chainedmapper>
<flattenmapper />
<globmapper from="*" to="lib/*" />
</chainedmapper>
</mapper>
<path refid="classpath" />
</pathconvert>
<jar destfile="main.jar" basedir="build/classes">
<manifest>
<attribute name="Main-class" value="Main"/>
<attribute name="Class-Path" value="${mf.classpath} "/>
</manifest>
</jar>
</target>
</project>
]]>
下蝲地址Q?/span>Q,卛_使用?/span>
dpȝ环境变量Q?/span>ANT_HOMEQ该变量指向Ant解压后的根目录,在此?/span>E:"apache-ant-1.7.0?/span>
安装与配|完毕后Q读者可以测试一?/span>Ant是否可用Q首先进?/span>Ant?/span>bin目录Q运行命?/span>ant –versionQ若安装和配|成功,则会(x)昄Ant版本信息Q如下图所C:(x)
׃可以看出Q读者运?/span>Ant的命令时Q需要进入到Ant?/span>bin目录Q如何才能让pȝ自动扑ֈAnt呢?q时需要读者在pȝ环境变量path中添?/span>Ant?/span>bin目录。设|完成后Q我们就可以在Q何目录(例如C:"Documents and Settings"AmigoXie目录Q输?/span>Ant的命令,来获得命令的q行l果?/span>
二. Ant的关键元?/span>
Ant的构件文件是ZXML~写的,默认名称?/span>build.xml。ؓ(f)?jin)更清楚的?jin)?/span>AntQ在q里~写一个简单的AntE序Q用来展?/span>Ant的功能,让读者对Ant有一个初步的?jin)解。首先在E盘(sh)建立一?/span>build.xml文gQ内容如下:(x)
读者可以进?/span>E盘,然后q行ant sayHelloWorldQ可以看到如下的q行l果Q?br />
其中sayHelloWorld为需要执行的d的名U。如果文件名不ؓ(f)build.xmlQ而ؓ(f)hello.xmlӞ读者运行同L(fng)命o(h)Ӟ命o(h)H口?x)出现如下错误?x)
Buildfile: build.xml does not exist!
Build failed
׃面的命o(h)的错误提C可以看出,ant命o(h)默认Lbuild.xml文g。若文g名ؓ(f)hello.xmlӞ读者还需要对命o(h)做少许改变,改ؓ(f)Q?/span>ant –f hello.xml sayHelloWorld?/span>ant –buildfile hello.xml sayHelloWorld?/span>ant –file hello.xml sayHelloWorld?/span>
接下来开始向读者讲解本节的重点Q?/span>Ant的关键元?/span>project?/span>target?/span>property?/span>task?/span>
1. project元素
project元素?/span>Ant构g文g的根元素Q?/span>Ant构g文g臛_应该包含一?/span>project元素Q否则会(x)发生错误。在每个project元素下,可包含多?/span>target元素。接下来向读者展CZ?/span>project元素的各属性?/span>
1Q?/strong>name属?/span>
用于指定project元素的名U?/span>
2Q?/strong>default属?/span>
用于指定project默认执行时所执行?/span>target的名U?/span>
3Q?/strong>basedir属?/span>
用于指定\径的位置。该属性没有指定时Q?/span>Ant的构件文件的附目录作为基准目录?/span>
下面l读者一个简单的例子来展C?/span>project的各元素的用。修?/span>E:"build.xml文gQ修改后的内容如下:(x)
从上面的内容我们可以看出Q在q里定义?/span>default属性的gؓ(f)sayBaseDirQ即当运?/span>ant命o(h)Ӟ若未指明执行?/span>targetӞ默认执行?/span>target?/span>sayBaseDirQ同时还定义?/span>basedir属性的gؓ(f)E:"apache-ant-1.7.0Q进?/span>E盘后q行ant命o(h)Q可看到q行的结果,如下图所C:(x)
因ؓ(f)讑֮?/span>basedir的|所?/span>basedir属性的值变成了(jin)读者设|的倹{读者可以自行将project元素?/span>basedir属性去掉后q行ant看看q行l果Q此?/span>basedir的值变成了(jin)E:"Q即?/span>Ant构g文g的父目录?/span>
有的时候,读者可能有q种需求,x得到某个project下所有的target的名Uͼ读者可以通过?/span>ant命o(h)里加?/span>-proecthelp来达到该目的。例如针对上q的例子我们q行ant –projecthelpQ输出结果如下:(x)
Buildfile: build.xml
Main targets:
Other targets:
sayBaseDir
Default target: sayBaseDir
2. target元素
它ؓ(f)Ant的基本执行单元,它可以包含一个或多个具体的Q务。多?/span>target可以存在怺依赖关系。它有如下属性:(x)
1Q?/strong>name属?/span>
指定target元素的名Uͼq个属性在一?/span>project元素中是唯一的。我们可以通过指定target元素的名U来指定某个target?/span>
2Q?/strong>depends属?/span>
用于描述target之间的依赖关p,若与多个target存在依赖关系Ӟ需要以“,”间隔?/span>Ant?x)依?/span>depends属性中target出现的顺序依ơ执行每?/span>target。被依赖?/span>target?x)先执行?/span>
3Q?/strong>if属?/span>
用于验证指定的属性是否存在,若不存在Q所?/span>target不?x)被执行?/span>
4Q?/strong>unless属?/span>
该属性的功能?/span>if属性的功能正好相反Q它也用于验证指定的属性是否存在,若不存在Q所?/span>target会(x)被执行?/span>
5Q?/strong>description属?/span>
该属性是关于target功能的简短描q和说明?/span>
下面带领读者来看一个各属性综合用的例子。修?/span>E:"build.xml文gQ修改后的内容如下:(x)
q入E盘后q行ant targetBQ可看到如下图所C的q行l果Q?br />
读者分析结果后可以看到Q我们运行的是名?/span>targetB?/span>targetQ因?/span>target依赖?/span>targetAQ所?/span>targetA首先被执行Q同时因为系l安装了(jin)java环境Q所?/span>ant.java.version属性存在,执行?/span>targetAq个targetQ输Z息:(x)[echo] Java Version: 1.5Q?/span>targetA执行完毕后,接着执行targetBQ因?/span>amigo不存在,?/span>unless属性是在不存在时进入所在的target的,由此可知targetB得以执行Q输Z息:(x)The base dir is: E:"?/span>
3. property元素
该元素可看作参量或者参数的定义Q?/span>project的属性可以通过property元素来设定,也可?/span>Ant之外讑֮。若要在外部引入某文Ӟ例如build.properties文gQ可以通过如下内容其引入Q?/span><property file=” build.properties”/>
property元素可用?/span>task的属性倹{在task中是通过属性名攑֜“${”?#8220;}”之间Qƈ攑֜task属性值的位置来实现的?/span>
Ant提供?jin)一些内|的属性,它能得到的系l属性的列表?/span>Java文档?/span>System.getPropertis()Ҏ(gu)得到的属性一_(d)q些pȝ属性可参?/span>sun|站的说明?/span>
同时Q?/span>Antq提供了(jin)一些它自己的内|属性,如下Q?/span>
basedirQ?/span>project基目录的l对路径Q该属性在讲解project元素时有详细说明Q不再赘qͼ
ant.fileQ?/span>buildfile的绝对\径,如上面的各例子中Q?/span>ant.file的gؓ(f)E:"build.xmlQ?/span>
ant.versionQ?/span>Ant的版本,在本文中Qgؓ(f)1.7.0Q?/span>
ant.project.nameQ当前指定的project的名字,卛_文说到的project?/span>name属性的|
ant.java.versionQ?/span>Ant(g)到?/span>JDK的版本,在上例运行结果中可看Cؓ(f)1.5?/span>
下面让读者来看一?/span>property元素使用的简单例子。修?/span>E:"build.xml文gQ内容如下:(x)
该例的运行结果如下图所C:(x)
由此读者可以看出,通过如下两个语句Q?/span>
<property name="name" value="amigo"/>
<property name="age" value="25"/>
我们讄?jin)名?/span>name?/span>age的两个属性,q两个属性设|后Q读者在下文中可以通过${name}?/span>${age}分别取得q两个属性的倹{?/span>
三. Ant的常用Q?/span>
?/span>Ant工具中每一个Q务封装了(jin)具体要执行的功能Q是Ant工具的基本执行单位。在本小节中Q主要引D者来看下Ant的常用Q务及(qing)其用D例?/span>
1. copyd
该Q务主要用来对文g和目录的复制功能。D例如下:(x)
Eg1.复制单个文gQ?/span><copy file="file.txt" tofile="copy.txt"/>
Eg2.Ҏ(gu)件目录进行复Ӟ(x)
<copy todir="../newdir/dest_dir">
<fileset dir="src_dir"/>
</copy>
Eg3. 文件复制到另外的目录:(x)
<copy file="file.txt" todir="../other/dir"/>
2. deleted
Ҏ(gu)件或目录q行删除QD例如下:(x)
Eg1. 删除某个文gQ?/span><delete file="photo/amigo.jpg"/>
Eg2. 删除某个目录Q?/span><delete dir="photo"/>
Eg3. 删除所有的备䆾目录或空目录Q?/span>
<delete includeEmptyDirs="true">
<fileset dir="." includes="**/*.bak"/>
</delete>
3. mkdird
创徏目录?/span>egQ?/span><mkdir dir="build"/>
4. moved
Ud文g或目录,举例如下Q?/span>
Eg1. Ud单个文gQ?/span><move file="fromfile" tofile=”tofile”/>
Eg2. Ud单个文g到另一个目录:(x)<move file="fromfile" todir=”movedir”/>
Eg3. Ud某个目录到另一个目录:(x)
<move todir="newdir">
<fileset dir="olddir"/>
</move>
5. echod
该Q务的作用是根据日志或监控器的U别输出信息。它包括message?/span>file?/span>append?/span>level四个属性,举例如下Q?/span>
<echo message="Hello,Amigo" file="logs/system.log" append="true">
四. 利用Ant构徏和部|?/span>Java工程
Ant可以代替使用javac?/span>java?/span>jar{命令来执行java操作Q从而达到轻杄构徏和部|?/span>Java工程的目的。下面来看几个知识点?/span>
1. 利用Ant?/span>javacd来编?/span>javaE序
Ant?/span>javacd用于实现~译JavaE序的功能。下面来看一个简单的例子Q?/span>
首先我们建立名ؓ(f)antstudy?/span>Java工程Q徏?/span>src目录为源代码目录Q在src目录下徏?/span>HelloWorld.javaq个cL件。该cL件的内容如下Q?/span>
同时?/span>antstudy工程的根目录下徏?/span>build.xml文gQ在该文件中~译src目录下的java文gQƈ编译后?/span>class文g攑օbuild/classes目录中,在编译前Q需清除classes目录Q该文g的内容如下:(x)
q行?/span>build.xml文gQ可在工E中看到新增?/span>build/classes目录Qƈ在该目录中生成了(jin)~译后的HelloWorld.class文g?/span>
2. 使用Ant?/span>javadq行JavaE序
Ant中可以?/span>javad实现q行JavaE序的功能。下面在1的例子中q行如下的修改,修改后的build.xml文g的内容如下:(x)
q行?/span>build.xml文gQ可在控制台看到HelloWorld?/span>mainҎ(gu)的输出?/span>
3. 使用Ant?/span>jard生成jar文g
读者可以在上例的基上更q一步,来生?/span>jar包,可在runq个target下再加上如下targetQ?br /> 此时?/span>ant?/span>project?/span>default属性设|ؓ(f)jarQ同时运行该build.xml文gQ运行完毕后Q可看到在工E目录下生成?jin)一?/span>jar?/span>HelloWorld.jar?/span>
4. 使用Ant?/span>ward打包J2EE Web目
建立一?/span>J2EE Web工程Q其目录l构如下图所C:(x)
其中src为源代码目录Q?/span>WebRoot为各jsp存放目录Q?/span>lib为工E的包目录。在antwebproject工程目录下徏立了(jin)build.xml文gQ该文g工程?/span>Ant构g文g。读者可?/span>src目录下放入在前箋例子中开发的HelloWorld.java文gQƈ?/span>WebRoot下徏?/span>index.jsp文gQ其内容很简单,是输出Hello信息Q代码如下所C:(x) 接下来编?/span>build.xml文gQ其内容如下Q?/span> ?/span>target的作用在内容中已l进行说明,在此不再赘述。运行该build文gQ更新目录后Q可看到?/span>build目录下生成了(jin)antwebproject.war文gQ解开后可看到其目录结构如下:(x)