本文摘自:http://www.cnblogs.com/cyjch/archive/2012/03/28/2420761.html、http://www.cnblogs.com/philander/articles/1782254.html
1 下载地址:http://ant.apache.org/
2Ant关键元素(标签)
Ant的构件文件是基于XML编写的,默认名称为build.xml。
2.1 project元素
project元素是Ant构件文件的根元素,Ant构件文件至少应该包含一个project元素,否则会发生错误。在每个project元素下,可包含多个target元素。project元素属性:
1) name属性
用于指定project元素的名称。
2) default属性
用于指定project默认执行时所执行的target的名称。
3) basedir属性
用于指定基路径的位置。该属性没有指定时,使用Ant的构件文件的附目录作为基准目录。
<?xml version="1.0" ?>
<project name ="antPro"default ="getBaseDir" basedir ="C:/ThinkInJavaCode">
<target name="getBaseDir">
<echo message="The basedir is: ${basedir}"/>
</target>
</project>
2.2 target元素
target为Ant的基本执行单元,它可以包含一个或多个具体的任务。多个target 可以存在相互依赖关系。它有如下属性:
1) nam属性
指定 target 元素的名称,这个属性在一个project 元素中是唯一的。我们可以通过指定 target 元素的名称来指定某个 target 。
2) depends属性
用于描述 target 之间的依赖关系,若与多个target 存在依赖关系时,需要以“,”间隔。 Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target 。被依赖的 target 会先执行。
3) if属性
用于验证指定的属性是否存在,若不存在,所在target将不会被执行。
4) unless属性
该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行。
5) description属性
该属性是关于 target功能的简短描述和说明。
举例说明如下:
<?xml version="1.0" ?>
<project name ="targetPro"default="targetB">
<target name="targetA" if="ant.java.version">
<echo message ="Java Version: ${ant.java.version}"/>
</target>
<target name="targetB" depends ="targetA" unless ="philander">
<description>
a depend example!
</description>
<echo message ="The base dir is: ${basedir}"/>
</target>
</project>
从代码中可以看到,我们运行的是名为 targetB 的target ,由于它依赖于targetA ,所以 targetA 将首先被执行,同时因为系统配置了JDK,所以 ant.java.version 属性存在,执行了targetA,输出信息:"[echo] Java Version: 1.6 ",targetA 执行完毕后,接着执行targetB ,因为philander不存在,而unless属性是在不存在时进入所在target 的,由此可知 targetB 得以执行,输出信息:"[echo] The base dir is: C:\ThinkInJavaCode"。
2.3 property元素
property元素可看作参量或者参数的定义,project 的属性可以通过 property 元素来设定,也可在 Ant 之外设定。若要在外部引入某文件,例如 build.properties 文件,可以通过如下内容将其引入:<property file=” build.properties”/>
property 元素可用作 task 的属性值。在 task 中是通过将属性名放在“ ${ ”和“ } ”之间,并放在 task 属性值的位置来实现的。
Ant提供了一些内置的属性,它能得到的系统属性的列表与 Java 文档中 System.getPropertis() 方法得到的属性一致,这些系统属性可参考sun 网站的说明。同时, Ant 还提供了一些它自己的内置属性,如下:
basedir:project 基目录的绝对路径;
ant.file:buildfile的绝对路径,上例中ant.file值为C:\ThinkInJavaCode\build.xml;
ant.version:Ant 的版本信息,本文为1.8.1 ;
ant.project.name:当前指定的project的名字,即前文说到的project的name属性值;
ant.java.version:Ant 检测到的JDK版本,本文为 1.6 。
举例说明如下:
<? xml version="1.0" ?>
<project name ="propertyPro" default ="example">
<property name ="name" value ="philander"/>
<property name="age" value="25"/>
<target name="example">
<echo message ="name:${name}, age: ${age}"/>
</target>
</project>
3 ANT常用命令
3.1copy命令
copy主要用来对文件和目录的复制功能。举例如下:
eg1. 复制单个文件:
<copy file="original.txt"tofile="copied.txt"/>
eg2. 对文件目录进行复制:
<copy todir="../dest_dir">
<fileset dir="src_dir"/>
</copy>
eg3. 将文件复制到另外的目录:
<copy file="source.txt"todir="../home/philander"/>
3.2delete命令
对文件或目录进行删除,举例如下:
eg1. 删除某个文件:
<deletefile="/home/photos/philander.jpg"/>
eg2. 删除某个目录:
<deletedir="/home/photos"/>
eg3. 删除所有的备份目录或空目录:
<deleteincludeEmptyDirs="true">
<fileset dir="." includes="**/*.bak"/>
</delete>
3.3mkdir命令
创建目录。
eg :
<mkdirdir="/home/philander/build/classes"/>
3.4move命令
移动文件或目录,举例如下:
eg1. 移动单个文件:
<move file="sourcefile"tofile=”destfile”/>
eg2. 移动单个文件到另一个目录:
<move file="sourcefile"todir=”movedir”/>
eg3. 移动某个目录到另一个目录:
<move todir="newdir"><fileset dir="olddir"/></move>
3.5echo 命令
该任务的作用是根据日志或监控器的级别输出信息。它包括 message 、 file 、 append 和 level 四个属性,举例如下:
<echo message="Hello,ANT"file="/home/philander/logs/ant.log" append="true">
4 利用ant构建和部署Java项目
Ant可以代替使用 javac 、 java 和 jar 等命令来执行 java 操作,从而达到轻松的构建和部署 Java 项目的目的。
4.1 利用ant的javac命令来编译Java程序
Ant的javac命令用于实现编译Java 程序的功能。
<?xml version="1.0" ?>
<project name ="javacTest"default="compile" basedir=".">
<target name="clean">
<delete dir="${basedir}/build"/>
</target>
<target name="compile" depends ="clean">
<mkdir dir="${basedir}/build/classes"/>
<javac srcdir ="${basedir}/src" destdir="${basedir}/build/classes"/>
</target>
</project>
4.2 使用java命令执行Java程序
Ant中可以使用 java命令实现运行Java程序的功能。
<?xml version="1.0" ?>
<project name ="javacTest"default="run" basedir=".">
<target name="clean">
<delete dir="${basedir}/build"/>
</target>
<target name="compile" depends ="clean">
<mkdir dir ="${basedir}/build/classes"/>
<javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
</target>
<target name="run" depends ="compile">
<java classname ="HelloWorld">
<classpath>
<pathelementpath="${basedir}/build/classes"/>
</classpath>
</java>
</target>
</project>
4.3 使用jar命令生成jar文件
还可以在上例的基础上更进一步,来生成jar包,可在run 这个 target 下再加上如下 target :
<?xml version="1.0" ?>
<project name ="javacTest"default="jar" basedir=".">
<target name="clean">
<delete dir="${basedir}/build"/>
</target>
<target name="compile" depends ="clean">
<mkdir dir ="${basedir}/build/classes"/>
<javac srcdir ="${basedir}/src" destdir="${basedir}/build/classes"/>
</target>
<target name="run" depends="compile">
<java classname ="HelloWorld">
<classpath>
<pathelementpath="${basedir}/build/classes"/>
</classpath>
</java>
</target>
<target name="jar" depends="run">
<jar destfile="helloworld.jar" basedir="${basedir}/build/classes">
<manifest>
<attributename="Main-class" value="HelloWorld"/>
</manifest>
</jar>
</target >
</project>
其中,project的default 属性设置为应设为jar,ant运行完毕后,可看到在项目的根目录下生成了一个 helloworld.jar的jar包。可通过运行以下命令来执行该jar包:
java -jar helloworld.jar
4.4 使用war命令打包JavaEE项目
<?xml version="1.0"encoding="UTF-8" ?>
<project name ="WebTest"default ="war" basedir =".">
<property name="classes" value ="${basedir}/build/classes"/>
<property name="build" value ="${basedir}/build"/>
<property name="lib" value ="${basedir}/WebContent/WEB-INF/lib"/>
<!-- 删除build 路径-->
<target name="clean">
<delete dir ="${build}"/>
</target>
<!-- 建立build/classes 路径,并编译class 文件到build/classes路径下-->
<targetname ="compile" depends="clean">
<mkdir dir ="${classes}"/>
<javac srcdir ="${basedir}/src" destdir ="${classes}"/>
</target>
<!-- 打war 包-->
<targetname ="war" depends ="compile">
<war destfile ="${build}/WebTest.war"
webxml ="${basedir}/WebContent/WEB-INF/web.xml">
<!-- 拷贝WebRoot 下除了WEB-INF 和META-INF 的两个文件夹-->
<fileset dir ="${basedir}/WebContent" includes ="**/*.jsp"/>
<!-- 拷贝lib 目录下的jar 包-->
<lib dir ="${lib}"/>
<!-- 拷贝build/classes下的class 文件-->
<classes dir ="${classes}"/>
</war>
</target>
</project>