Ant是一个Apache基金会下的跨平台的构件工具。
由于Ant是基于Java的,所以需要Java环境的支持,也就是配置好 JAVA_HOME 和 ANT_HOME 环境变量分别指向Java和Ant目录,并将${ANT_HOME}/bin (Unix) 或 %ANT_HOME%/bin (Windows) 配置到PATH中。
如果配置了Java及Ant环境变量,则可以直接使用了,否则必须在运行前指定其运行路径。
Windows环境:
Linux或Unix环境:
预备知识:
Ant工具的配置文件采用XML任务树的形式。build.xml文件。创建FirstTestAnt.xml
运行如下命令:
注:如果文件名是build.xml就直接在当前的目录下直接使用ant命令即可。
Ant的构件文件是基于XML的方式进行编写的,其默认的名称为build.xml,当然也可以取别的文件名称(此时要在构建时指定具体的构件文件名称)。
在Ant工具中,每一个构件文件中必须包含一个project元素,project元素作为XML树的根节点。一个project元素可以包含多个target元素作为叶子节点,每一个target元素可看作Ant工具的基本执行单元,同时在target单元之间可存在或定义依赖关系。在每一个target中可包含多个具体执行的元素(也可看作Ant任务),可执行的元素定义了这个操作具体要做的事情。
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初始化时被执行。
2.2.3 basedir属性
basedir属性在Ant工具中用于指定基路径的位置。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果该属性以及basedir property都没有设定,则Ant就是用构件文件的父目录作为基准目录。在Ant的target元素中可以通过${basedir}来获取基目录的位置。
基路径可以这样理解:就是文件中其他部分所有相对路径的起始路径,或者说调用${basedir}时的使用路径。
description属性对于对project及其内容进行相关说明。当Ant运行时,加上-projecthelp选项,命令行中就会输出description属性中的说明信息。
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)时,这些符号可能会产生冲突,因为在开发工具中他们可能有特殊的用途。
2.3.2 depends属性
depends属性用于描述target间的依赖关系。depends中可以是一个或多个target元素名称,多个target元素名称使用逗号“,”来分割。
Ant工具的depends属性只指定了target元素间被执行的顺序关系。如果当前的target元素无法运行,但这种depends关系对于这个target元素所依赖的其他target元素并没有影响,这些被依赖的target元素会被正常执行。Ant会依照Depends属性中target出现的顺序(从左到右)依次执行每个target。
2.3.3 if属性
if属性主要用于验证在执行target前所必须设定的属性。如果if指定的属性没有被设定(也就是不存在),那么这个target不会被执行。
例如:要验证系统是否安装了JDK,若安装了JDK就输出JDK的版本。
运行结果:
可以看出,a这个变量值不存在,所以linshi这个target没有运行。
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元素要执行的功能,这是一个良好的习惯。
task元素是Ant工具执行的功能单元,可以看作是一段可执行的代码。property元素可以看作是一个名字和一个值的对应关系,用于定义一些需要用到的变量。task和property都可在target中整合使用。
2.4.1 task元素详解
task在我理解看来,是一种泛称,并不是一个具体的标签名,task是一段可执行的代码,在task内封装了执行的细节。每个task可以有一个或多个属性,下面介绍的property元素就是task的一种。我是这样理解的task就是一个任务。Ant提供了大量的核心task和可选task,除此之外,Ant还允许用户定义自己的task,这大大扩展了Ant的功能。
注意:如果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还定义了一些自己的内置属性。如下:
project基目录的绝对路径(与<project>的basedir属性一样)buildfile的绝对路径Ant的版本project的名字,由<project>的name属性设定Ant检测到的JVM的版本一个简单完整的Ant工具构件Java项目的实例:
MyProject是一个常用的构件文件,这个构件文件的作用是对项目的源文件进行编译,并打包生成jar文件。
上面的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程序。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元素具有以下属性:
<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工具的集成开发环境(IDE)中运行。
如果将Ant的bin目录设定到环境变量中,就可以运行Ant工具了,否则必须得设定临时环境变量,才能运行。如果都没有,系统将找不到Ant工具。
输入Ant命令而不输入其他选项时,Ant会在当前目录中查找build.xml文件,并执行project元素中default属性指定的target。
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.4.1 Ant中使用环境变量
JAVACMD,Ant工具会以JAVACMD来替代JAVA_HOME。换句话说,你想换一个系统默认的java环境来编译项目时,可以设置JAVACMD这个环境变量。Java的优化属性,作用相当于在Ant工具中直接设定JAVA_OPTS参数。如果要设定JAVA堆栈大小就可用这个环境变量进行设置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 |
用户的当前工作目录 |
常用到的系统属性:
原文:https://www.cnblogs.com/tudachui/p/9530521.html