1、ant简介和环境搭配
ANT是使用最广泛的java项目构建工具,具有跨平台性、易于扩展、简单和快速的特点。它伸缩性好,小到个人项目,大到多团队J2EE项目,在各种规模项目中都能一展身手。并且,最重要的是,它易于掌握。
ANT可以通过其脚本语言,自动将项目文件复制到某个目录、开发项目,或者生成一些代码、执行SQL脚本语言。总之,ANT可以帮助程序员完成项目开发中除了开发代码之外的大部分辅助性的工作。
ANT的优点
(1)语法简单易学,脚本使用XML格式编写;
(2)易于使用,构建过程自动化;
(3)跨平台,java类路径和目录结构都是以可移植的方式进行处理;
(4)速度快,像编译和打包这样的java常规工作都可以在ANT的jvm中进行,节省了启动其他jvm所耗费的时间;
(5)集成JUnit,适合进行XP开发模式所提倡的单元测试;
(6)易于使用java进行功能扩展;
(7)移植J2EE部署;
(8)善于java项目的部署工作;
(9)已经成为大多数开源项目的标准构建工具;
(10)由于ANT支持测试和部署,因此可以用于“编译-测试-部署”的过程。
一般软件产品生产方式
compile--编译,generatedocumentation--产生文档,unite test--单元测试,package--打包,deploy--部署
如何搭建ANT
第一步,搭建好JDK;
第二步,像配置JAVA_HOME环境变量一样配置JAVA_ANT环境变量。
2、ANT常用的cmd命令
ant –diagnostics:显示ant项目的运行环境、依赖库等信息,为错误诊断和报告提供一些有用的帮助信息。
一下的属性都省略前面的ant。
-debug或-d:显示ant执行调试信息、详细的log信息。执行这个命令会运行build.xml文件。
-lib <path>:制定一个类库所在的位置(jar文件位置),让ant工具可以使用这些类文件。Path类型制定类库文件。
-logfile<file>:使用-logfile选项可以使ant输出到一个制定的文件当中,而不是输出到运行ant的终端的标准输出的设备上。这在UNIX系统中进行每日创建的时候是很有用的。-logfile选项还可以和-listener选项、-logger选项一起使用。-listener选项和-logger选项为监视和报告创建的结果提供了更多的动能。
-quiet或-q:隐藏ant执行的提示输出信息。命令行将不会输出具体的target的执行信息。
-verbose或-v:显示ant执行的详细信息,包括操作系统和java环境等信息。
-buildfile <file>:没有指定任何参数时,ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。要想让ant使用其他的buildfile,可以用参数-buildfile file,这里file指定了你想使用的buildfile。
-D<property>=<value>:用于设定一些变量,这些变量可以在target中直接饮用,或覆盖已设定的属性值。
【例子】
xml文件:
<echo>项目构建是由${who}构建的。</echo>
cmd命令:
ant –Dwho=”ANT”
结果:
项目构建是由ANT构建的。
3、ANT常用的系统属性(EL)
使用规则:用${}来获取属性值,例如${os.name}
os.name:操作系统的名称。
basedir:项目引用的根路径。
ant.home:ant工具的根目录位置。
ant.file:构建文件的绝对路径。
ant.version:ant的版本信息。
ant.java.version:ant检测到的jvm版本。
ant.project.name:当前执行的的项目名称及信息。
java.version:java的版本信息。
java.home:java的根目录位置。
java.class.path:java类库的文件位置。
line.separator:换行符。
user.home:用户的home目录,在Linux和UNIX中经常用到。
4、ANT的数据类型和属性
【java】
这个命令就是在ant环境下运行java程序,如下面例子
<!-- ant方式运行java文件 -->
<target name="execute" depends="compile">
<span style="white-space:pre"> </span><!-- classpath指定运行的基文件夹,classname指定运行的文件名 -->
<span style="white-space:pre"> </span><java classname="anttest.Main" classpath="output">
<span style="white-space:pre"> </span><!-- 这个是设置参数 -->
<span style="white-space:pre"> </span><arg value="a" />
<span style="white-space:pre"> </span><arg value="b" />
<span style="white-space:pre"> </span><!-- 声明在调用这个程序之前,ant把file属性解释成一个绝对的构建文件地址 -->
<span style="white-space:pre"> </span><arg file="." />
<span style="white-space:pre"> </span></java>
</target>
【javac】
这个命令就是用来编辑java文件的。
其常用的属性有以下几个:
debug=”yes”(产生所有的调试信息)
debug=”no”(不产生所有的调试信息)
verbose=”true”(输出编译器正在处理的任务)
destdir=”build/classes”(知道把产生的类文件放置到什么地方)
<classpath>
<pathelementlocation=”lib/some.jar”/>
</classpath>
这个是指定去什么地方查找对应的类文件和类库
【classpath】
指定一些文件的路径,比如在编译的时候需要指定的jar包等等。
<classpath>
<pathelementlocation=”lib/some.jar”/>
</classpath>
可以使用path属性代替location,中间用英文分号隔开。
<classpath>
<pathelementpath=”build/classes;lib/some.jar”/>
</classpath>
路径还可以是一个文件集
<classpath>
<fileset dir=”lib”>
<includes=”*.jar”/>
</fileset>
</classpath>
【fileset】
fileset是一个通用的实体,它可以来控制下面的这些任务:编译(compiling),打包(packaging),拷贝(copying),删除(deleting),和文档(documenting)。
实例:
<fileset dir=”src” includes=”**/*.java” id=”source.fileset” />
dir是一个强制的属性,用来指定一个文件集的基文件夹。
include属性显示了基文件夹下的文件如何被包含。
id属性是一个引用,你可以在稍后的过程中,通过引用来使用对应的文件集。
注意:
<fileset dir=”src” includes=”**/*.java” id=”source.fileset” />
可以全写成:
<fileset dir=”src” id=”source.fileset” />
< includes name=”**/*.java”/>
</fileset>
如果写成:
<fileset dir=”src” id=”source.fileset” />
< includes name=”*.java”/>
</fileset>
是默认不会递归遍历基文件夹下的所有内容的。
filest的不包含命令
<fileset dir=”src” id=”source.fileset” />
< excludes name=”**/*.java”/>
</fileset>
默认情况下,inculde和exclude的值是区分大小写的。但是可以通过属性casesensitive=”false”来取消大小写区分。
默认的排除模式(了解)
Pattern | 使用模式来创建和使用这些文件的程序 |
**/* | Idit和其他的一些编辑器会使用这种模式来表示以前的备份版本 |
**/#*# | 编辑器 |
**/.#* | 编辑器 |
**/%*% | 编辑器 |
Etc. |
|
如果要关闭这种包含(默认是自动开启的,不用管)可以使用属性defaultexcludes=”no”来关闭这种自动包含,一般不用去改变。
【copy】
这个命令是完成文件拷贝用的。
<copy todir=”backup”>
<filesetrefid=”source.fileset” />
</copy>
【Filterset】
支持filterset的两个主要任务就是<copy>和<move>
先看一个copy的实例:
<target name=”init” description=”初始化”>
<span style="white-space:pre"> </span><tstamp/>
<span style="white-space:pre"> </span><copy todir=”new_web” overwrite=”true”>
<span style="white-space:pre"> </span><fileset dir=”web”includes=”**/*.jsp”/>
<span style="white-space:pre"> </span><filterset>
<span style="white-space:pre"> </span><filter token=”DATE” value=”${DSTAMP}” />
<span style="white-space:pre"> </span><filter token=”TIME” value=”${TSTAMP}” />
<span style="white-space:pre"> </span></filterset>
<span style="white-space:pre"> </span></copy>
</target>
注意:<tstamp/>任务创建了DSTAMP和TSTAMP这两个ANT 属性。因此,${DSTAMP}和${TSTAMP}各自包含了当前的由<tstamp/>任务产生的日期戳和时间戳。
【mapper】
一致性映射(identitymapper)
用法:
<mapper type=”identity” />
变化表格:
源文件名 | 目标文件名 |
A.java | A.java |
foo/bar/B.java | foo/bar/B.java |
c.properties | c.properties |
class/dir/A.properties | class/dir/A.properties |
注意:默认情况下,<copy>任务使用的是identity映射。
扁平映射(flattenmapper)
用法:
使用这种映射器的时候,目标文件和源文件的名字是一致的,但是会把原来的源文件的文件夹去掉。
<copy>
<filesetdir=”web” includes=”**/*.jsp”>
<mappertype=”flatten” />
</copy>
变化表格:
源文件名 | 目标文件名 |
A.java | A.java |
foo/bar/B.java | B.java |
c.properties | c.properties |
class/dir/A.properties | A.properties |
注意:所有拷贝的文件都必须不能重名。
合并映射(mergemapper)
用法:
<uptpdate property=”zip.notRequired”>
<srcfilesdir=”src” includes=”**/*.java”>
<mappertype=”merge” to=”../distzip/src.zip” />
</ uptpdate >
变化表格:
源文件名 | 目标文件名 |
A.java | archive.zip |
foo/bar/B.java | archive.zip |
c.properties | archive.zip |
class/dir/A.properties | archive.zip |
注意:只有当src.zip文件未过时的时候,zip.notRequired属性才是true。这里的映射到“to”属性是与srcfiles元素中嵌套的“dir”属性相对,而不是相对于基路径的,这个是与普通的相对的是不一样的。
全局映射(globmapper)
用法:
<copy todir=”srcbak”>
<filesetdir=”src” includes=”**/*.java”>
<mappertype=”glob” from=”*.java” to=”*.java.bak” />
</copy>
变化表格:
源文件名 | 目标文件名 |
A.java | A.java.bak |
foo/bar/B.java | foo/bar/B.java.bak |
c.properties | 忽略 |
class/dir/A.properties | 忽略 |
注意:所有的java源文件都被拷贝到了srcbak文件夹下,包含对应的文件夹层次中的也是,所有以.java结尾的文件都会被重命名为.java.bak结尾。
包映射(packagemapper)
用法:
<mapper type=”package” from=”*Test.java”to=”Test-*Test.xml” />
变化表格:
源文件名 | 目标文件名 |
org/apache/tools/ant/util/PackageMapperTest.java | Test-org.apache.tools.ant.util.PackageMapperTest.java |
org/apache/tools/ant/util/Helper.java | 忽略 |
注意:package映射拥有与glob映射同样的语法,它是glob映射到一个子集。它会在查找到的符合源码代码规则的源代码上,把目标分隔符“/”在目标位置替换成“.”。
【property】
<property>任务允许构建文件定制自己的客户化属性。主要有以下几种方式
1、name/value方式
略
2、name/location方式
如果想让build/output被理解为一个绝对路径,应该用name/localtion,切记,name/localtion不能写在属性文件中。
3、通过一个属性文件中导入一组属性,这个文件的名字可能是类似于build.properties
属性文件:build.properties
build.debug=off
build.dir=build
xml文件:
在ant构建文件中使用<property>任务的file属性来加载,但是现在要求build.properties必须以basedir基文件夹为父文件夹
<property file=”build.properties” />
这样就可以用${}来引用属性文件中的属性了。
在这里,我们可以以前缀的方式来区分不同的properties属性文件。
<property file=”build.properties”prefix=”tmp” />
<echo message=”build=${tmp.build.debug}”/>
4、通过加载环境变量作为参数
实例:
<property environment=”env” />
<echo message=”Nunber of Processors =${env.NUMBER_OF_PROCESSORS}” />
<echo message=”ANT_HOME is set to =${env.ANT_HOME}” />
<echo message=”Path is set to =${env.Path}” />
以上是一个Ant构建文件的片段,它执行了以下这些任务:
读取系统的环境变量
把它们保存为属性,以“env”作为前缀
-为了防止与已存在的Ant属性构成冲突
-为了强调这些属性的来源
【available】
<available>是设置只在运行时情况下才可用的一个属性。这个资源可能是:文件或文件夹、文件路径里的类、jvm系统资源。
如果资源存在或可用,属性值默认设置为true;否则的话,属性就会完全不被设置(是一种未定义的状态)。当然,可以用过<available>的value属性来设置它为不同的值,而不是取默认值true。
实例1:
<available classname=”org.example.antbook.lesson” classpath=”dist/project.jar”property=”isAvilable” />
<echo>isAvailable value is ${ isAvilable}<echo/>
当然,属性classpath也可以指向一个文件夹,来判断文件夹是否存在。
这里要注意,<available>可以打破属性的不变性,如果上述isAvilable在<property>标签中设置过值的话,再运行这段代码,以前设置的值就会变为true或是不改变。
实例2:
<target>
<span style="white-space:pre"> </span><propertyname=”project.jar” value=”./dist/mysql.jar” />
<availabletype=”file” file=”${ project.jar }” property=”isAvilable” />
<span style="white-space:pre"> </span><echo>isAvailablevalue is ${ isAvilable }<echo/>
</target>
这里如果在属性中设置的文件mysql.jar存在的话,isAvailable就会被设置为true。
实例3:用来检查jvm系统资源的存在性
<available resource=”project.jar”property=” project_jar”>
<classpath>
<pathelementlocation=”dist” />
<span style="white-space:pre"> </span><classpath/>
<span style="white-space:pre"> </span><echo>resourceproject is present=${project_jar}<echo/>
</available>
实例4:
【condition】
<condition>任务是在某一判断条件为true的时候设置一个属性值,相当于<available><uptodate>的泛化。
<condition>中允许嵌套的条件
元素 | 定义 |
<available> | 与<available>任务的语法完全一致,只不过是属性(property)和值(value)都被忽略了,这些由condition来声明,如果指定的资源存在的话,那么将会返回一个true。 |
<uptodate> | 与<available>任务的语法完全一致,只不过是属性(property)和值(value)都被忽略了,这些由condition来声明,如果所有文件都未过时的话,那么将会返回一个true。 |
<os> | 返回true,如果操作系统家族名(mac,windows,unix等)架构,和版本都与声明的family属性一致的话。 |
<equals> | 返回true如果两个属性值相同的话。 |
<isset> | 返回true,如果给定的属性值整个工程范围内被设置了的话 |
<checksum> | 与<checksum>任务有同样的语法,如果文件的总数与指定的属性相等的话,返回true |
<http> | 检查一个制定的url从对应的web服务器是不是可以得到一个可用的响应。 |
<socket> | 检查在对应的主机端口有一个socket |
<filesmatch> | 文件间的按位比较 |
<contains> | 检查一个字符串是否包含另一个,可以选择是否区分大小写。 |
<istrue> | 如果指定的属性为on,true或yes的话返回true |
<isfalse> | <istrue>的对立面 |
实例:
<condition property=”currentOS”>
<and>
<span style="white-space:pre"> </span><os family=”mac”/>
<span style="white-space:pre"> </span><not>
<span style="white-space:pre"> </span><os family=”unix”/>
<span style="white-space:pre"> </span></not>
<span style="white-space:pre"> </span></and>
</condition>
解释:如果当前操作系统是MacOS,并且不是MacOSI X(Ant 也会把这种操作系统当做是Unix家族的)的话,设置currentOS属性为true。
【从控制台得到属性】
我们知道,在控制台输入 ant –Dname=value,可以给“name”变量的值设置为“value”。
如果属性比较多的话,我们可以将其放在一个.properties文件中。命名为buildproperties
这样我们就可以在控制台用 ant –propertyfile buildProperties.properties命令来用了。
【tstamp】
常用的属性值
属性 | 基于当前日期/时间的值格式 |
DSTAMP | “YYYYMMDD” |
TSTAMP | “HHMM” |
TODAY | “MONYH DAY YEAR” |
<tstamp>任务同样也允许使用任意多个嵌套的<format>元素,
<format property=”…” pattern=””>通过定义一个属性,来制定要实现的格式化规则。
实例:
<tstamp>
<formatproperty=”buildtime” pattern=”yyyy-MM-dd’T’HH:mm:ss” />
<formatproperty=”dayofweek” pattern=”EEEE” />
</tstamp>
【if unless】通过属性控制ant运行
使用if和unless可以控制一个属性存在或是不存在的时候是否去执行。
实例1:
<target name=”build-module-A”if=”module-A-present”>
</target>
<target name=”build-module-B”if=”module-A-present”>
</target>
解释:只有当属性module-A-present存在的时候采取执行任务A,不存在则执行任务B,这里需要注意的是,不是指的module-A-present的值是否为yes或no,而是存在不存在。当然,在运行时,可以通过命令行或者property标签的形式进行赋值,从而达到控制A任务和B任务谁去运行的问题。
实例2:
<project name=”if-unless” default=”all”>
<propertyname=”module-A-present” value=”yes”/>
<echomessage=” module-A-present:${ module-A-present }”/>
<target name=”build-module-A” if=” module-A-present”>
<echomessage=” module-A-running”/>
</target>
<span style="white-space:pre"> </span> <target name=”build-module-B” unless=” module-A-present”>
<echomessage=” module-B-running”/>
</target>
<target name=”all” depends=” module-A-present,module-B-present”>
</target>
</project>
解释:我们可以控制module-A-present是否存在来决定运行哪个任务,但是不管运行哪个任务,all任务是一定不会执行的。
实例3:
<target name=”compile2” depends=”init”>
<javacsrcdir=”src” destdir=”build/classes”/>
<exclude name=”org/example/antbook/edoclet/*.java” if=”omit”/>
</target>
解释:我们可以控制omit来控制是否排除org/example/antbook/edoclet/*.java文件。
【fail】
fail是强制让一个构建过程失败。实例如下
实例:
<target name=”init”>
<condition property=”all.dependedcies.present”>
<and>
<available classname=”org.example.antbook.xdoclet.Main1”classpath=”build.classe”/>
<available classname=”junit.framework.Testcase” />
</and>
</condition>
<echo message=”${ all.dependedcies.present }” />
<fail message=”Messing dependencies!” unless=” all.dependedcies.present” />
</target>
解释:当all.dependedcies.present属性不存在的时候,即availabe里面的文件不可用的时候,这个任务构建失败。
【引用关联】
Ant提供了大量的数据类型,而且还支持数据类型定义的重用。每一个ant数据类型都允许包含一个可选的唯一性标识符,也就是id属性。
因此,我们可以在任何地方通过refid属性来引用这个id,从而实现数据类型的重用。这些数据类型包括 (path,fileset,patternset,filetset,mapper)等。
【uptodate】
如果一个目标文件或者一组目标文件要比一个或一组源文件都要新的话,设置一个属性。当时一个源文件的时候,使用srcfile属性,但是一组源文件的话,可以通过在嵌套包含的<srcfiles>元素中指定。如果使用了嵌套的<mapper>元素的话,还可以指定FileSets
默认情况下,如果要判断的源文件的时间戳不比对应的目标文件的时间戳更近的话,那么property的值被设置为true。当然你也可以通过设置value属性来吧property的值设置为别的。
如果使用了<srcfiles>元素,但是没有指定<mapper>元素的话,那么默认情况下,会使用merge mapper,用它来设置targetfile属性的值。
通常情况下,这个任务用来设置一个属性,通过这个属性,我们可以依赖一个对应的文件的“寿命”,从而避免执行一些目标。
参数设置如下:
属性 | 描述 | 是否必须 |
property | 要设置property的名字 | 必须 |
value | 设置property的值 | 不,默认情况下是true |
srcfile | 用来跟目标文件比较的源文件 | 必须,除非一个嵌套的<srcfiles>或<srcresources>元素被指定 |
targetfile | 用来进行状态决定的文件 | 必须,除非一个<mapper>元素被指定 |
可以作为元素嵌套定义的属性
srcfiles
<srcfiles>元素允许你指定一组文件与对应的目标文件进行对比
注意:你可以指定srcfile属性或者是嵌套的<srcfiles>元素,但是不能同时指定
srcresources
嵌套<srcresources>元素是一个集合,所以你可以通过它指定一个很多资源的集合,与对应的目标文件进行匹配。
mapper
嵌套<mapper>元素允许你指定一组最终要用来进行对比的目标文件
mapper的"to"属性对应的是目标文件,或者使用对应于嵌套的是如此乐山、元素的“dir”属性
实例1:
<uptodate property="xmlBuild.notRequired" targetfile="${deploy}\xmlClasses.jar">
<srcfilesdir="${src}/xml" includes="**/*.dtd" />
</uptodate>
设置属性xmlBuild.notRequired为true,如果${deploy}\xmlClasses.jar文件比${src}/xml目录下的文件要更新的话。
另外写法:
<uptodate property="xmlBuild.notRequired">
<srcfiles dir="${src}/xml" includes="**/*.dtd" />
<mapper type="merge" to="${deploy}\xmlClasses.jar" />
</uptodate>
实例2:
<uptodate property="tests.unnecessary" value="OF COURSE!">
<srcfiles dir="src" includes="**/*.java" />
<mapper type="glob" from="*.java" to="../build/classes/*.class"/>
</uptodate>
这里mapper的“to”属性相对的是srcfiles元素中嵌套的dir元素中嵌套的dir属性的根目录。而不是指向项目的基路径。
实例3:
<target>
<touch file="old.txt" />
<sleep seconds="2" />
<touch file="new.txt" />
</target>
// 这个任务是先创建一个old.txt,过两秒钟以后,再创建一个new.txt文件。
<target name="check.new.newer">
<uptodate targetfile="new.txt" srcfile="old.txt"property="new.newer" />
</target>
<target name="check.new.newer">
<uptodate targetfile="old.txt" srcfile="new.txt"property="old.newer" />
</target>
【其他】
target中一旦加上description这个属性,就说明这个目标是公有的,反之就是私有的。
5、嵌套构建
Ant运行一个构建文件(主控构建)去调用另一个构建(从构建)。
实例:
以下是在当前文件中调用另一个构建文件,并传递一个参数
<ant antfile=”./hellow/some-build.xml”>
<property name=”production” value=”true”/>
</ant>
不指定构建文件的名字,我们可以仅仅指定一个子项目的构建文件
<ant dir=”./hellow” />
这样<ant>就会使用文件夹下默认的构建文件./hellow/build.xml(如果确定存在的话)
我们还可以指定构建文件中要运行哪个目标(当然这个目标所依赖的目标也会运行)
<ant antfile=”./hellow/some-build.xml”target=”run” />
6、实例。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 一个项目,可包含很多任务组(target) -->
<project default="copyFileToSrc" basedir=".">
<property name="project.dir" value="." />
<path id="lib.classpath">
<fileset dir="${project.dir}/WEB-INF/lib" includes="*.jar" />
</path>
<path id="project.classpath">
<pathelement path="${classpath}" />
<path refid="lib.classpath" />
<pathelement path="classes"/>
</path>
<target name="delete_velocity_log">
<delete file="velcoty.log"/>
</target>
<!-- 生成bm RO配置文件 -->
<target name="make_ro_interface_bm" depends="delete_velocity_log">
<!--编译-->
<!-- javac srcdir="src" classpathref="project.classpath" destdir="build/classes"/ -->
<!--运行-->
<java classpathref="project.classpath" classname="com.yh.util.MakeROInterAndUtil">
<arg value="bm" />
<arg value="src\\impl\\com\\tony\\bm\\ro" />
</java>
</target>
<!-- 生成fr RO配置文件 -->
<target name="make_ro_interface_fr" depends="delete_velocity_log">
<!--编译-->
<!-- javac srcdir="src" classpathref="project.classpath" destdir="build/classes"/ -->
<!--运行-->
<java classpathref="project.classpath" classname="com.yh.util.MakeROInterAndUtil">
<arg value="fr" />
<arg value="src\\impl\\com\\tony\\fr\\ro" />
</java>
</target>
<!-- 生成em RO配置文件 -->
<target name="make_ro_interface_em" depends="delete_velocity_log">
<!--编译-->
<!-- javac srcdir="src" classpathref="project.classpath" destdir="build/classes"/ -->
<!--运行-->
<java classpathref="project.classpath" classname="com.yh.util.MakeROInterAndUtil">
<arg value="em" />
<arg value="src\\impl\\com\\tony\\em\\ro" />
</java>
</target>
<!-- 生成TB DAO Util 文件 -->
<target name="make_dao_interface">
<!--编译-->
<!-- javac srcdir="src" classpathref="project.classpath" destdir="classes"/ -->
<!--运行-->
<java classpathref="project.classpath" classname="com.yh.util.MakeDAOInterAndUtil">
<arg value="tb" />
<arg value="src\\impl\\com\\tony\\tb\\dao" />
</java>
</target>
<!-- 编译代码 -->
<target name="compile-src">
<javac srcdir="src/service" destdir="WEB-INF/classes" debug="yes">
<classpath refid="project.classpath" />
</javac>
<javac srcdir="src/impl" destdir="WEB-INF/classes" debug="yes">
<classpath refid="project.classpath" />
</javac>
</target>
<!-- 编译代码 -->
<target name="war">
<war warfile= "ROOT.war" webxml="WEB-INF/web.xml">
<lib dir= "WEB-INF/lib"/>
<classes dir= "WEB-INF/classes/"/>
<fileset dir=".">
<include name="*.jsp" />
<include name="*.html" />
<include name="favicon.ico" />
<include name="web/" />
<include name="table/" />
<include name="WEB-INF/jsp/" />
<include name="WEB-INF/*.*" />
</fileset>
</war>
</target>
</project>
实例2:
<?xml version="1.0"?>
<project>
<description>
这是一个Demo项目
</description>
<property name="builder" value="taobaoge"/>
<echo>项目构建开始了${who}由${builder}执行</echo>
<!-- 通过这个语句进行赋值:ant -Dwho=taobao -->
<target name="init" description="初始化项目">
<mkdir dir="build/classes"/>
<mkdir dir="dist"/>
</target>
<target name="compile" depends="init" description="编译项目">
<javac srcdir="src" destdir="build/classes"/>
</target>
<target name="doc" depends="init" description="文档目标">
<javadoc destdir="build/classes" sourcepath="src"/>
</target>
<target name="deploy" depends="compile,doc" description="部署目标">
<jar destfile="dist/project.jar" basedir="build/classes"/>
</target>
<echo>项目构建结束了</echo>
<!--fileset-->
<!--将文件夹build下的文件及其子文件全都复制到new_build下,如果没有这个文件夹,则建立。-->
<target name="copyto">
<copy todir="new_build">
<fileset dir="build"/>
</copy>
</target>
<!--将文件夹lib下的所有*.jar文件复制到new_build下,但是注意,只是在lib一级目录下的,其子文件夹下的不复制。如果没有这个文件夹,则建立。-->
<target name="copyto2">
<copy todir="new_build2">
<fileset dir="lib">
<include name="*.jar"/>
</fileset>
</copy>
</target>
<!--将文件夹lib下的所有*.jar文件复制到new_build下,但是注意,所有lib目录下的包括其子文件夹下全部复制。如果没有这个文件夹,则建立。-->
<target name="copyto3">
<copy todir="new_build3">
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
</copy>
</target>
<!--将文件夹lib下的除了*.txt文件复制到new_build下,但是注意,是所有lib目录下的包括其子文件夹下的。-->
<target name="copyto3">
<copy todir="new_build3">
<fileset dir="lib">
<exclude name="**/*.txt"/>
</fileset>
</copy>
</target>
</project>