ant使用指南
2017-08-28 18:15
411 查看
一、概述
ant是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。在实际软件开发中,有很多地方可以用到ant。
开发环境:
System:Windows
JDK:1.6+
IDE:eclipse
ant:1.9.1
Email:hoojo_@126.com
Blog:http://blog.csdn.net/IBM_hoojo
http://hoojo.cnblogs.com/
二、优点
ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点:
1、跨平台性:Ant是纯Java语言编写的,所以具有很好的跨平台性。
2、操作简单:Ant是由一个内置任务和可选任务组成的,用ant任务就像是在dos中写命令行一样。Ant运行时需要一个XML文件(构建文件)。Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。
3、维护简单、可读性好、集成简单:由于Ant构建文件时XML格式的文件,所以很容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
三、安装和配置
1、下载ant,http://mirror.esocc.com/apache//ant/binaries/apache-ant-1.9.1-bin.zip
2、解压zip压缩包,将压缩包放置你要放置的目录。我这里放置在D:\apache-ant-1.9.1,目录结构如下:
bin是ant的程序运行入口,如果没有配置ANT_HOME的情况下,可以通过bin目录中的bat程序进行运行build任务。
如:在cmd中运行ant.bat就可以执行程序,当然你选择要当前目录中存在一个build.xml(build.xml是默认的ant执行文件,当然你可以指定其他文件)
4000
.com/blog/151517/201306/14125552-c20237daedfe41cca1002b7bb12ebd9e.png"border="0">
etc目录中存放的都是一些xsl的输出模板,创建一个加强的导出各种任务的XML输出,使你的build文件摆脱过时的警告
lib目录中存放的是ant程序需要依赖的jar包
manual目录是ant程序的帮助文档
3、在我的电脑–>右键属性–>高级系统配置->环境变量中配置ant
新建系统变量ANT_HOME=D:\apache-ant-1.9.1
这样环境变量就配置好了,但前提你需要配置jdk的环境变量。如果你没有配置jdk的环境变量,那么请你先配置好jdk变量。jdk环境配置方法如下:
(1),安装JDk到其默认目录:C:\ProgramFiles\Java\jdk1.5.0_05(没有jdk去官方下载一个)
C:\ProgramFiles\Java\jdk1.5.0
作用:告诉系统JVM在什么地方
(2),右击我的电脑,选属性,高级,环境变量
(3),在系统变量栏点新建,出现新建系统变量对话框,在变量名中填上JAVA_HOME,变量值:C:\ProgramFiles\Java\jdk1.5.0_05
(4),确定后在系统变量(S)栏再新建一个环境变量CLASSPATH,变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(开头的dot和;不能少)
(5),确定后在系统变量(S)栏查找并选中变量为Path的选项,点编辑在变量值(V)的末尾添加:
%JAVA_HOME%\bin
如果没有找到PATH变量,自己新建一个!
如果你不想每次运行都要cmd到class所在目录然后执行java命令,可以把所有的class文件放到统一的目录组织下,然后将此目录也追加到CLASSPATH下。
测试代码如下:
publicclassTest{
publicstaticvoidmain(String[]args){
System.out.println("HelloWorld!");
}
}
用记事本编辑后存为Test.java(文件名与类名相同)文件,打开命令行窗口,
cd到文件所在目录下:
javacTest.java//编译命令
javaTest//执行程序
如果输出为:HelloWorld!OK,配置完毕,否则,重新检查。
四、测试ant
在启动,运行cmd的dos窗口中输入ant,如图:
如果出现这个,那么恭喜你安装成功了!否则就失败了,检查下前面的步骤有没有错误。上面命令会执行ant程序,ant默认执行build.xml中的任务,这里在Administrator目录中没有这个文件。
如果安装失败,你看看是否存在一些情况:
1、没有配置JAVA_HOME或配置错误,并且JAVA_HOME\bin\java.exe存在
2、没有配置ANT_HOEM或配置错误,并且ANT_HOME\bin\ant.bat存在
3、检查你的环境变量的path变量中,有木有配置...;%ANT_HOME%\bin;...
%PATH%=...maybe-other-entries...;%ANT_HOME%\bin;...maybe-other-entries...
五、ant的运行时环境
ant在运行命令的时候,有时候会出现一些公园的jar库。这些库会存在于每个ant工程中,那么这个时候我们可以把这个jar包放到ant_home\lib目录中作为全局的库使用。
如果你不想“污染”原始的ant程序,那么你可以把jar包放在当前windows用户的目录下,具体位置应该是${user.home}/.ant/lib下。没有以上目录可以手动建立。
如果你只是临时要添加lib,又不想把lib添加到当前ant工程中。你可以在运行ant程序的时候指定依赖的lib参数。
同时,你还可以在当前build工程的classpath目录中添加你的工程依赖jar包。
六、ant命令
语法元素说明如下:
-help
显示描述ant命令及其选项的帮助信息
-projecthelp
显示包含在构建文件中的、所有用户编写的帮助文档。即为各个<target>中description属性的文本,以及包含在<description>元素中的任何文本。将有description属性的目标列为主目标(Maintarget),没有此属性的目标则列为子目标(Subtarget)。
-version
要求ant显示其版本信息,然后退出。
-quiet
抑制并非由构建文件中的echo任务所产生的大多数消息。
-verbose
显示构建过程中每个操作的详细消息。此选项与-debug选项只能选其一。
-debug
显示Ant和任务开发人员已经标志为调试消息的消息。此选项与-verbose只能选其一。
-emacs
对日志消息进行格式化,使它们能够很容易地由Emacs的shell模式(shellmode)所解析;也就是说,打印任务事件,但并不缩排,在其之前也没有[taskname]。
-logfilefilename
将日志输出重定向到指定文件。
-loggerclassname
指定一个类来处理Ant的日志记录。所指定的类必须实现了org.apache.tools.ant.BuildLogger接口。
-listenerclassname
为Ant声明一个监听类,并增加到其监听者列表中。在Ant与IDE或其他Java程序集成时,此选项非常有用。可以阅读第六章以了解有关监听者的更多信息。必须将所指定的监听类编写为可以处理Ant的构建消息接发。
-buildfilefilename
指定Ant需要处理的构建文件。默认的构建文件为build.xml。
-Dproperty=value
在命令行上定义一个特性名-值对。
-findfilename
指定Ant应当处理的构建文件。与-buildfile选项不同,如果所指定文件在当前目录中未找到,-find就要求Ant在其父目录中再进行搜索。这种搜索会继续在其祖先目录中进行,直至达到文件系统的根为止,在此如果文件还未找到,则构建失败。
-atuoproxyjdk1.5以上的可以使用代理设置
-nouserlib运行ant时不使用用户lib中的jar包
-nice设计主线程优先级
-logfile使用指定的log日志
-noinput不允许交互输入
-keep-going,-k执行不依赖于所有目标
-propertyfile加载所有属性配置文件-d属性文件优先
注意:
●所有构建文件都要有<project>元素,而且至少有一个<target>元素。
●对于<project>元素的default属性并不一定需要默认值。
●构建文件并不一定要被命名为build.xml。不过build.xml是ant要搜索的默认文件名。
●每个构建文件只能有一个<project>元素。
在cmd窗口中进入到当前build.xml目录
ant
在当前目录下的build.xml运行Ant,执行缺省的target。
ant-buildfilebuild-test.xml
在当前目录下的build-test.xml运行Ant,执行缺省的target。
ant-buildfilebuild-test.xmlclean
在当前目录下的build-test.xml运行Ant,执行一个叫做clean的target。
ant-buildfilebuild-test.xml-Dbuild=build/classesclean
在当前目录下的build-test.xml运行Ant,执行一个叫做clean的target,并设定build属性的值为build/classes。
七、ant脚本:使用节点、元素和属性、命令指令
1、project节点元素
project元素是Ant构件文件的根元素,Ant构件文件至少应该包含一个project元素,否则会发生错误。在每个project元素下,可包含多个target元素。接下来向读者展示一下project元素的各属性。
●name属性:用于指定project元素的名称。
●default属性:用于指定project默认执行时所执行的target的名称。
●basedir属性:用于指定基路径的位置。该属性没有指定时,使用Ant的构件文件的附目录作为基准目录。
从上例可以看出,在这里定义了default属性的值为print-dir,即当运行ant命令时,如果没有指明执行的target,则将执行默认的target(print-dir)。此外,还定义了basedir属性的值为“.”,.表示当前目录,进入当前目录后运行ant命令,得一下结果:
2、target节点元素
target为ant的基本执行单元或是任务,它可以包含一个或多个具体的单元/任务。多个target可以存在相互依赖关系。它有如下属性:
●name属性:指定target元素的名称,这个属性在一个project元素中是唯一的。我们可以通过指定target元素的名称来指定某个target。
●depends属性:用于描述target之间的依赖关系,若与多个target存在依赖关系时,需要以“,”间隔。Ant会依照depends属性中target出现的顺序依次执行每个target,被依赖的target会先执行。
●if属性:用于验证指定的属性是存在,若不存在,所在target将不会被执行。
●unless属性:该属性的功能与if属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在target将会被执行。
●description属性:该属性是关于target功能的简短描述和说明。
示例:
从以下结果后可以看到,我们运行的是名为print的target,由于它依赖于version这个target任务,所以version将首先被执行,同时因为系统配置了JDK,所以ant.java.version属性存在,执行了version,输出信息:"[echo]JavaVersion:1.6",version执行完毕后,接着执行print,因为docs不存在,而unless属性是在不存在时进入所在target
的,由此可知print得以执行,输出信息:"[echo]Thebasediris:D:\Workspace\AntExample\build"。
3、property属性节点元素
property元素可看作参量或者参数的定义,project的属性可以通过property元素来设定,也可在Ant之外设定。若要在外部引入某文件,例如build.properties文件,可以通过如下内容将其引:
<propertyfile="build.properties"/>
property元素可用作task的属性值。在task中是通过将属性名放在${属性名}之间,并放在task属性值的位置来实现的。
Ant提供了一些内置的属性,它能得到的系统属性的列表与Java文档中System.getProperties()方法得到的属性一致,这些系统属性可参考sun网站的说明。同时,Ant还提供了一些它自己的内置属性,如下:
basedir:project基目录的绝对路径;
ant.file:buildfile的绝对路径,上例中ant.file值为D:\Workspace\AntExample\build;
ant.version:Ant的版本信息,本文为1.8.1;
ant.project.name:当前指定的project的名字,即前文说到的project的name属性值;
ant.java.version:Ant检测到的JDK版本,本文为1.6。
举例说明如下:
上例中用户设置了名为name和age的两个属性,这两个属性设置后,在下文中可以通过${name}和${age}分别取得这两个属性值。
4、copy命令
copy主要用来对文件和目录的复制功能。举例如下:
●复制单个文件:
<copyfile="old.txt"tofile="new.txt"/>
●对文件目录进行复制:
<copytodir="../dest_dir">
<filesetdir="src_dir"/>
</copy>
●将文件复制到另外的目录:
<copyfile="src.txt"todir="c:/base"/>
5、delete命令
对文件或目录进行删除,举例如下:
●删除某个文件:
<deletefile="/res/image/cat.jpg"/>
●删除某个目录:
<deletedir="/res/image"/>
●删除所有的jar文件或空目录:
<deleteincludeEmptyDirs="true">
<filesetdir="."includes="**/*.jar"/>
</delete>
6、mkdir命令
创建目录。
<mkdirdir="/home/philander/build/classes"/>
7、move命令
移动文件或目录,举例如下:
●移动单个文件:
<movefile="sourcefile"tofile=”destfile”/>
●移动单个文件到另一个目录:
<movefile="sourcefile"todir=”movedir”/>
●移动某个目录到另一个目录:
<movetodir="newdir">
<filesetdir="olddir"/>
</move>
8、echo命令
该任务的作用是根据日志或监控器的级别输出信息。它包括message、file、append和level四个属性,举例如下
<echomessage="antmessage"file="/logs/ant.log"append="true">
9、jar标签节点元素
该标签用来生成一个JAR文件,其属性如下。
●destfile表示JAR文件名。
●basedir表示被归档的文件名。
●includes表示别归档的文件模式。
●exchudes表示被排除的文件模式。
●compress表示是否压缩。
示例:
上面的mainfest是jar包中的MEAT-INF中的MANIFEST.MF中的文件内容
同样打包操作的的还有war、tgz,已经解压操作uzip
10、javac标签节点元素
该标签用于编译一个或一组java文件,其属性如下。
●srcdir表示源程序的目录。
●destdir表示class文件的输出目录。
●include表示被编译的文件的模式。
●excludes表示被排除的文件的模式。
●classpath表示所使用的类路径。
●debug表示包含的调试信息。
●optimize表示是否使用优化。
●verbose表示提供详细的输出信息。
●fileonerror表示当碰到错误就自动停止。
示例
11、java标签节点元素
该标签用来执行编译生成的.class文件,其属性如下。
●classname表示将执行的类名。
●jar表示包含该类的JAR文件名。
●classpath所表示用到的类路径。
●fork表示在一个新的虚拟机中运行该类。
●failonerror表示当出现错误时自动停止。
●output表示输出文件。
●append表示追加或者覆盖默认文件。
示例
12、arg数据参数元素
由Ant构建文件调用的程序,可以通过<arg>元素向其传递命令行参数,如apply,exec和java任务均可接受嵌套<arg>元素,可以为各自的过程调用指定参数。以下是<arg>的所有属性。
●values是一个命令参数。如果参数中有空格,但又想将它作为单独一个值,则使用此属性。
●file表示一个参数的文件名。在构建文件中,此文件名相对于当前的工作目录。
●line表示用空格分隔的多个参数列表。
●表示路径,一个作为单个命令行变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。
●pathref引用的path(使用path元素节点定义path)的id
●prefix前缀
●suffix后缀
例子
<argvalue="-l-a"/>
是一个含有空格的单个的命令行变量。
<argline="-l-a"/>
是两个空格分隔的命令行变量。
<argpath="/dir;/dir2:\dir3"/>
是一个命令行变量,其值在DOS系统上为\dir;\dir2;\dir3;在Unix系统上为/dir:/dir2:/dir3。
13、ervironment类型
由Ant构建文件调用的外部命令或程序,<env>元素制定了哪些环境变量要传递给正在执行的系统命令,<env>元素可以接受以下属性。
●file表示环境变量值的文件名。此文件名要被转换位一个绝对路径。
●path表示环境变量的路径。Ant会将它转换为一个本地约定。
●value表示环境变量的一个直接变量。
●key表示环境变量名。
注意filepath或value只能取一个。
14、filelist文件集合列表
filelist是一个支持命名的文件列表的数据类型,包含在一个filelist类型中的文件不一定是存在的文件。以下是其所有的属性。
●dir是用于计算绝对文件名的目录。
●files是用逗号分隔的文件名列表。
●refid是对某处定义的一个<filelist>的引用。
注意dir和files都是必要的,除非指定了refid(这种情况下,dir和files都不允许使用)。
示例
15、fileset文件类型
fileset数据类型定义了一组文件,并通常表示为<fileset>元素。不过,许多ant任务构建成了隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。以下为fileset的属性列表。
●dir表示fileset的基目录。
●casesensitive的值如果为false,那么匹配文件名时,fileset不是区分大小写的,其默认值为true.
●defaultexcludes用来确定是否使用默认的排除模式,默认为true。
●excludes是用逗号分隔的需要派出的文件模式列表。
●excludesfile表示每行包含一个排除模式的文件的文件名。
●includes是用逗号分隔的,需要包含的文件模式列表。
●includesfile表示每行包括一个包含模式的文件名。
示例
16、patternset类型
fileset是对文件的分组,而patternset是对模式的分组,他们是紧密相关的概念。
<patternset>支持4个属性:includes、excludex、includexfile、excludesfile,这些与fileset相同。
patternset还允许以下嵌套元素:include,exclude,includefile和excludesfile.
示例
17、filterset类型
filterset定义了一组过滤器,这些过滤器将在文件移动或复制时完成文件的文本替换。
主要属性如下:
●begintoken表示嵌套过滤器所搜索的记号,这是标识其开始的字符串。
●endtoken表示嵌套过滤器所搜索的记号这是标识其结束的字符串。
●id是过滤器的唯一标志符。
●refid是对构建文件中某处定义一个过滤器的引用。
示例
18、path类型
path元素用来表示一个类路径,不过它还可以用于表示其他的路径。在用作几个属性时,路经中的各项用分号或冒号隔开。在构建的时候,此分隔符将代替当前平台中所有的路径分隔符,其拥有的属性如下。
●location表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。
●refid是对当前构建文件中某处定义的一个path的引用。
●path表示一个文件或路径名列表。
示例
八、ant编译打包、运行工程
要说的的东西基本上就那么多,ant还有很多内容没有提到,有兴趣的可以自己去研究研究。ant不难,你用它就像是在docs控制台输入命令行一样,只不过ant是将命令行转换为xml的脚本信息,可以进行重复的运行。在一定情况下,提高了效率和重复的工作。
二、案例分析之压缩js
1.build.properties
charSet=UTF-8
compressType=js
name=jquery.xtable
core=jquery.xtable
resources=../wage-test/js
deploy_dir=../wage-test/js/component
2.build.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<projectname='jscompress'basedir='.'default='compress'>
<!--引入属性文件-->
<propertyfile="build.properties"/>
<propertyname="resources"value="${resources}"/>
<propertyname="dist"value="./release/${compress}"/>
<!--引入jar-->
<taskdefresourse="net/sf/antcontrib/antcontrib.properties"classpath="./lib/ant-contrib-1.0b3.jar"/>
<taskdefname="compress"classname="com.yahoo.platform.yui.compressor.YUICompressTask"classpath="./lib/yuicompressor-2.4.2.jar;./lib/YUIAnt-zh_CN.jar"/>
<!--开始压缩js-->
<targetname="compress"description="压缩合并js">
<echomessage="开始压缩文件${resource},文件类型${compressType}"/><!--输出message级别的信息-->
<deletedir="${dist}"/><!--删除文件夹-->
<if>
<not><!--不存在-->
<issetproperty="deploy_dir"/><!--判读此属性是否存在-->
</not>
<then><!--不存在执行以下命令-->
<varname="deploy_dir"value="../tool/"/><!--声明变量-->
</then>
</if>
<varname="allName"value="${deploy_dir}/${name}.all.${compressType}/"/>
<varname="allMinName"value="${deploy_dir}/${name}.all.min.${compressType}"/>
<if>
<issetproperty="core"/>
<then>
<echomessage="***********execux***************"/>
<mkdirdir="${dist}/ux"/>
<copytodir="${dist}">
<filesetdir="${resources}"><!--复制${resources}文件夹下的${core}的文件-->
<includename="${core}"/>
</fileset>
</copy>
<copytodir="${dist}/ux">
<filesetdir="${resources}"><!--复制${resources}文件夹下的不包含文件${core}.${compressType}、**/*.all.${compressType}、**/*.all.min.${compressType}的所有文件-->
<excludename="${core}.${compressType}"/>
<excludename="**/*.all.${compressType}"/>
<excludename="**/*.all.min.${compressType}"/>
</fileset>
</copy>
</then>
<else>
<echomessage="****************execnormal**************"/>
<mkdirdir="${dist}"/>
<copytodir="${dist}">
<filesetdir="${resources}">
<excludename="**/*.all.${compressType}"/>
<excludename="**/*.all.min.${compressType}"/>
</fileset>
</copy>
</else>
</if>
<!--合并js-->
<concatdestfile="${allName}"encoding="${charset}"outputencoding="${charset}"><!--合并文件将./release/${compressType}的"**/*.${compressType}的所有文件合并到${allName}中-->
<filesetdir="./release/${compressType}">
<includename="**/*.${compressType}"/>
</fileset>
</concat>
<!--targetcompress调用YuiCompressor对合并后的js进行压缩-->
<!--linebreak:在指定的列后插入一个line-bread符号-->
<!--warn:-->
<!--charset:指定读取输入文件使用的编码-->
<!--munge:只压缩,不对局部变量进行混淆-->
<!--preserveallsemicolons:保留所有的分号。-->
<!--outputfolder:指定合并后输出到的文件夹-->
<compresslinebreak="900000"warn="false"charset="${charset}"encoding="${charset}"munge="yes"preserveallsemicolons="true"outputfolder="${dist}">
<filesetdir="${dist}">
<includename="**/*.${compressType}"/>
</fileset>
</compress>
<concatdestfile="${allMinName}"encode="${charset}"outputencoding="${charset}">
<filesetdir="./release/${compressType}">
<includename="**/*.${compressType}"/>
</fileset>
</concat>
<deletedir="${dist}"/>
<echomessage="压缩完成,文件:${allName},${allMinName},刷新${deploy_dir}目录进行查看"/>
</target>
</project>
<?xmlversion="1.0"encoding="UTF-8"?>
<projectname="jade-hr-info"basedir="."default="help">
<!--引用资源文件-->
<propertyfile="../../jade-libs/build.properties"/>
<!--代码目录--->
<!--${ant.project.name}an内置属性获取当前项目名称--->
<propertyname="project.java"value="../${ant.project.name}/src/java"/>
<propertyname="project.web"value="../${ant.project.name}/src/web"/>
<propertyname="project.conf"value="../${ant.project.name}/conf"/>
<!--lib.home.ref=../jade-libs-->
<!--java编译classpath-->
<pathid="master-classpath">
<!--加入公用的lib包-->
<filesetdir="${lib.home.ref}">
<includename="**libs/*.jar"/>
</fileset>
</path>
<targetname="help">
<echomessage="JadeFortuneApplicationBuildFileforJDK1.5"/>
<echomessage="用法:ant-[target]"/>
<echomessage="------------------------------------------------------"/>
<echomessage="[target]如下"/>
<echomessage="clean清空所有输出文件包括build和部署目录"/>
<echomessage="exploded-app创建展开目录形式的应用结构"/>
<echomessage="war创建用于发布的WAR包文件(适用于生产打包、远程部署)"/>
<echomessage="deploy将扩展目录直接copy到appserver运行环境下(适用于编译环境与运行环境分离)"/>
<echomessage="i18n将资源文件转换成UTF-8码,并copy到classpath下(适用于热部署)"/>
<echomessage="------------------------------------------------------"/>
</target>
<!--创建时间撮-->
<tstamp/>
<!--清洗包-->
<!--target:jdk版本-->
<!--debug:编译后的文件允许调试,没有加上的话有些eclipse版本可能会出现警告-->
<!--deprecation:假如为真,将会给出不建议使用的API,默认值false-->
<!--optimize:。-->
<!--failonerror:指定clientgenAnt任务在出现错误的情况下是否继续执行。此特性的有效值为True或False。默认值为True,这意味着即使遇到错误也要继续执行。-->
<!--fork:为true时在外部启用一个新的JDK编译器进程执行编译。默认值是true,应用在需要配置编译器运行时环境时-->
<!--memoryMaximumSize:如果javac在外部运行,则是底层VM的初始内存大小;否则将被忽略。默认为标准VM内存设置。(例如:83886080、81920k或80m)-->
<!--includeantruntime:作用是指定编译任务是否包含ant的classpath,可有可无,不影响编译,。-->
<targetname="jar">
<mkdirdir="../${ant.project.name}/bin"/>
<echomessage="startrefresh${ant.project.name}sourse"/>
<!--编译代码,对应java中javac命令srcdir定义源文件路径,destdir定义编译后文件路径-->
<javacdestdir="../${ant.project.name}/bin"target="1.5"debug="true"deprecation="false"optimize="false"failonerror="true"fork="true"memoryMaximumSize="512m"includeantruntime="true">
<srcpath="${project.java}"/>
<!--定义编译所需要的classpath-->
<classpathrefid="master-classpath"/>
</javac>
<echomessage="endrefresh${ant.project.name}source"/>
<echomessage="startrefresh${ant.project.name}source"/>
<!--jar操作,jarfile指定jar包存放的路径,basedir为编译后的class的目录-->
<!--${lib.build}=./jade-base-libsjade-libs/jade-base-libs/jade-hr-info.jar-->
<!--compress:-->
<jarbasedir="../${ant.project.name/bin}"jarfile="${lib.home.ref}/${lib.build}/${ant.project.name}.jar"compress="false">
<!--清单文件MAINFEST.MF(jar里面的)-->
<mainfest>
<attributename="Version"value="1.0"/>
<attributename="Date"value="${DSTAMP}"/>
<attributename="Class-Path"value="${libs}"/>
<attributename="Discription"value="描述"/>
</mainfest>
</jar>
<echomessage="successforbuild${ant.project.name}jar"/>
<deletedir="temp/building"/>
</target>
<targetname="copyJSPAndXml"description="将指定的javasource汇集在一起">
<echomessage="startcopy${ant.project.name}jspAndXml"/>
<!--发布文件,把页面,配置,等拷贝到对应的发布目录下-->
<!--web.xmlspring-core.xmlstruts-core.xml不需要复制-->
<!--拷贝页面-->
<copytodir="${dirploy_dir}/${war.name.gdpos}">
<filesetdir="${project.web}">
<excludename="WEB-INF/web.xml"/>
<excludename="WEB-INF/**/*/spring-core.xml"/>
<excludename="WEB-INF/**/*/struts-core.xml"/>
</fileset>
</copy>
<!--拷贝配置-->
<copytodir="${deploy_dir}/${war.name.gdpos}/WEB-INF/classes">
<filesetdir="${project.conf}"/><!--文件夹下所有文件不用过滤-->
</copy>
<echomessage="endcopy${ant.project.name}JSPAndXml"/>
</target>
<!--创建编译任务,名字是compile,depends指定了complie任务依赖的init任务-->
<targetname="init"description="complietarget">
<echomessage="startexcute${ant.project.name}subbuild.xml"/>
<!--执行子项目的build.xml文件-->
<antantfile="build.xml"dir="${project.root}/${project.name}"/>
<echomessage="endexecute${ant.project.name}subbuild.xml">
</target>
<targetname="exploded-app"depends="init,copyJSPAndXml"description="步骤聚合"/>
<taskdefresource="net/sf/antcontrib/antcontrib.properties"classpath="../jade-libs/tools/lib/ant-contrib-1.0b3.jar"/>
<targetname="copyI18nXml">
<if>
<availablefile="${project.conf}/i18n"<!--如果存在${project.conf}/i18n文件夹就复制到指定文件夹下-->
<then>
<copytodir="${i18nDir}">
<filesetdir="${project.conf}/i18n"/>
</copy>
</then>
</if>
</target>
</project>
ant是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。在实际软件开发中,有很多地方可以用到ant。
开发环境:
System:Windows
JDK:1.6+
IDE:eclipse
ant:1.9.1
Email:
Blog:
二、优点
ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点:
1、跨平台性:Ant是纯Java语言编写的,所以具有很好的跨平台性。
2、操作简单:Ant是由一个内置任务和可选任务组成的,用ant任务就像是在dos中写命令行一样。Ant运行时需要一个XML文件(构建文件)。Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。
3、维护简单、可读性好、集成简单:由于Ant构建文件时XML格式的文件,所以很容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
三、安装和配置
1、下载ant,
2、解压zip压缩包,将压缩包放置你要放置的目录。我这里放置在D:\apache-ant-1.9.1,目录结构如下:
bin是ant的程序运行入口,如果没有配置ANT_HOME的情况下,可以通过bin目录中的bat程序进行运行build任务。
如:在cmd中运行ant.bat就可以执行程序,当然你选择要当前目录中存在一个build.xml(build.xml是默认的ant执行文件,当然你可以指定其他文件)
.com/blog/151517/201306/14125552-c20237daedfe41cca1002b7bb12ebd9e.png"border="0">
etc目录中存放的都是一些xsl的输出模板,创建一个加强的导出各种任务的XML输出,使你的build文件摆脱过时的警告
lib目录中存放的是ant程序需要依赖的jar包
manual目录是ant程序的帮助文档
3、在我的电脑–>右键属性–>高级系统配置->环境变量中配置ant
新建系统变量ANT_HOME=D:\apache-ant-1.9.1
这样环境变量就配置好了,但前提你需要配置jdk的环境变量。如果你没有配置jdk的环境变量,那么请你先配置好jdk变量。jdk环境配置方法如下:
(1),安装JDk到其默认目录:C:\ProgramFiles\Java\jdk1.5.0_05(没有jdk去官方下载一个)
C:\ProgramFiles\Java\jdk1.5.0
作用:告诉系统JVM在什么地方
(2),右击我的电脑,选属性,高级,环境变量
(3),在系统变量栏点新建,出现新建系统变量对话框,在变量名中填上JAVA_HOME,变量值:C:\ProgramFiles\Java\jdk1.5.0_05
(4),确定后在系统变量(S)栏再新建一个环境变量CLASSPATH,变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(开头的dot和;不能少)
(5),确定后在系统变量(S)栏查找并选中变量为Path的选项,点编辑在变量值(V)的末尾添加:
%JAVA_HOME%\bin
如果没有找到PATH变量,自己新建一个!
如果你不想每次运行都要cmd到class所在目录然后执行java命令,可以把所有的class文件放到统一的目录组织下,然后将此目录也追加到CLASSPATH下。
测试代码如下:
publicclassTest{
publicstaticvoidmain(String[]args){
System.out.println("HelloWorld!");
}
}
用记事本编辑后存为Test.java(文件名与类名相同)文件,打开命令行窗口,
cd到文件所在目录下:
javacTest.java//编译命令
javaTest//执行程序
如果输出为:HelloWorld!OK,配置完毕,否则,重新检查。
四、测试ant
在启动,运行cmd的dos窗口中输入ant,如图:
如果出现这个,那么恭喜你安装成功了!否则就失败了,检查下前面的步骤有没有错误。上面命令会执行ant程序,ant默认执行build.xml中的任务,这里在Administrator目录中没有这个文件。
如果安装失败,你看看是否存在一些情况:
1、没有配置JAVA_HOME或配置错误,并且JAVA_HOME\bin\java.exe存在
2、没有配置ANT_HOEM或配置错误,并且ANT_HOME\bin\ant.bat存在
3、检查你的环境变量的path变量中,有木有配置...;%ANT_HOME%\bin;...
%PATH%=...maybe-other-entries...;%ANT_HOME%\bin;...maybe-other-entries...
五、ant的运行时环境
ant在运行命令的时候,有时候会出现一些公园的jar库。这些库会存在于每个ant工程中,那么这个时候我们可以把这个jar包放到ant_home\lib目录中作为全局的库使用。
如果你不想“污染”原始的ant程序,那么你可以把jar包放在当前windows用户的目录下,具体位置应该是${user.home}/.ant/lib下。没有以上目录可以手动建立。
如果你只是临时要添加lib,又不想把lib添加到当前ant工程中。你可以在运行ant程序的时候指定依赖的lib参数。
同时,你还可以在当前build工程的classpath目录中添加你的工程依赖jar包。
六、ant命令
语法元素说明如下:
-help
显示描述ant命令及其选项的帮助信息
-projecthelp
显示包含在构建文件中的、所有用户编写的帮助文档。即为各个<target>中description属性的文本,以及包含在<description>元素中的任何文本。将有description属性的目标列为主目标(Maintarget),没有此属性的目标则列为子目标(Subtarget)。
-version
要求ant显示其版本信息,然后退出。
-quiet
抑制并非由构建文件中的echo任务所产生的大多数消息。
-verbose
显示构建过程中每个操作的详细消息。此选项与-debug选项只能选其一。
-debug
显示Ant和任务开发人员已经标志为调试消息的消息。此选项与-verbose只能选其一。
-emacs
对日志消息进行格式化,使它们能够很容易地由Emacs的shell模式(shellmode)所解析;也就是说,打印任务事件,但并不缩排,在其之前也没有[taskname]。
-logfilefilename
将日志输出重定向到指定文件。
-loggerclassname
指定一个类来处理Ant的日志记录。所指定的类必须实现了org.apache.tools.ant.BuildLogger接口。
-listenerclassname
为Ant声明一个监听类,并增加到其监听者列表中。在Ant与IDE或其他Java程序集成时,此选项非常有用。可以阅读第六章以了解有关监听者的更多信息。必须将所指定的监听类编写为可以处理Ant的构建消息接发。
-buildfilefilename
指定Ant需要处理的构建文件。默认的构建文件为build.xml。
-Dproperty=value
在命令行上定义一个特性名-值对。
-findfilename
指定Ant应当处理的构建文件。与-buildfile选项不同,如果所指定文件在当前目录中未找到,-find就要求Ant在其父目录中再进行搜索。这种搜索会继续在其祖先目录中进行,直至达到文件系统的根为止,在此如果文件还未找到,则构建失败。
-atuoproxyjdk1.5以上的可以使用代理设置
-nouserlib运行ant时不使用用户lib中的jar包
-nice设计主线程优先级
-logfile使用指定的log日志
-noinput不允许交互输入
-keep-going,-k执行不依赖于所有目标
-propertyfile加载所有属性配置文件-d属性文件优先
<projectdefault="all">
<propertyname="pro_a"value="avalue"/>
<propertyname="pro_b"value="bvalue"/>
<pathid="rt.path">
<pathelementlocation="${java.home}/jre/lib/rt.jar"/>
</path>
24000
<targetname="all">
<javacsrcdir=".">
<classpathrefid="a.path"/>
</javac>
</target>
</project>
注意:
●所有构建文件都要有<project>元素,而且至少有一个<target>元素。
●对于<project>元素的default属性并不一定需要默认值。
●构建文件并不一定要被命名为build.xml。不过build.xml是ant要搜索的默认文件名。
●每个构建文件只能有一个<project>元素。
在cmd窗口中进入到当前build.xml目录
ant
在当前目录下的build.xml运行Ant,执行缺省的target。
ant-buildfilebuild-test.xml
在当前目录下的build-test.xml运行Ant,执行缺省的target。
ant-buildfilebuild-test.xmlclean
在当前目录下的build-test.xml运行Ant,执行一个叫做clean的target。
ant-buildfilebuild-test.xml-Dbuild=build/classesclean
在当前目录下的build-test.xml运行Ant,执行一个叫做clean的target,并设定build属性的值为build/classes。
七、ant脚本:使用节点、元素和属性、命令指令
1、project节点元素
project元素是Ant构件文件的根元素,Ant构件文件至少应该包含一个project元素,否则会发生错误。在每个project元素下,可包含多个target元素。接下来向读者展示一下project元素的各属性。
●name属性:用于指定project元素的名称。
●default属性:用于指定project默认执行时所执行的target的名称。
●basedir属性:用于指定基路径的位置。该属性没有指定时,使用Ant的构件文件的附目录作为基准目录。
<?xmlversion="1.0"?>
<projectname="ant-project"default="print-dir"basedir=".">
<targetname="print-dir">
<echomessage="Thebasediris:${basedir}"/>
</target>
</project>
从上例可以看出,在这里定义了default属性的值为print-dir,即当运行ant命令时,如果没有指明执行的target,则将执行默认的target(print-dir)。此外,还定义了basedir属性的值为“.”,.表示当前目录,进入当前目录后运行ant命令,得一下结果:
2、target节点元素
target为ant的基本执行单元或是任务,它可以包含一个或多个具体的单元/任务。多个target可以存在相互依赖关系。它有如下属性:
●name属性:指定target元素的名称,这个属性在一个project元素中是唯一的。我们可以通过指定target元素的名称来指定某个target。
●depends属性:用于描述target之间的依赖关系,若与多个target存在依赖关系时,需要以“,”间隔。Ant会依照depends属性中target出现的顺序依次执行每个target,被依赖的target会先执行。
●if属性:用于验证指定的属性是存在,若不存在,所在target将不会被执行。
●unless属性:该属性的功能与if属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在target将会被执行。
●description属性:该属性是关于target功能的简短描述和说明。
示例:
<?xmlversion="1.0"?>
<projectname="ant-target"default="print">
<targetname="version"if="ant.java.version">
<echomessage="JavaVersion:${ant.java.version}"/>
</target>
<targetname="print"depends="version"unless="docs">
<description>
adependexample!
</description>
<echomessage="Thebasediris:${basedir}"/>
</target>
</project>
从以下结果后可以看到,我们运行的是名为print的target,由于它依赖于version这个target任务,所以version将首先被执行,同时因为系统配置了JDK,所以ant.java.version属性存在,执行了version,输出信息:"[echo]JavaVersion:1.6",version执行完毕后,接着执行print,因为docs不存在,而unless属性是在不存在时进入所在target
的,由此可知print得以执行,输出信息:"[echo]Thebasediris:D:\Workspace\AntExample\build"。
3、property属性节点元素
property元素可看作参量或者参数的定义,project的属性可以通过property元素来设定,也可在Ant之外设定。若要在外部引入某文件,例如build.properties文件,可以通过如下内容将其引:
<propertyfile="build.properties"/>
property元素可用作task的属性值。在task中是通过将属性名放在${属性名}之间,并放在task属性值的位置来实现的。
Ant提供了一些内置的属性,它能得到的系统属性的列表与Java文档中System.getProperties()方法得到的属性一致,这些系统属性可参考sun网站的说明。同时,Ant还提供了一些它自己的内置属性,如下:
basedir:project基目录的绝对路径;
ant.file:buildfile的绝对路径,上例中ant.file值为D:\Workspace\AntExample\build;
ant.version:Ant的版本信息,本文为1.8.1;
ant.project.name:当前指定的project的名字,即前文说到的project的name属性值;
ant.java.version:Ant检测到的JDK版本,本文为1.6。
举例说明如下:
<projectname="ant-project"default="example">
<propertyname="name"value="jojo"/>
<propertyname="age"value="25"/>
<targetname="example">
<echomessage="name:${name},age:${age}"/>
</target>
</project>
上例中用户设置了名为name和age的两个属性,这两个属性设置后,在下文中可以通过${name}和${age}分别取得这两个属性值。
4、copy命令
copy主要用来对文件和目录的复制功能。举例如下:
●复制单个文件:
<copyfile="old.txt"tofile="new.txt"/>
●对文件目录进行复制:
<copytodir="../dest_dir">
<filesetdir="src_dir"/>
</copy>
●将文件复制到另外的目录:
<copyfile="src.txt"todir="c:/base"/>
5、delete命令
对文件或目录进行删除,举例如下:
●删除某个文件:
<deletefile="/res/image/cat.jpg"/>
●删除某个目录:
<deletedir="/res/image"/>
●删除所有的jar文件或空目录:
<deleteincludeEmptyDirs="true">
<filesetdir="."includes="**/*.jar"/>
</delete>
6、mkdir命令
创建目录。
<mkdirdir="/home/philander/build/classes"/>
7、move命令
移动文件或目录,举例如下:
●移动单个文件:
<movefile="sourcefile"tofile=”destfile”/>
●移动单个文件到另一个目录:
<movefile="sourcefile"todir=”movedir”/>
●移动某个目录到另一个目录:
<movetodir="newdir">
<filesetdir="olddir"/>
</move>
8、echo命令
该任务的作用是根据日志或监控器的级别输出信息。它包括message、file、append和level四个属性,举例如下
<echomessage="antmessage"file="/logs/ant.log"append="true">
9、jar标签节点元素
该标签用来生成一个JAR文件,其属性如下。
●destfile表示JAR文件名。
●basedir表示被归档的文件名。
●includes表示别归档的文件模式。
●exchudes表示被排除的文件模式。
●compress表示是否压缩。
示例:
<jardestfile="${webRoot}/${ash_jar}"level="9"compress="true"encoding="utf-8"basedir="${dest}">
<manifest>
<attributename="Implementation-Version"value="Version:2.2"/>
</manifest>
</jar>
上面的mainfest是jar包中的MEAT-INF中的MANIFEST.MF中的文件内容
同样打包操作的的还有war、tgz,已经解压操作uzip
<!--创建zip-->
<zipbasedir="${basedir}\classes"zipfile="temp\output.zip"/>
<!--创建tgz-->
<gzipsrc="classes\**\*.class"zipfile="output.class.gz"/>
<!--解压zip-->
<unzipsrc="output.class.gz"dest="extractDir"/>
<!--建立war包-->
<wardestfile="${webRoot}/ash.war"basedir="${basedir}/web"webxml="${basedir}/web/WEB-INF/web.xml">
<excludename="WEB-INF/classes/**"/>
<excludename="WEB-INF/lib/**"/>
<excludename="WEB-INF/work/_jsp/**"/>
<libdir="${lib.dir}"includes="**/*.jar,**/*.so,**/*.dll">
<excludename="${webRoot}\${helloworld_jar}"/>
</lib>
<libfile="${webRoot}/${helloworld_jar}"/>
<classesdir="${dest}"includes="**/*.xml,**/*.properites,**/*.xsd"></classes>
</war>
10、javac标签节点元素
该标签用于编译一个或一组java文件,其属性如下。
●srcdir表示源程序的目录。
●destdir表示class文件的输出目录。
●include表示被编译的文件的模式。
●excludes表示被排除的文件的模式。
●classpath表示所使用的类路径。
●debug表示包含的调试信息。
●optimize表示是否使用优化。
●verbose表示提供详细的输出信息。
●fileonerror表示当碰到错误就自动停止。
示例
<javacsrcdir="${src}"destdir="${dest}"/>
<!--设置jvm内存
<javacsrcdir="src"fork="true"/>
<javacsrcdir="src"fork="true"executable="d:\sdk141\bin\javac"
memoryMaximumSize="128m"/>
-->
11、java标签节点元素
该标签用来执行编译生成的.class文件,其属性如下。
●classname表示将执行的类名。
●jar表示包含该类的JAR文件名。
●classpath所表示用到的类路径。
●fork表示在一个新的虚拟机中运行该类。
●failonerror表示当出现错误时自动停止。
●output表示输出文件。
●append表示追加或者覆盖默认文件。
示例
<javaclassname="com.hoo.test.HelloWorld"classpath="${hello_jar}"/>
12、arg数据参数元素
由Ant构建文件调用的程序,可以通过<arg>元素向其传递命令行参数,如apply,exec和java任务均可接受嵌套<arg>元素,可以为各自的过程调用指定参数。以下是<arg>的所有属性。
●values是一个命令参数。如果参数中有空格,但又想将它作为单独一个值,则使用此属性。
●file表示一个参数的文件名。在构建文件中,此文件名相对于当前的工作目录。
●line表示用空格分隔的多个参数列表。
●表示路径,一个作为单个命令行变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。
●pathref引用的path(使用path元素节点定义path)的id
●prefix前缀
●suffix后缀
例子
<argvalue="-l-a"/>
是一个含有空格的单个的命令行变量。
<argline="-l-a"/>
是两个空格分隔的命令行变量。
<argpath="/dir;/dir2:\dir3"/>
是一个命令行变量,其值在DOS系统上为\dir;\dir2;\dir3;在Unix系统上为/dir:/dir2:/dir3。
13、ervironment类型
由Ant构建文件调用的外部命令或程序,<env>元素制定了哪些环境变量要传递给正在执行的系统命令,<env>元素可以接受以下属性。
●file表示环境变量值的文件名。此文件名要被转换位一个绝对路径。
●path表示环境变量的路径。Ant会将它转换为一个本地约定。
●value表示环境变量的一个直接变量。
●key表示环境变量名。
注意filepath或value只能取一个。
14、filelist文件集合列表
filelist是一个支持命名的文件列表的数据类型,包含在一个filelist类型中的文件不一定是存在的文件。以下是其所有的属性。
●dir是用于计算绝对文件名的目录。
●files是用逗号分隔的文件名列表。
●refid是对某处定义的一个<filelist>的引用。
注意dir和files都是必要的,除非指定了refid(这种情况下,dir和files都不允许使用)。
示例
<filelistid="docfiles"dir="${doc.src}"files="foo.xml,bar.xml"/>
文件集合${doc.src}/foo.xml和${doc.src}/bar.xml.这些文件也许还是不存在的文件.
<filelistid="docfiles"dir="${doc.src}"files="foo.xmlbar.xml"/>
<filelistrefid="docfiles"/>
<filelistid="docfiles"dir="${doc.src}">
<filename="foo.xml"/>
<filename="bar.xml"/>
</filelist>
15、fileset文件类型
fileset数据类型定义了一组文件,并通常表示为<fileset>元素。不过,许多ant任务构建成了隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。以下为fileset的属性列表。
●dir表示fileset的基目录。
●casesensitive的值如果为false,那么匹配文件名时,fileset不是区分大小写的,其默认值为true.
●defaultexcludes用来确定是否使用默认的排除模式,默认为true。
●excludes是用逗号分隔的需要派出的文件模式列表。
●excludesfile表示每行包含一个排除模式的文件的文件名。
●includes是用逗号分隔的,需要包含的文件模式列表。
●includesfile表示每行包括一个包含模式的文件名。
示例
<filesetid="lib.runtime"dir="${lib.path}/runtime">
<includename="**/*.jar"/>
<includename="**/*.so"/>
<includename="**/*.dll"/>
</fileset>
<filesetid="lib.container"dir="${lib.path}/container">
<includename="**/*.jar"/>
</fileset>
<filesetid="lib.extras"dir="${lib.path}">
<includename="test/**/*.jar"/>
</fileset>
16、patternset类型
fileset是对文件的分组,而patternset是对模式的分组,他们是紧密相关的概念。
<patternset>支持4个属性:includes、excludex、includexfile、excludesfile,这些与fileset相同。
patternset还允许以下嵌套元素:include,exclude,includefile和excludesfile.
示例
<!--黑白名单-->
<patternsetid="non.test.sources">
<includename="**/*.java"/>
<!--文件名包含Test的排除-->
<excludename="**/*Test*"/>
</patternset>
<patternsetid="sources">
<includename="std/**/*.java"/>
<!--判断条件存在professional就引入-->
<includename="prof/**/*.java"if="professional"/>
<excludename="**/*Test*"/>
</patternset>
<!--一组文件-->
<patternsetincludesfile="some-file"/>
<patternset>
<includesfilename="some-file"/>
<patternset/>
<patternset>
<includesfilename="some-file"/>
<includesfilename="${some-other-file}"if="some-other-file"/>
<patternset/>
17、filterset类型
filterset定义了一组过滤器,这些过滤器将在文件移动或复制时完成文件的文本替换。
主要属性如下:
●begintoken表示嵌套过滤器所搜索的记号,这是标识其开始的字符串。
●endtoken表示嵌套过滤器所搜索的记号这是标识其结束的字符串。
●id是过滤器的唯一标志符。
●refid是对构建文件中某处定义一个过滤器的引用。
示例
<!--将目标文件build.dir目录中的version.txt文件内容中的@DATE@替换成TODAY当前日期的值,并把替换后的文件存放在dist.dir目录中-->
<copyfile="${build.dir}/version.txt"toFile="${dist.dir}/version.txt">
<filterset>
<filtertoken="DATE"value="${TODAY}"/>
</filterset>
</copy>
<!--自定义变量的格式-->
<copyfile="${build.dir}/version.txt"toFile="${dist.dir}/version.txt">
<!--从version.txt中的%位置开始搜索,到*位置结束,进行替换内容中的@DATE@替换成TODAY当前日期的值-->
<filtersetbegintoken="%"endtoken="*">
<filtertoken="DATE"value="${TODAY}"/>
</filterset>
</copy>
<!--使用外部的过滤定义文件-->
<copytoDir="${dist.dir}/docs">
<filesetdir="${build.dir}/docs">
<includename="**/*.html">
</fileset>
<filtersetbegintoken="%"endtoken="*">
<!--过来文件从外部引入,过来的属性和值配置在dist.properties文件中-->
<filtersfilefile="${user.dir}/dist.properties"/>
</filterset>
</copy>
<!--使用引用方式,重复利用过滤集-->
<filtersetid="myFilterSet"begintoken="%"endtoken="*">
<filtertoken="DATE"value="${TODAY}"/>
</filterset>
<copyfile="${build.dir}/version.txt"toFile="${dist.dir}/version.txt">
<filtersetrefid="myFilterSet"/>
</copy>
18、path类型
path元素用来表示一个类路径,不过它还可以用于表示其他的路径。在用作几个属性时,路经中的各项用分号或冒号隔开。在构建的时候,此分隔符将代替当前平台中所有的路径分隔符,其拥有的属性如下。
●location表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。
●refid是对当前构建文件中某处定义的一个path的引用。
●path表示一个文件或路径名列表。
示例
<pathid="buildpath">
<filesetrefid="lib.runtime"/>
<filesetrefid="lib.container"/>
<filesetrefid="lib.extras"/>
</path>
<pathid="src.paths">
<filesetid="srcs"dir=".">
<includename="src/**/*.java"/>
</fileset>
</path>
八、ant编译打包、运行工程
<?xmlversion="1.0"encoding="UTF-8"?>
<!--name是当前工程的名称,default是默认执行的任务,basedir是工作目录(.代表当前根目录)-->
<projectname="HelloWorld"default="run"basedir=".">
<!--property类似于程序中定义简单的变量-->
<propertyname="src"value="src"/>
<propertyname="dest"value="classes"/>
<propertyname="hello_jar"value="helloWorld.jar"/>
<!--
target是一个事件、事情、任务,name是当前事情的名称,depends是依赖的上一件或是多件事情
如果所依赖的事情没有执行,ant会先运行依赖事情,然后再运行当前事情
-->
<!--初始化-->
<targetname="init">
<!--建立classes目录-->
<mkdirdir="${dest}"/>
<mkdirdir="temp"/>
<mkdirdir="temp2"/>
</target>
<!--编译-->
<targetname="compile"depends="init">
<javacsrcdir="${src}"destdir="${dest}"/>
<!--设置jvm内存
<javacsrcdir="src"fork="true"/>
<javacsrcdir="src"fork="true"executable="d:\sdk141\bin\javac"
memoryMaximumSize="128m"/>
-->
</target>
<!--建立jar包-->
<targetname="build"depends="compile">
<!--
<jarjarfile="${hello_jar}"basedir="${dest}"/>
创建一个名称是package.jar文件
<jardestfile="package.jar"basedir="classes"/>
-->
<jardestfile="${hello_jar}"basedir="classes">
<!--向jar包中的main文件中添加内容-->
<manifest>
<attributename="Built-By"value="${user.name}"/>
<attributename="Main-class"value="package.Main"/>
</manifest>
</jar>
<!--复制jar文件todir="复制到目录"-->
<copyfile="${hello_jar}"tofile="${dest}\temp.jar"/>
<copytodir="temp">
<!--不按照默认方式defaultexcludes=""-->
<filesetdir="src">
<includename="**/*.java"/>
</fileset>
</copy>
<copytodir="temp2">
<filesetdir="src">
<and>
<containstext="main"/>
<sizevalue="1"when="more"/>
</and>
</fileset>
</copy>
<!--移动jar文件-->
<movefile="${dest}\temp.jar"tofile="temp\move-temp.jar"/>
<!--创建zip-->
<zipbasedir="${basedir}\classes"zipfile="temp\output.zip"/>
<!--创建tgz-->
<gzipsrc="classes\**\*.class"zipfile="output.class.gz"/>
<!--解压zip-->
<unzipsrc="output.class.gz"dest="extractDir"/>
<!--替换input.txt内容中的old为new
<replacefile="input.txt"token="old"value="new"/>
-->
</target>
<!--运行-->
<targetname="run"depends="build">
<javaclassname="com.hoo.test.HelloWorld"classpath="${hello_jar}"/>
</target>
<!--清除-->
<targetname="clean">
<!--删除生成的文件-->
<deletedir="${dest}"/>
<deletefile="${hello_jar}"/>
</target>
<tstamp>
<formatproperty="OFFSET_TIME"
pattern="HH:mm:ss"
offset="10"unit="minute"/>
</tstamp>
<!--重新运行-->
<targetname="rerun"depends="clean,run">
<echomessage="###${TSTAMP}#${TODAY}#${DSTAMP}###"/>
<aunttarget="clean"/>
<aunttarget="run"/>
</target>
</project>
要说的的东西基本上就那么多,ant还有很多内容没有提到,有兴趣的可以自己去研究研究。ant不难,你用它就像是在docs控制台输入命令行一样,只不过ant是将命令行转换为xml的脚本信息,可以进行重复的运行。在一定情况下,提高了效率和重复的工作。
二、案例分析之压缩js
1.build.properties
charSet=UTF-8
compressType=js
name=jquery.xtable
core=jquery.xtable
resources=../wage-test/js
deploy_dir=../wage-test/js/component
2.build.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<projectname='jscompress'basedir='.'default='compress'>
<!--引入属性文件-->
<propertyfile="build.properties"/>
<propertyname="resources"value="${resources}"/>
<propertyname="dist"value="./release/${compress}"/>
<!--引入jar-->
<taskdefresourse="net/sf/antcontrib/antcontrib.properties"classpath="./lib/ant-contrib-1.0b3.jar"/>
<taskdefname="compress"classname="com.yahoo.platform.yui.compressor.YUICompressTask"classpath="./lib/yuicompressor-2.4.2.jar;./lib/YUIAnt-zh_CN.jar"/>
<!--开始压缩js-->
<targetname="compress"description="压缩合并js">
<echomessage="开始压缩文件${resource},文件类型${compressType}"/><!--输出message级别的信息-->
<deletedir="${dist}"/><!--删除文件夹-->
<if>
<not><!--不存在-->
<issetproperty="deploy_dir"/><!--判读此属性是否存在-->
</not>
<then><!--不存在执行以下命令-->
<varname="deploy_dir"value="../tool/"/><!--声明变量-->
</then>
</if>
<varname="allName"value="${deploy_dir}/${name}.all.${compressType}/"/>
<varname="allMinName"value="${deploy_dir}/${name}.all.min.${compressType}"/>
<if>
<issetproperty="core"/>
<then>
<echomessage="***********execux***************"/>
<mkdirdir="${dist}/ux"/>
<copytodir="${dist}">
<filesetdir="${resources}"><!--复制${resources}文件夹下的${core}的文件-->
<includename="${core}"/>
</fileset>
</copy>
<copytodir="${dist}/ux">
<filesetdir="${resources}"><!--复制${resources}文件夹下的不包含文件${core}.${compressType}、**/*.all.${compressType}、**/*.all.min.${compressType}的所有文件-->
<excludename="${core}.${compressType}"/>
<excludename="**/*.all.${compressType}"/>
<excludename="**/*.all.min.${compressType}"/>
</fileset>
</copy>
</then>
<else>
<echomessage="****************execnormal**************"/>
<mkdirdir="${dist}"/>
<copytodir="${dist}">
<filesetdir="${resources}">
<excludename="**/*.all.${compressType}"/>
<excludename="**/*.all.min.${compressType}"/>
</fileset>
</copy>
</else>
</if>
<!--合并js-->
<concatdestfile="${allName}"encoding="${charset}"outputencoding="${charset}"><!--合并文件将./release/${compressType}的"**/*.${compressType}的所有文件合并到${allName}中-->
<filesetdir="./release/${compressType}">
<includename="**/*.${compressType}"/>
</fileset>
</concat>
<!--targetcompress调用YuiCompressor对合并后的js进行压缩-->
<!--linebreak:在指定的列后插入一个line-bread符号-->
<!--warn:-->
<!--charset:指定读取输入文件使用的编码-->
<!--munge:只压缩,不对局部变量进行混淆-->
<!--preserveallsemicolons:保留所有的分号。-->
<!--outputfolder:指定合并后输出到的文件夹-->
<compresslinebreak="900000"warn="false"charset="${charset}"encoding="${charset}"munge="yes"preserveallsemicolons="true"outputfolder="${dist}">
<filesetdir="${dist}">
<includename="**/*.${compressType}"/>
</fileset>
</compress>
<concatdestfile="${allMinName}"encode="${charset}"outputencoding="${charset}">
<filesetdir="./release/${compressType}">
<includename="**/*.${compressType}"/>
</fileset>
</concat>
<deletedir="${dist}"/>
<echomessage="压缩完成,文件:${allName},${allMinName},刷新${deploy_dir}目录进行查看"/>
</target>
</project>
<?xmlversion="1.0"encoding="UTF-8"?>
<projectname="jade-hr-info"basedir="."default="help">
<!--引用资源文件-->
<propertyfile="../../jade-libs/build.properties"/>
<!--代码目录--->
<!--${ant.project.name}an内置属性获取当前项目名称--->
<propertyname="project.java"value="../${ant.project.name}/src/java"/>
<propertyname="project.web"value="../${ant.project.name}/src/web"/>
<propertyname="project.conf"value="../${ant.project.name}/conf"/>
<!--lib.home.ref=../jade-libs-->
<!--java编译classpath-->
<pathid="master-classpath">
<!--加入公用的lib包-->
<filesetdir="${lib.home.ref}">
<includename="**libs/*.jar"/>
</fileset>
</path>
<targetname="help">
<echomessage="JadeFortuneApplicationBuildFileforJDK1.5"/>
<echomessage="用法:ant-[target]"/>
<echomessage="------------------------------------------------------"/>
<echomessage="[target]如下"/>
<echomessage="clean清空所有输出文件包括build和部署目录"/>
<echomessage="exploded-app创建展开目录形式的应用结构"/>
<echomessage="war创建用于发布的WAR包文件(适用于生产打包、远程部署)"/>
<echomessage="deploy将扩展目录直接copy到appserver运行环境下(适用于编译环境与运行环境分离)"/>
<echomessage="i18n将资源文件转换成UTF-8码,并copy到classpath下(适用于热部署)"/>
<echomessage="------------------------------------------------------"/>
</target>
<!--创建时间撮-->
<tstamp/>
<!--清洗包-->
<!--target:jdk版本-->
<!--debug:编译后的文件允许调试,没有加上的话有些eclipse版本可能会出现警告-->
<!--deprecation:假如为真,将会给出不建议使用的API,默认值false-->
<!--optimize:。-->
<!--failonerror:指定clientgenAnt任务在出现错误的情况下是否继续执行。此特性的有效值为True或False。默认值为True,这意味着即使遇到错误也要继续执行。-->
<!--fork:为true时在外部启用一个新的JDK编译器进程执行编译。默认值是true,应用在需要配置编译器运行时环境时-->
<!--memoryMaximumSize:如果javac在外部运行,则是底层VM的初始内存大小;否则将被忽略。默认为标准VM内存设置。(例如:83886080、81920k或80m)-->
<!--includeantruntime:作用是指定编译任务是否包含ant的classpath,可有可无,不影响编译,。-->
<targetname="jar">
<mkdirdir="../${ant.project.name}/bin"/>
<echomessage="startrefresh${ant.project.name}sourse"/>
<!--编译代码,对应java中javac命令srcdir定义源文件路径,destdir定义编译后文件路径-->
<javacdestdir="../${ant.project.name}/bin"target="1.5"debug="true"deprecation="false"optimize="false"failonerror="true"fork="true"memoryMaximumSize="512m"includeantruntime="true">
<srcpath="${project.java}"/>
<!--定义编译所需要的classpath-->
<classpathrefid="master-classpath"/>
</javac>
<echomessage="endrefresh${ant.project.name}source"/>
<echomessage="startrefresh${ant.project.name}source"/>
<!--jar操作,jarfile指定jar包存放的路径,basedir为编译后的class的目录-->
<!--${lib.build}=./jade-base-libsjade-libs/jade-base-libs/jade-hr-info.jar-->
<!--compress:-->
<jarbasedir="../${ant.project.name/bin}"jarfile="${lib.home.ref}/${lib.build}/${ant.project.name}.jar"compress="false">
<!--清单文件MAINFEST.MF(jar里面的)-->
<mainfest>
<attributename="Version"value="1.0"/>
<attributename="Date"value="${DSTAMP}"/>
<attributename="Class-Path"value="${libs}"/>
<attributename="Discription"value="描述"/>
</mainfest>
</jar>
<echomessage="successforbuild${ant.project.name}jar"/>
<deletedir="temp/building"/>
</target>
<targetname="copyJSPAndXml"description="将指定的javasource汇集在一起">
<echomessage="startcopy${ant.project.name}jspAndXml"/>
<!--发布文件,把页面,配置,等拷贝到对应的发布目录下-->
<!--web.xmlspring-core.xmlstruts-core.xml不需要复制-->
<!--拷贝页面-->
<copytodir="${dirploy_dir}/${war.name.gdpos}">
<filesetdir="${project.web}">
<excludename="WEB-INF/web.xml"/>
<excludename="WEB-INF/**/*/spring-core.xml"/>
<excludename="WEB-INF/**/*/struts-core.xml"/>
</fileset>
</copy>
<!--拷贝配置-->
<copytodir="${deploy_dir}/${war.name.gdpos}/WEB-INF/classes">
<filesetdir="${project.conf}"/><!--文件夹下所有文件不用过滤-->
</copy>
<echomessage="endcopy${ant.project.name}JSPAndXml"/>
</target>
<!--创建编译任务,名字是compile,depends指定了complie任务依赖的init任务-->
<targetname="init"description="complietarget">
<echomessage="startexcute${ant.project.name}subbuild.xml"/>
<!--执行子项目的build.xml文件-->
<antantfile="build.xml"dir="${project.root}/${project.name}"/>
<echomessage="endexecute${ant.project.name}subbuild.xml">
</target>
<targetname="exploded-app"depends="init,copyJSPAndXml"description="步骤聚合"/>
<taskdefresource="net/sf/antcontrib/antcontrib.properties"classpath="../jade-libs/tools/lib/ant-contrib-1.0b3.jar"/>
<targetname="copyI18nXml">
<if>
<availablefile="${project.conf}/i18n"<!--如果存在${project.conf}/i18n文件夹就复制到指定文件夹下-->
<then>
<copytodir="${i18nDir}">
<filesetdir="${project.conf}/i18n"/>
</copy>
</then>
</if>
</target>
</project>
相关文章推荐
- Eclipse快速上手指南之使用ANT
- 持续集成工具ant 入门使用指南
- Eclipse快速上手指南之使用ANT
- Eclipse快速上手指南之使用ANT
- 【转载】Ant基本使用指南
- ant 使用指南
- Eclipse快速上手指南之使用ANT
- ant 入门使用指南
- ant 使用指南
- ant 使用指南
- Eclipse快速上手指南之使用Ant
- Eclipse快速上手指南之使用ANT
- Eclipse快速上手指南之使用ANT
- Eclipse快速上手指南之使用ANT
- ant 使用指南---java模块化编译【转】
- 使用Ant编译和构建项目指南
- Ant介绍以及基本使用指南
- Ant使用指南
- <转载>ant使用指南详细入门教程 http://www.jb51.net/article/67041.htm
- Ant使用指南