一、Ant简介
Ant是一个Apache基金会下的跨平台的构件工具。由于Ant是基于Java的,所以需要Java环境的支持。
如果配置了环境变量,则可以直接使用了,否则必须在运行前指定一下运行路径,如下:
Windows环境下:
set ANT_HOME=ant的安装目录的根目录Linux或Unix环境下:
set JAVA_HOME=JDK安装的根目录
set PATH=%PATH%;%ANT_HOME%\bin;
export ANT_HOME=ant的安装目录的根目录
export JAVA_HOME=JDK安装的根目录
export PATH=${PATH}:${ANT_HOME}/bin;
1.1 第一个小程序
我已经配置了环境变量,以及Java环境的搭建(这部分很简单),所以我直接使用了。预备知识:
- Ant工具的配置文件采用XML任务树的形式。
- 运行时没有指定文件名,则会自动搜索build.xml文件。
创建FirstTestAnt.xml
<?xml version="1.0" encoding="UTF-8"?>运行及运行结果:
<project name="first ant example" default="firstExample">
<target name="firstExample">
<echo message="这是一个简单的Ant实例"></echo>
<echo message="操作系统为:${os.name}"></echo>
<echo message="根目录为:${basedir}"></echo>
<echo message="ant文件的信息:${ant.file}"></echo>
<echo message="ant的版本:${ant.version}"></echo>
<echo message="项目的名称:${ant.project.name}"></echo>
<echo message="Java的版本:${ant.java.version}"></echo>
</target>
</project>
D:\360极速浏览器下载>ant -f FirstTestAnt.xml注意事项:就是文件的存储格式,最好文件另存一下,将文件的格式设置为UTF-8,有一定开发经验的人,应该熟悉字符集的概念。
Buildfile: D:\360极速浏览器下载\FirstTestAnt.xml
firstExample:
[echo] 这是一个简单的Ant实例
[echo] 操作系统为:Windows 8.1
[echo] 根目录为:D:\360极速浏览器下载
[echo] ant文件的信息:D:\360极速浏览器下载\FirstTestAnt.xml
[echo] ant的版本:Apache Ant(TM) version 1.9.7 compiled on April 9 2016
[echo] 项目的名称:first ant example
[echo] Java的版本:1.8
BUILD SUCCESSFUL
Total time: 0 seconds
如果文件名是build.xml就直接在当前的目录下直接使用ant命令即可。
Ant工具一般不直接使用,会跟其它工具整合,当然在此就是基础的夯实,所以不过多介绍。
二、Ant配置文件
2.1 Ant构件文件
Ant的构件文件是基于XML的方式进行编写的,其默认的名称为build.xm,当然也可以取别的文件名称(此时要在构建时指定具体的构件文件名称)。 在Ant工具中,每一个构件文件中必须包含一个project元素,project元素作为XML树的根节点。一个project元素可以包含多个target元素作为叶子节点,每一个target元素可看作Ant工具的基本执行单元,同时在target单元之间可存在或定义依赖关系。在每一个target中可包含多个具体执行的元素(也可看作Ant任务),可执行的元素定义了这个操作具体要做的事情。
2.2 project元素
project元素是Ant构件文件中的根元素,Ant构件文件至少应该包含一个project元素。在project元素下可定义一个或多个target元素。当运行Ant工具时,可以选择执行project元素下的一个或多个target。如果没有指定要具体执行的target,则Ant会执行project元素中定义的默认的target。
在Ant工具中,一个project元素包含3个属性:name、default和basedir。这三个属性不是必须的,可以根据项目的需要进行选择。
2.2.1 name属性
name属性的作用就是给project元素起一个名字。
2.2.2 default属性
default属性用于指定project默认执行时所执行的target。Ant从1.6.0版本后,每个project元素里都包含一个隐藏的target元素,这个隐藏的target元素包含所有构件文件中*的ant tasks和ant types。
运行Ant工具时加入-projecthelp选项,这个隐藏的target会在project初始化时被执行。(疑问:有何用,难道只是显示所有的target吗?)
测试文件ceshi.xml:
<?xml version="1.0" encoding="UTF-8"?>运行结果:
<project name="first ant example" default="firstExample">
<target name="firstExample">
<echo message="这是一个简单的Ant实例"></echo>
</target>
<target name="A">
<echo message="这是A"></echo>
</target>
</project>
D:\360极速浏览器下载>ant -f ceshi.xml
Buildfile: D:\360极速浏览器下载\ceshi.xml
firstExample:
[echo] 这是一个简单的Ant实例
BUILD SUCCESSFUL
Total time: 0 seconds
D:\360极速浏览器下载>ant -f ceshi.xml A
Buildfile: D:\360极速浏览器下载\ceshi.xml
A:
[echo] 这是A
BUILD SUCCESSFUL
Total time: 0 seconds
D:\360极速浏览器下载>ant -f ceshi.xml -projecthelp
Buildfile: D:\360极速浏览器下载\ceshi.xml
Main targets:
Other targets:
A
firstExample
Default target: firstExample
2.2.3 basedir属性
basedir属性在Ant工具中用于指定基路径的位置。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果该属性以及basedirproperty都没有设定,则Ant就是用构件文件的父目录作为基准目录。在Ant的target元素中可以通过${basedir}来获取基目录的位置。基路径可以这样理解:就是文件中其他部分所有相对路径的起始路径,或者说调用${basedir}时的使用路径。
2.2.4 description子元素
description属性对于对project及其内容进行相关说明。当Ant运行时,加上-projecthelp选项,命令行中就会输出description属性中的说明信息。
<?xml version="1.0" encoding="UTF-8"?>
<project name="first ant example" >
<description>
描述信息:这是一个简单的Ant实例。
</description>
<target name="A">
<echo message="实例A"></echo>
</target>
</project>
2.3 target元素
target元素是Ant工具的基本执行单元,每个target里包含一个或多个具体的操作。一个target可以依赖于其他的一个或多个target。target包含5个基本属性:name、depends、if、unless、和description。2.3.1 name属性
name属性就是target元素的名称。每一个target元素必须要有一个name属性且name值必须唯一。
当要执行具体的target元素时就通过名称指定。
注意事项:据Ant工具的文档上的说明,name建议避免使用逗号“,”和空格“ ”。这些符号可能在以后的Ant版本中不能再使用,因为在整合集成工具(如Eclipse)时,这些符号可能会产生冲突,因为在开发工具中他们可能有特殊的用途。
在我使用的Ant中测试结果为:空格和逗号都是执行多个target的分隔符。
2.3.2 depends属性
depends属性用于描述target间的依赖关系。depends中可以是一个或多个target元素名称,多个target元素名称使用逗号“,”来分割。
Ant工具的depends属性只指定了target元素间被执行的顺序关系。如果当前的target元素无法运行,但这种depends关系对于这个target元素所依赖的其他target元素并没有影响,这些被依赖的target元素会被正常执行。
Ant会依照Depends属性中target出现的顺序(从左到右)依次执行每个target。
注意事项:某个target元素依赖于一个target元素,后者就会被限制性。
示例一:
<?xml version="1.0" encoding="UTF-8"?>示例二:
<project name="depends ceshi" default="C">
<description>
描述信息:这是一个简单叙述依赖执行顺序的Ant实例。
</description>
<target name="A">
<echo message="实例A"></echo>
</target>
<target name="B">
<echo message="实例B"></echo>
</target>
<target name="C" depends="A,B">
<echo message="实例C"></echo>
</target>
</project>
<?xml version="1.0" encoding="UTF-8"?>这两个示例的运行结果相同:
<project name="depends ceshi" default="C">
<description>
描述信息:这是一个简单叙述依赖执行顺序的Ant实例。
</description>
<target name="A">
<echo message="实例A"></echo>
</target>
<target name="B" depends="A">
<echo message="实例B"></echo>
</target>
<target name="C" depends="B">
<echo message="实例C"></echo>
</target>
</project>
D:\360极速浏览器下载>ant -f ceshi.xml
Buildfile: D:\360极速浏览器下载\ceshi.xml
A:
[echo] 实例A
B:
[echo] 实例B
C:
[echo] 实例C
BUILD SUCCESSFUL
Total time: 0 seconds
2.3.3 if属性
if属性主要用于验证在执行target前所必须设定的属性。如果if指定的属性没有被设定(也就是不存在),那么这个target不会被执行。
例如:要验证系统是否安装了JDK,若安装了JDK就输出JDK的版本。
<?xml version="1.0" encoding="UTF-8"?>运行结果:
<project name="if ceshi" >
<target name="checkJavaVersion" if="ant.java.version">
<echo message="Java的版本为:${ant.java.version}" />
</target>
<target name="linshi" if="a">
<echo message="我不应该出现的!" />
</target>
</project>
D:\360极速浏览器下载>ant -f ceshi.xml checkJavaVersion linshi可以看出,a这个变量值不存在,所以linshi这个target没有运行。
Buildfile: D:\360极速浏览器下载\ceshi.xml
checkJavaVersion:
[echo] Java的版本为:1.8
linshi:
BUILD SUCCESSFUL
Total time: 0 seconds
2.3.4 unless属性
unless属性的功能与if属性功能正好相反。也就是说,如果unless属性中指定的属性没有被设定,那么这个target元素将会被执行。注意:if和unless属性只能限定本target元素的功能是否被执行,但是它们并不能限制这个target依赖的target的执行。
简单来说:<target name="targetA" depends="targetB" if="Aproperty">,同时Aproperty没有被设定,当执行targetA时,虽然targetA不会被执行,但是targetB会正常地被执行。
2.3.5 description属性
是一个描述性的子元素,使用-projecthelp可以查看,但是都会被提取到全局描述,但是通过向description中添加描述,使用户能够更好地了解这个target元素要执行的功能,这是一个良好的习惯。
<?xml version="1.0" encoding="UTF-8"?>
<project name="if ceshi" >
<target name="linshi" if="a">
<description>
我爱你中国
</description>
<echo message="我是测试结果!" />
</target>
</project>
2.4 task和property元素
task元素是Ant工具执行的功能单元,可以看作是一段可执行的代码。property元素可以看作是一个名字和一个值得对应关系,用于定义一些需要用到的变量。task和property都可在target中整合使用。2.4.1 task元素详解
task在我理解看来,是一种泛称,并不是一个具体的标签名,task是一段可执行的代码,在task内封装了执行的细节。每个task可以有一个或多个属性,下面介绍的property元素就是task的一种。我是这样理解的task就是一个任务。Ant提供了大量的核心task和可选task,除此之外,Ant还允许用户定义自己的task,这大大扩展了Ant的功能。
更加详细的介绍,可以参考:
收集资料:Ant的任务(task)
注意:如果task没有被执行的情况下,设定的属性将不会生效。如果用户在task执行后进行这些设定,那么task中原本的这些属性将会被覆盖。
2.4.2 property元素详解
property元素可看作变量或参数的定义,在一个project中可以有很多属性(properties)。可以在构件文件中用property,也可以在Ant之外进行设定。例如,可以建立一个独立的build.property文件用于放置编辑时所必须的property元素,然后在构件文件中引用此文件。这样便于对property task进行统一管理。
具体的引用方式如下:
<property file="build.properties"/>
每个property元素有一个名字和一个值。property元素可用作task的属性值。在task中是通过将属性名放在“${”和“}”之间,并放在task属性值的位置来实现的。
Ant工具提供了一些内置的属性,可以直接引用。例如:${os.name}对应当前操作系统的名称。Ant可以得到的系统属性的列表与Java文档中System.getProperties()方法能得到的属性一直。
除了Java的系统属性,Ant还定义了一些自己的内置属性。如下:
- basedir:project基目录的绝对路径(与<project>的basedir属性一样)
- ant.file:buildfile的绝对路径
- ant.version:Ant的版本
- ant.project.name:当前执行的project的名字,由<project>的name属性设定
- ant.java.version:Ant检测到的JVM的版本
一个简单完整的Ant工具构件Java项目的实例:
<?xml version="1.0"?>MyProject是一个常用的构件文件,这个构件文件的作用是对项目的源文件进行编译,并打包生成jar文件。
<project name="MyProject" default="dist" basedir=".">
<property name="src" value="."/>
<property name="build" value="build"/>
<property name="dist" value="dist"/>
<!-- 初始化target建立一个用于存放class文件的目录 -->
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<!-- 编译源文件 -->
<target name="compile" depends="init">
<!-- 编译${src}目录下的源文件,生成的class文件存放到${build}目录中 -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile">
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- 把所有${build}目录下的class文件打包到MyProject-${DSTAMP}.jar 文件中 -->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean">
<!-- 删除${build}和${dist}目录下的所有文件和目录 -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
上面的property在target元素中被引用。其中,src是源文件的根目录,build是编译时的目录,dist就是打包时的目录。在构件文件中tstamp用于获取当前的时间,mkdir用于建立目录,javac用于编译Java程序,jar用于打包jar程序,delete用于删除目录,这些都是Ant工具内置的功能task。
在上面的构件文件中,init这个target的作用是进行初始化工作,创建build目录;compile target的作用是对Java程序的源代码进行编译,同时依赖于init target,并在init执行后执行;dist target的作用是打包生成jar文件,依赖于compile target;clean target的作用是删除已经打包的jar程序。
2.5 token filters元素详解
token(标记符)也是一种泛称,在一个project元素中可以有很多tokens,我的理解就是一种标记符过滤器(不知对错)。通常tokens采取@token@的形式,其中token是filter task中设定的token名称,而@为默认的token开始喝结束符。
另外,如果一个文件中发现一个@token@形式的token,但没有filter与这个token关联,那么是不会发生任何作用(不进行过滤行为)的。
2.5.1 path-like结构
这种结构通常在定义path和classpath元素时使用,可称为路径匹配。如果在构件文件中可以使用“:”和“;”作为分隔符,指定对path和classpath元素的引用。那么,Ant工具会自动把分隔符转换为当前系统所使用的分隔符,然后进行分割。当需要制定类库的路径时,也可以使用嵌套元素。
《暂时还有点不明白》
2.5.2 命令行变量
命令行变量是指在命令行模式中传入的参数,而这些传入的参数可以在执行的程序或命令中使用。在Ant工具中有些task可接收参数,并将其传递给另一个进程。为了能在变量中包含空格子夫,可包含空格字符,可使用嵌套的arg元素。
arg元素具有以下属性:
- value:一个命令行变量,可包含空格字符,但只能用一个
- line:空格分隔的命令行变量列表
- file:作为命令行变量的文件路径,被文件绝对路径替代
- path:可作为单个命令行变量的path-like字符串,也可作为分隔符,Ant会将其转变为特定平台的分隔符。
<arg values="-l -a"/>是一个含有空格的单个命令行变量
<arg line="-l -a"/>是两个空格分割的命令行变量
<arg path="/dir;/dir2:\dir3"/>是一个命令行变量,其值在DOS系统为\dir;\dir2\dir3;在UNIX系统为/dir:/dir2:dir3。 构件文件中的id属性可用来引用这些元素。如果需要重复地复制相同的XML代码块,这个属性就很有用。如多次使用<classpath>元素。
《暂时还有点不明白》
三、Ant运行
Ant工具有两种常用的运行方式:一是在命令行直接运行,另一种是在支持Ant工具的集成开发环境(IDE)中运行。当前博客重点是命令行。
3.1 在命令行运行Ant工具
开篇就已经进行了介绍,再次简单说明。如果将Ant的bin目录设定到环境变量中,就可以运行Ant工具了,否则必须得设定临时环境变量,才能运行。如果都没有,系统将找不到Ant工具。
输入Ant命令而不输入其他选项时,Ant会在当前目录中查找build.xml文件,并执行project元素中default属性指定的target。
3.2 常用Ant命令选项
3.2.1 buildfile选项
利用Ant工具进行开发时,Ant的构件文件名称可能不是build.xml或者目录不在当前目录,但需要在当前目录执行Ant命令。这时可以在执行ant命令时加上-buildfile的参数选项来指定具体要执行的构件文件位置。这里的-buildfile选项用于指定具体要执行的构件,可指定文件名加路径。
-buildfile的简称可以写成-file或-f,执行效果是相同的。
3.2.2 projecthelp
projecthelp选项输出项目的描述信息和项目target的列表。如果想在执行构件文件之前了解构件文件包含哪些功能,可以添加此选项。
先列出有描述的target,然后再列出没有描述的target。也可以用-p选项代替-projecthelp,两者作用等同。
3.2.3 -D<property>=<value>选项
该选项可以让用户设定一些属性,以覆盖构件文件中指定的属性值。
同样地,可以用这种办法来制定一些环境变量的值。可以用property task来存取环境变量,只需要把-DMYVAR=%MYVAR%(Windows)或-DMYVAR=$MYVAR(UNIX)传递给Ant工具就可以在构件文件中通过${MYVAR}来引用这些设定的环境变量。
3.3 Ant命令行选项总结
- -help,-h:显示Ant命令的帮助信息
- -projecthelp,-p:显示当前project的帮助信息,主要是project中包含的target
- -version:显示Ant的版本信息
- -diagnostics:显示Ant项目的运行环境、依赖库等信息,为错误诊断和报告提供一些有用的帮助信息
- -quiet,-q:隐藏Ant执行时的提示信息输出。命令行将不会输出具体target的执行信息
- -verbose,-v:显示Ant执行的详细信息,包括操作系统和Java环境等信息
- -debug,-d:显示Ant执行时的调试信息、详细的log信息
- -emacs,-e:显示不经修饰的日志信息,就是说不输出额外的日志信息
- -lib<path>:指定一个类库所在的位置(jar文件的位置),让Ant工具可以使用这些类文件。path类型指定类库的位置
- -logfile<file>,-l<file>:指定Ant执行时日志输出文件,让日志输出到指定文件而不在命令行输出。
- -logger<classname>:指定要输入日志信息的类名,指定的类都将会输入日志信息
- -listener<classname>:指定一个类作为这个project的监听器
- -noinput:表示不能接受输入信息
- -buildfile<file>,-file<file>,-f<file>:指定要执行的构件文件的位置及名称
- -D<property>=<value>:用于设定一些变量,这些变量可以再target中直接引用,或覆盖已设定的属性值
- -keep-going,-k:当执行所有的target时不需要使用depends设定依赖关系
- -propertyfile<name>:引用指定的属性文件中的属性,若同时指定-D<property>=<value>,则-D指定的属性优先。
- -inputhandler<class>:指定一个类来处理输入的请求
- -find<file>,-s<file>:查找构件文件,并执行找到的构件文件
- -nice number:设定主线程的数目,number为指定的数目。默认时主线程总数为5,最小值为1,最大值为10
- -nouserlib:运行Ant时不使用${user.home}/.ant/lib下的jar库
- -noclasspath:运行Ant时不使用classpath变量中指定的类路径。
3.4 Ant中使用环境变量和Java系统属性
3.4.1 Ant中使用环境变量
- JAVACMD:若配置了JAVACMD,Ant工具会以JAVACMD来替代JAVA_HOME。换句话说,你想换一个系统默认的java环境来编译项目时,可以设置JAVACMD这个环境变量。
- ANT_OPTS:用于设置Java的优化属性,作用相当于在Ant工具中直接设定JAVA_OPTS参数。如果要设定JAVA堆栈大小就可用这个环境变量进行设置
- ANT_ARGS:用于设置Ant工具的命令行参数。例如,可以设定ANT_ARGS指向多个不同的日志文件
3.4.2 Java系统属性
在Ant工具中可以直接使用Java的系统属性,这些属性与Java System类中定义的一致。
可以参考Java API中的java.lang.System的getProperties方法:
键 | 相关值的描述 |
---|---|
java.version |
Java 运行时环境版本 |
java.vendor |
Java 运行时环境供应商 |
java.vendor.url |
Java 供应商的 URL |
java.home |
Java 安装目录 |
java.vm.specification.version |
Java 虚拟机规范版本 |
java.vm.specification.vendor |
Java 虚拟机规范供应商 |
java.vm.specification.name |
Java 虚拟机规范名称 |
java.vm.version |
Java 虚拟机实现版本 |
java.vm.vendor |
Java 虚拟机实现供应商 |
java.vm.name |
Java 虚拟机实现名称 |
java.specification.version |
Java 运行时环境规范版本 |
java.specification.vendor |
Java 运行时环境规范供应商 |
java.specification.name |
Java 运行时环境规范名称 |
java.class.version |
Java 类格式版本号 |
java.class.path |
Java 类路径 |
java.library.path |
加载库时搜索的路径列表 |
java.io.tmpdir |
默认的临时文件路径 |
java.compiler |
要使用的 JIT 编译器的名称 |
java.ext.dirs |
一个或多个扩展目录的路径 |
os.name |
操作系统的名称 |
os.arch |
操作系统的架构 |
os.version |
操作系统的版本 |
file.separator |
文件分隔符(在 UNIX 系统中是“/”) |
path.separator |
路径分隔符(在 UNIX 系统中是“:”) |
line.separator |
行分隔符(在 UNIX 系统中是“/n”) |
user.name |
用户的账户名称 |
user.home |
用户的主目录 |
user.dir |
用户的当前工作目录 |
常用到的系统属性:
- path.separator:路径分隔符,UNIX和Windows不同
- ant.home:Ant工具根目录的位置
- basedir:执行构件文件的调用目录
- os.name:操作系统的名称
- line.separator:换行符
- java.home:Java的根目录位置
- java.version:Java的版本
- user.home:用户的home目录,在Linux和UNIX中经常用到
- java.class.path:Java库文件的位置
  
参考资料:
《Ant开发及整合应用详解》
博客发表时间:2016-12-07 00:12
最后修改时间:2016年12月9日18:04:49
********************************************************************************结束语********************************************************************************************
我在写这篇博客的时候也是一名初学者,有任何疑问或问题请留言,或发邮件也可以,邮箱为:577328725@qq.com,我会尽早的进行更正及更改。
在我写过的博客中有两篇博客是对资源的整理,可能对大家都有帮助,大家有兴趣的话可以看看!!
下载资料整理——目录:http://blog.csdn.net/fanxiaobin577328725/article/details/51894331
这篇博客里面是我关于我见到的感觉不错的好资源的整理,里面包含了书籍及源代码以及个人搜索的一些资源,如果有兴趣的可以看看,我会一直对其进行更新和添加。
优秀的文章&优秀的学习网站之收集手册:http://blog.csdn.net/fanxiaobin577328725/article/details/52753638
这篇博客里面是我对于我读过的,并且感觉有意义的文章的收集整理,纯粹的个人爱好,大家感觉有兴趣的可以阅读一下,我也会时常的对其进行更新。
********************************************************************************感谢********************************************************************************************