一、ant的作用
用来构建项目,只需要简单的执行命令就可以。 对于个人开发有时候我们从开发到测试到最后打包可能
都是一个人做,并且用一个开发工具就解决这些了,因为大多数开发工具IDE是自带打包功能的。 但是
在实际的公司工作中,开发人员与测试人员、部署人员是分开的,部署人员是不会向开发人员要源代码,
他们也不会打包,那么怎么部署呢? 开发人员开发后,确认没问题,将源代码放到版本控制服务器中,
并且写一个脚本,这个脚本运行就可以自动打包,然后部署人员运行这个文件打包后部署。 那么这个脚
本里面需要关系到目录与加载的文件等,这时候如果每个项目用的文件都不同,目录名字千奇百怪,那么
就不容易统一管理,于是构建工具出现了,它规定你的目录必须要如何定制,这样方便统一管理。 Ant是
比较好的构建工具,但是脚本目录要由自己写,命令中存在依赖关系,编译,打包。编译目录还要自己指
定。
二、ant的特点
1. Ant不像Maven一样,没有正式的约定,项目的目录结构可随意定义。但是你却要明确的告诉Ant,源码在哪里,
编译后的文件放在何处。
2. Ant是一个程序化的工具,你需要明确告诉ant去做什么,什么时候做。如:什么时候去编译,什么时候去复制
,压缩,打包。
3. Ant没有生命周期,所以你需要自己去定义目标之间的关系和依赖,必须手动去为每个项目附上一个任务序列。
三、Ant入门
ant的默认生成文件为build.xml;输入ant后,ant会在当前目录下搜索是否有build.xml,如果有,则执行;当然也可以自定义生成文件,通过ant -f a.xml即可指定a.xml为生成文件;
ant的生成文件是xml文件,整体结构为:
<?xml version="1.0" encoding="GBK"?>
<project default=" targetname">
<target name="name">
</target>
</project>
project是生成文件的根元素,表示一个工程;
target是project的子元素,表示一个任务;一个project中可以定义多个target元素,表示多个任务;
default属性表示默认执行的target,如果ant命令没有指定target,则执行default的target;
ant targetname;则会执行此target,而忽略default设置的target;
注意:不能有两个相同的targetname;
代码举例:创建并删除hello目录;
<?xml version="1.0" encoding="gbk"?>
<project default="delete">
<property name="name" value="xiazdong"/>
<target name="delete" depends="mkdir">
<delete dir="${name}"/>
</target>
<target name="mkdir">
<mkdir dir="${name}"/>
</target>
</project>
四、Ant的XML元素详解
1.<project>元素
是Ant生成文件的根元素;一般形式如:
<project default=" "[ basedir="." ] [name="projectname"]>
(1)default的值是默认执行的target名;
(2)basedir是指定基准目录,一般都是basedir="."
(3)name是指工程名字;
2.<target>元素
是project元素的子元素,在project元素中能够有多个target,一个target标签可以依赖其他的target;一般形式如下:
<target name=" " [ depends=" A "] [ if =" prop1 "] [ unless=" prop2"]>
</target>
(1)name表示target的名称;
(2)depends中填写其他target名称(可以有多个名称,用逗号分割),若依赖A,如果执行此target,则会先执行A;
(3)表示仅当属性设置时才执行此target;
(4)unless表示只有没有设置该属性名,才能执行此target;
3.<property>元素
是project的子元素;property用于定义属性,一般形如:
(1)<property name=" pname " value=" pvalue "/>
如果要使用此property,则需要${pname};类似于表达式语言;
(2)<property file="a.properties"/> 通过此属性文件导入属性;
如果单纯想使用$,则通过$$表示;
五、Task介绍
在Ant中Task是target的子元素,即一个target中可以有多个task;而Task分为:
(1)核心Task;
(2)可选Task;
(3)自定义Task;
下面介绍一些常用的核心Task;
1.<echo>
用于单纯输出,一般形如:
<echo> </echo>
举例:<echo>hello</echo>
2.<javac>
用于编译java文件,一般形式如下:
<javac srcdir=" src " destdir=" class " [classpath=" "]/>;
(1).srcdir表示源程序的目录。
(2).destdir表示class文件的输出目录。
(3).include表示被编译的文件的模式。
(4).excludes表示被排除的文件的模式。
(5).classpath表示所使用的类路径。
(6).debug表示包含的调试信息。
(7).optimize表示是否使用优化。
(8).verbose 表示提供详细的输出信息。
(9).fileonerror表示当碰到错误就自动停止。
3.<java>
运行java类,一般形式如下:
<java classname=" " fork="yes">
【<arg line="param1 param2 param3"/>】
</java>
(1).classname 表示将执行的类名。
(2).jar表示包含该类的JAR文件名。
(3).classpath所表示用到的类路径。
(4).fork表示在一个新的虚拟机中运行该类。
(5).failonerror表示当出现错误时自动停止。
(6).output 表示输出文件。
(7).append表示追加或者覆盖默认文件。
4.<jar>
打包成jar包;一般形式如下:
<jar destfile=" main.jar" basedir=" ">
<manifest>
<attribute name="Main-Class" value="classname"/> <!--指定主类-->
</manifest>
</jar>
(1) destfile表示JAR文件名。
(2) basedir表示被归档的文件名。
(3) includes表示别归档的文件模式。
(4) exchudes表示被排除的文件模式。
5.<mkdir>
创建目录,可以多层创建,比如a\b\c,则可以连续创建,一般形式如下:
<mkdir dir="a\b"/>
6.<delete>
删除目录,一般形式如下:
<delete dir="a\b"/> 可以删除a目录下的b目录;
<delete file="1.txt"/>可以删除文件;
7.<tstamp>
时间戳,一般形式如下:
<tstamp />
接下来可以使用${DSTAMP}进行调用当前时间;
8.<copy>
复制文件,一般形式如下:
<copy file="file1" tofile="file2"/>
file是源文件;
tofile是目标文件;
9.<move>
移动文件,一般形式如下:
<move file="file1" tofile="file2"/>
file是源文件;
tofile是目标文件;
10.<replace>
用于替换字符串,类似于String的replace操作,一般形式如下:
<replace file="filename" token="old" value="new"/>
file表示要执行替换的文件;
token表示被替换的字符串;
value表示替换的字符串;
六、ant.xml案例
代码举例:一般项目中的ant结构
<project default="init">
<property name="src" value="src"/>
<property name="classes" value="classes"/>
<property name="dest" value="dest"/>
<path id="classpath">
<pathelement path="${classes}"/>
</path>
<target name="help">
<echo>help -打印帮助信息</echo>
<echo>compile -编译java源文件</echo>
<echo>run -运行程序</echo>
<echo>build -打成jar包</echo>
<echo>clean -清楚全部编译生成文件</echo>
</target>
<target name="compile">
<delete dir="${classes}"/>
<mkdir dir="${classes}"/>
<javac srcdir="${src}" destdir="${classes}"/>
</target>
<target name="run" depends="compile">
<java classname="org.xiazdong.Test" fork="yes">
<classpath path="${classes}"/>
</java>
</target>
<target name="build" depends="run">
<delete dir="${dest}"/>
<mkdir dir="${dest}"/>
<jar destfile="${dest}/Test.jar" basedir="${classes}">
<manifest>
<attribute name="Main-Class" value="org.xiazdong.Test"/>
</manifest>
</jar>
</target>
<target name="clean">
<delete dir="${classes}"/>
<delete dir="${dest}"/>
</target>
</project>
七、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
Windows 下的安装:
下载后解压到某个目录我这里以D:\apache-ant-1.7.1为例子:
添加path全局环境变量:D:\apache-ant-1.7.1\bin
这样在command line就可以运行ant命令了
测试:运行->cmd/command->ant 如果没有安装成功则回报找不到这个命令,安装成功会有相关的提示信息显示。
这样执行ant 后,如果不指定配置文件ant会缺省找build.xml这个配置文件,并根据配置文件执行任务,缺省的任务设置可以指向最常用的任
务,比如: build,或指向打印帮助信息:usage,告诉用户有那些脚本选项可以使用。
七.Ant的运行
安装好Ant并且配置好路径之后,在命令行中切换到构建文件的目录,输入Ant命令就可以运行Ant.若没有指定任何参数,Ant会在当前目录下
查询build.xml文件。如果找到了就用该文件作为构建文件。如果使用了 –find 选项,Ant 就会在上级目录中找构建文件,直至到达文件系统
的根目录。如果构建文件的名字不是build.xml ,则Ant运行的时候就可以使用 –buildfile file,这里file 指定了要使用的构建文件的名称,
示例如下:
Ant如下说明了表示当前目录的构建文件为build.xml 运行 ant 执行默认的目标。
Ant –buildfile test.xml
使用当前目录下的test.xml 文件运行Ant ,执行默认的目标