Ant 学习笔记
一、Ant安装和配置
- 下载ant发布包
- 解压缩到一个目录即可
- 将该目录下的子目录bin添加到PATH环境变量中
二、Ant入门
ant的使用非常简单,安装好ant后,在构建文件中(默认名字为build.xml)配置好构建任务,然后调用ant命令,配置的任务就开始执行了。
1. 编写构建文件
创建一个用于编译和打包Java项目的配置文件build.xml,默认为build.xml,也可以自己随便起,执行的时候使用-f 选项指定这个文件即可:
<?xml version="1.0" encoding="UTF-8" ?>
<project name="AntDemo" default="compile" basedir=".">
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="build.classes" value="${build.dir}/classes"/>
<property name="build.lib" value="${build.dir}/lib"/>
<target name="prepare" description="xxxxxxx">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes}"/>
<mkdir dir="${build.lib}"/>
</target>
<target name="clean" description="xxxxx">
<delete dir="${build.fir}"/>
</target>
<target name="compile" depends="prepare" descriptoin="xxxxxxxxx">
<javac srcdir="${src.dir}" destdir="${build.classes}"/>
</target>
<target name="jar" depends="compile" descriptoin="xxxxxxxxx">
<jar jarfile="${build.lib/antDemo.jar}" basedir="${build.classes}" excludes="**/*Test.class"/>
</target>
<target name="all" depends="clean, jar"/>
</project>
配置文件,保证是一个合法的XML文件并且使用了正确的标签和属性,就可以使用Ant运行。
根据这个配置文件可以看出,Ant把任何任务分成3层(工程-目标-任务)
- 最基层的 Project
- 目标 Target:可以在ant命令中调用的基本单位,如clean, compile, jar等。在命令行可以这样调用 ant clean 或 ant clean jar。Target之间可以存在依赖关系,一个Target执行前会先执行它依赖的那些Target。Project可以设置默认的Target,ant命令中不指定任何Target时就调用这个默认的。
- 任务Task:各种Task可以执行各种不同的具体任务,如mkdir,delete,javac,jar等。
Task详细说明可以查看官方文档: http://ant.apache.org/manual/tasklist.html
Ant文件中用Property标签配置属性值,在定义之后的其他地方就可以引用,避免硬编码。
所有的构建文件有且仅有一个<project>元素,其中至少要有一个<target>元素。
2. 运行Ant
ant命令语法格式如下:
ant [option] [target]
调用ant时默认全在当前目录中查找默认的构建文件名:build.xml
也可以用ant -f mybuild.xml的方式手动指定构建文件
以上面的构建配置文件为例,下面的几种调用都可以:
ant 调用默认构建文件(build.xml)中的默认目标(compile) ant -f mybuild.xml jar 调用构建文件mybuild.xml中的jar目标 ant clean jar 调用默认构建文件(build.xml)中的clean和jar目标。需要注意多个目标会按调用先后顺序执行。如果调用ant jar clean就是先编译打包(jar),然后全清理掉(clean),就白干了。
Ant执行时会按执行顺序显示每个Target的名字,也会显示每个任务的名字([任务名])和任务中输出的信息。
3. 查看构建文件所有目标
ant [-f BUILDFILE] -projecthelp
使用这个命令可以列出构建文件中的所有目标和description信息。
4. Ant命令选项
- -h, -help 查看帮助信息
- -p, -projecthelp 查看构建文件中的所有目标信息
- -version 显示Ant版本
- -q, -quiet 抑制并非由构建文件中echo任务所产生的大多数输出消息
- -S, -silent 只显示Task输出和构建失败信息
- -v, -verbose 显示构建过程中每个操作的详细消息, 不能和-debug同时使用
- -d, -debug 显示Ant和任务开发人员已经标志位调试信息的消息。不能与-verbose同时使用
- -e, -emacs 对日志消息进行格式化,使其能够Emacs的shell模式解析。具体就是打印任务消息时不缩排也不输出前面的 [任务名]
- -diagnostics 显示对调试有用的信息
- -f <file>, -buildfile <file>, -file <file> 指定一个构建文件,而不是使用默认的build.xml
- -D<property>=<value> 通过命令行向构建过程中传递属性值
- -propertyfile <propertyfile> 从property文件中加载属性值并传递到构建过程
- -s <file>, -find <file> 指定Ant应当使用的构建文件,如果指定的filename文件在当前目录中没找到,就到父目录中进行搜索,直到到达文件系统的根,还找不到则构建失败。
- -k, -keep-going 执行不依赖失败目标的所有目标。
- -lib <path> 指定查找jars和classes的目录
- -l <file>, -logfile <file> 将日志重定向到指定文件
- -logger <class> 指定一个类来处理Ant的日志记录。该类必须实现了org.apache.tools.ant.BuildLogger接口
- -listener <class> 为Ant设置一个监听类,将其增加到Ant的监听器列表中。Ant与IDE或其他程序集成时非常有用,后面会专门写这个。
- -inputhandler <class> 指定用于处理输入请求的类
- -main <class> 覆盖Ant正常的入口点
- -noinput 不允许交互式输入
- -autoproxy Java1.5+,使用OS的代理设置
- -nice number
- -nouserlib
- -noclasspath
三、构建文件
1.Ant的构建块
Project(工程) 任何构建文件的第一个元素必须是<project>标签,而且只能有一个。
- name属性 工程的名字,也是构建文件的标识符。
- default属性 运行Ant不指定Target时,默认执行的Target。可以设置成一个构建文件中定义的Target名字。推荐默认Target显示构建文件的帮助信息或者执行完成的构建。
- basedir属性 定义工程的根目录,一般情况下都是" . ",也就是构建文件所在的目录(不是运行Ant命令是的目录)。在一个多层次的项目中,basedir还可以定义不同的参考点。
Target(目标) 一个Project可以包含多个Target,一个总的任务过程可以拆分成几个target,每个Target可以单独调用。可以把target理解成能够单独执行的一个个步骤(阶段)。具体怎么拆分这个总任务,拆分粒度是粗还是细,把哪些Task放在哪几个Target中,都是编写构建文件要考虑的问题。一般来说,粒度更小可以更灵活的组合,有些target失败也不会影响另一些的执行。但是粒度也不能太小,太小了会很琐碎不好维护。
- name属性
- depends属性
- description属性
Task(任务) 任务是构建文件中的最小构建单位。通过Target把一个总过程组织成了几个大的Target目标(步骤),但是Target并不做任何具体的工作,Target下面有包含一些Task,所有的具体工作都是靠这些task来完成。Ant提供非常多的Task,如编译,大包,文件系统操作等等。Ant中每个任务对应于Ant对象模型中的一个Java对象,要自定义新的任务就是要编写执行该任务类然后提供给Ant调用。很多系统命令也都是用Task包装,而不是直接调用shell命令,在不同的操作系统上Task的使用方式是完全一致的。
构建文件中任务标签内部也可以有很多层次。但是Task内部的这些层次结构和Java类的层次结构没有任何关系了。
Task标签不再有统一的属性和子元素,内部层次完全取决于具体的任务。
2. 数据元素
保存数据的变量和抽象数据类型。数据元素有两类:Property和DateType
Property:
表示字符串的“键-值”对;使用${propName}的形式引用Property数据。