Ant学习笔记(1) 基础知识
Ant
Apache Ant 是一个基于 Java的构建工具。
下载Ant
google、baidu。Windows用户下载zip格式。解压即可。
Windows安装Ant
Ant本质上是一个Java程序且应用于Java代码的编译,因此为了使用Ant,系统需要好配置JDK。
所谓的安装Ant,即配置环境变量。
- 添加ANT_HOME变量,变量值为Ant的路径。该路径指的是包含bin,lib的文件夹。
- 配置PAHT变量,将【%ANT_HOME%\bin;】添加至环境变量PATH中。可以不配,配置PATH只是为了方便在命令行环境下使用。
注意:Win7下安装时,若ANT_HOME配置在用户变量中,需要以管理员身份打开cmd才可以正常使用。所以,可以把ANT_HOME配置在系统变量中就好了。
通过以上步骤后,在命令行下输入ant -version,即会显示ANT版本号。
基础入门
HelloAnt工程
建立工程目录如下
bin存放二进制脚本。output存放打包后的jar文件。src存放源代码。build.xml文件是Ant脚本。
Java文件:HelloANT.java放到src目录下。
public class HelloANT { public static void main(String[] args) { System.out.println("Hello ANT!!!"); } }
build.xml文件
<project name="HelloANT" default="run"> <!--清空bin、output文件夹--> <target name="delete"> <delete dir="bin" includes="*" /> <delete dir="output" includes="*" /> </target> <!--将src中的java文件编译至bin文件中--> <target name="compile" depends="delete"> <javac srcdir="src" destdir="bin" /> </target> <!--将bin中的class文件打包成jar文件--> <target name="jar" depends="compile"> <jar destfile="output/HelloANT.jar" basedir="bin" /> </target> <!--运行bin文件中的HelloANT.class文件--> <target name="run" depends="jar"> <java dir="bin" classname="HelloANT" classpath="bin" /> </target> </project>
进入命令行,cd至build.xml文件存在的目录中。输入ant命令。
提示“BUILD SUCCESSFUL”,构建成功。
运行输出了“Hello ANT!!!”。
bin目录下生成Hello.class文件。
output目录下生成HelloANT.jar文件。
Ant脚本简介
Ant脚本是一个标准的XML文件,Ant脚本默认文件名为build.xml。
Ant脚本结构
Ant脚本的根元素是project,该元素中可以包含description元素、target元素、property元素和任何Task;target元素中也可以包含若干Task。project元素是Ant构建文件的根元素,它表示一个Ant工程。也即Ant脚本所定义的工程。
Ant脚本的总体结构如图:
ant关键元素
1. project元素
project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会发生错误。在每个 project 元素下,可包含多个 target 元素。接下来向读者展示一下 project 元素的各属性。
- name 属性:用于指定 project 元素的名称。
- default 属性:用于指定 project 默认执行时所执行的 target 的名称。
- basedir 属性:用于指定基路径的位置。该属性没有指定时,使用 Ant 的构件文件的附目录作为基准目录。
- description 属性:该属性指定project描述说明。
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描述说明。
3.task元素
一个task是一段可执行的代码,也即由一个元素表示,元素的名称就是该Task的名称,不同的Task中可以定义不同的属性列表。
Task的通用结构如下:
<name attrubute1=”value1” attribute2=”value2” ... />
或
<name attrubute1=”value1” attribute2=”value2” ... > ... </name>
4. property 元素
property元素用于定义一个变量。
project 的属性可以通过 property 元素来设定,也可以Ant 之外设定。可以引入外部文件中的属性值。例如 build.properties 。
property元素的常用属性:
- name:指定名称。
- value:指定值。
- resource:指定属性文件的资源名称,ant将负责从属性文件中读取属性名和属性值。
- file:指定属性文件的文件名,
- url:指定属性文件的URL地址,
- environment:用于指定系统环境变量的前缀。ant可以访问系统环境变量。
- classpath:指定搜索属性文件的文件和路径集。
- classpathref:指定搜索属性文件的文件和路径集引用,该属性并不是直接给出系列文件或路径,而是给定文件和路径集引用。
使用属性值
使用$符号使用属性值。
例:${builddir}
即输出builddir属性值。
$符号在Ant生成文件中具有特殊意义。若希望Ant把$当成普通字符,则应该使用$$。
例:
<echo>$${builddir}=${buildir}</echo>
输出为:[echo] ${builddir}=dd
Ant 提供了一些内置的属性,它能得到的系统属性的列表与 Java 文档中 System.getPropertis() 方法得到的属性一致,这些系统属性可参考 sun 网站的说明。
同时, Ant 还提供了一些它自己的内置属性,如下:
- basedir:当前工程的根目录,由project的basedir属性定义;
- ant.file:当前构建脚本的绝对路径;
- ant.version:当前运行的Ant 的版本;
- ant.project.name:当前project的名称,即project的name属性值;
- ant.java.version:当前Ant所使用JVM的版本;
- ant.home:当前运行的Ant的根目录,即ANT_HOME的值;
ANT常用Task
ANT提供了非常多的Task,而且每个Task都有较多的属性,所以不会一一列举了。这里只对常用Task的用法作简单说明,并给出简单示例。
编译任务
javac
javac:用于编译一个或多个Java源文件。
- srcdir属性:Java源文件位置。
- destdir属性:编译后的class文件的保存位置。
例:编译{src}目录及其子目录下的所有java文件。class文件将放在{build}指定的目录下,classpath表示需要用到的类文件或者目录,debug设置为on表示输出debug信息。
<javac srcdir="{src}" destdir="{build}" classpath="xyz.jar" debug="on" />
例:编译{src}和{src2}目录及其子目录下的所有。Java文件,但是package/p1/**,mypackage/p2/**将被编译,而mypackage/p1/testpackage/**将不会被编译。Class文件将放在{build}指定的目录下,classpath表示需要用到的类文件或者目录,debug设置为on表示输出debug信息。
<javac srcdir="{src}:{src2}" destdir="{build}" includes="mypackage/p1/**,mypackage/p2/**" excludes="mypackage/p1/testpackage/**" classpath="xyz.jar" debug="on" />
例:路径是在property中定义的。
<property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/> <javac srcdir="{src}" destdir="{src}" classpath="{classpath}" debug="on" />
归档任务(Archive Tasks)
归档任务用于对文件系统中的文件进行打包或解包。
jar
用于生产JAR包,通常需要指定destfile属性,用于指定所创建JAR包的文件名。通常还指定一个文件集,表示需要将哪些文件打包到JAR包里。
例:将{build}/classes下面的所有文件打包到{dist}/lib/app.jar中
<jar destfile="{dist}/lib/app.jar" basedir="{build}/classes"/>
例:将{build}/classes下面的所有文件打包到{dist}/lib/app.jar中,但是包括mypackage/test/所有文件不包括所有的Test.class
<jar destfile="{dist}/lib/app.jar" basedir="{build}/classes" includes="mypackage/test/**" excludes="**/Test.class" />
例:manifest属性指定自己的META-INF/MANIFEST.MF文件,而不是由系统生成。
<jar destfile="{dist}/lib/app.jar" basedir="{build}/classes" includes="mypackage/test/**" excludes="**/Test.class" manifest="my.mf" />
war
该任务用于将一个Web应用打包为一个war文件。
例:假设文件目录如下:
thirdparty/libs/jdbc1.jar
thirdparty/libs/jdbc2.jar
build/main/com/myco/myapp/Servlet.class
src/metadata/myapp.xml
src/html/myapp/index.html
src/jsp/myapp/front.jsp
src/graphics/images/gifs/small/logo.gif
src/graphics/images/gifs/large/logo.gif
下面是任务的内容:
<war destfile="myapp.war" webxml="src/metadata/myapp.xml"> <fileset dir="src/html/myapp"/> <fileset dir="src/jsp/myapp"/> <lib dir="thirdparty/libs"> <exclude name="jdbc1.jar"/> </lib> <classes dir="build/main"/> <zipfileset dir="src/graphics/images/gifs" prefix="images"/> </war>
完成后的结果:
WEB-INF/web.xml
WEB-INF/lib/jdbc2.jar
WEB-INF/classes/com/myco/myapp/Servlet.class
META-INF/MANIFEST.MF
index.html
front.jsp
images/small/logo.gif
images/large/logo.gif
执行任务
java
java:用于运行某个Java类,通常需要classname属性,用于指定需要运行哪个类。
例:classname中指定要执行的类,classpath设定要使用的环境变量
<java classname="test.Main"> <classpath> <pathelement location="dist/test.jar"/> <pathelement path="{java.class.path}"/> </classpath> </java>
文件任务
copy
copy主要用来对文件和目录的复制功能。举例如下:
例:复制单个文件并为复制的文件命名。
<copy file="original.txt" tofile="copied.txt"/>
例:将文件复制到另外的目录。
<copy file="source.txt" todir="../home/philander"/>
例:将一个目录复制到另外一个目录下。
<copy todir="../dest_dir"> <fileset dir="src_dir"/> </copy>
例:拷贝一批文件到指定目录下
<copy todir="../dest/dir"> <fileset dir="src_dir"> <include name="**/*.java"/> <iexclude name="**/Test.java"/> </fileset> </copy> <copy todir="../dest/dir"> <fileset dir="src_dir" excludes="**/*.java"/> </copy>
例:拷贝一批文件到指定目录下,将文件名后增加。Bak后缀
<copy todir="../backup/dir"> <fileset dir="src_dir"/> <mapper type="glob" from="*" to="*.bak"/> </copy>
delete
对文件或目录进行删除,举例如下:
例:删除某个文件。
<delete file="/home/photos/philander.jpg"/>
例:删除某个目录。
<delete dir="/home/photos"/>
例:删除所有的备份目录或空目录。
<delete includeEmptyDirs="true"> <fileset dir="." includes="**/*.bak"/> </delete>
mkdir
创建目录。
例:<mkdir dir="/home/philander/build/classes"/>
move
移动文件或目录,举例如下:
例:移动单个文件。
<move file="sourcefile" todir=”movedir”/>
例:移动单个文件到另一个目录。
<move file="sourcefile" todir=”movedir”/>
例:移动或重命名一个文件
<move file="file.orig" tofile="file.moved"/>
例:移动或重命名一个文件到另一个文件夹下面
<move file="file.orig" todir="dir/to/move/to"/>
例:移动某个目录到另一个目录。
<move todir="newdir"> <fileset dir="olddir"/> </move>
例:将一组文件移动到另外的目录下
<move todir="some/new/dir"> <fileset dir="my/src/dir"> <include name="**/*.jar"/> <exclude name="**/ant.jar"/> </fileset> </move>
例:移动文件过程中增加。Bak后缀
<move todir="my/src/dir"> <fileset dir="my/src/dir"> <exclude name="**/*.bak"/> </fileset> <mapper type="glob" from="*" to="*.bak"/> </move>
其他任务
echo
该任务用于输出指定的消息。默认输出到标准控制台,同时可以通过指定file属性将消息输出到文件中。另外,可以通过level属性指定在哪一站消息级别下输出消息。
echo包括 message 、 file 、 append 和 level 四个属性。
<echo message="Hello,ANT" file="/home/philander/logs/ant.log" append="true">
命令行中的Ant命令
运行Ant构建脚本
先使用cd命令到达目标文件夹下。
ant:该命令会让ant自动搜索当前文件夹下的build.xml。若找到,则以该文件作为生成文件,并执行默认的target。
ant -buildfile a.xml:该命令解析执行当前路径下的a.xml文件。-buildfile可以使用 -f -file代替。
ant -f a.xml:同上。
ant -file a.xml:同上。
运行指定的target
默认情况下下,Ant运行生成文件里指定的默认target。
ant target :运行时指定需要运行的target。
ant target1 target2 :运行多个target。
ant命令的一般格式:
ant [options] [filename] [targer1 [target2 [target3] ...]]
- [options]:是可选配置项。
- [filename]:若文件名为build.xml则该选项可省略。
- [targer1 [target2 [target3] ...]] 表示待执行的Target,可以是任意多个,targer名称之间用空格隔开。
例:ant run
即运行build.xml文件中名称为run的target。
例:ant -f another.xml t1 t2 t3
即运行another.xml文件中名称为t1 t2 t3的target。
options可以分别去以下值:
-help 或 -h
打印ant命令的帮助信息。
-projecthelp 或 -p
打印工程的基本信息,包括工程中的全局Task、Target、default Target等。
-version
打印Ant版本信息并退出。
-diagnostics
打印可以帮助诊断和报告错误的系统信息,包括Ant的版本、Ant系统内建属性的值、Ant库、Java系统的属性、计算机的属性等。
-quiet 或 -q
ant运行时,只打印Task的输出信息和重要的出错信息。让构建脚本安静的执行。
-verbose 或 -v
ant运行时,即打印尽可能详细的信息到输出终端。
-debug 或 -d
执行脚本时打印调试信息,调试信息比使用-v打印的详细信息提供了更丰富的信息。
-emacs 或 -e
对打印信息不作任何修饰。
-lib <path>
指定一个搜索库文件的路径,包括jar文件和class文件。
-logfile 或 -l <file>
ant运行时将提示信息输出到指定文件,而不是直接输出到控制台。
例:
ant -verbose -l a.log 运行时ant生产更多的提示信息,并将提示信息输出到a.log文件中。
-logger <classname>
指定进行日志记录的类。
-listener <classname>
指定一个类,将该类的实例添加为工程的一个监听器。
-noinput
不允许输入交互性质的输入。
-D<property>=<value>
运行ant命令的同时指定属性的值,类似于在运行构建脚本时输入参数。该属性会覆盖脚本中的属性值。
例:
ant -Dbook=Spring2 该命令会覆盖生成文件中的book属性值。
ant -Denv=%ANT_HOME% 该命令使用环境变量的值。通过这种方式就可以将环境变量的值传入生产文件。在Linux平台下改为 ant -Denv1=$ANT_HOME。
-keep-going 或 -k
执行过程中,若在运行某个Target时出错,则继续执行剩余的所有不依赖于出错Target的Target。
-propertyfile <name>
指定一个属性文件,从文件中装载所有属性的值,但若还使用-D指定了相同的属性,则-D指定的属性值具有更高的优先级。
-inputhandler <class>
指定一个类,使用该类处理输入请求。
-find 或 -s <file>
从当前目录逐级向上级目录搜索指定的构建文件直到文件系统的根目录。若没有指定<file>则搜索build.xml,搜索到构建文件后执行构建文件。
-nice number
设置Ant主线程的优先级,0为最低,10为最高,默认为5。
-nouserlib
运行脚本的时候不使用用户目录库中的jar文件。
-noclasspath
运行脚本的时候不使用类路径。
-autoproxy
在Java1.5以上的运行环境中,该设置在运行Ant脚本时自动使用操作系统配置的代理服务器。
-main <class>
指定一个主函数的类,该主函数将覆盖Ant的常规主函数,提供新的运行入口点。
该文仅为学习文档,更多详细资料可参考官方教程