Ant基础入门篇

时间:2022-07-10 15:39:02

一、Ant简介

Ant是一个Apache基金会下的跨平台的构件工具。由于Ant是基于Java的,所以需要Java环境的支持。

如果配置了环境变量,则可以直接使用了,否则必须在运行前指定一下运行路径,如下:

Windows环境下:

set ANT_HOME=ant的安装目录的根目录
set JAVA_HOME=JDK安装的根目录
set PATH=%PATH%;%ANT_HOME%\bin;
Linux或Unix环境下:

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
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
注意事项:就是文件的存储格式,最好文件另存一下,将文件的格式设置为UTF-8,有一定开发经验的人,应该熟悉字符集的概念。
如果文件名是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
Buildfile: D:\360极速浏览器下载\ceshi.xml


checkJavaVersion:
     [echo] Java的版本为:1.8


linshi:


BUILD SUCCESSFUL
Total time: 0 seconds
可以看出,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元素要执行的功能,这是一个良好的习惯。

<?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核心任务

Ant与Java整合

收集资料: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"?>
<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>
  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程序。

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命令行选项总结

  1. -help,-h:显示Ant命令的帮助信息
  2. -projecthelp,-p:显示当前project的帮助信息,主要是project中包含的target
  3. -version:显示Ant的版本信息
  4. -diagnostics:显示Ant项目的运行环境、依赖库等信息,为错误诊断和报告提供一些有用的帮助信息
  5. -quiet,-q:隐藏Ant执行时的提示信息输出。命令行将不会输出具体target的执行信息
  6. -verbose,-v:显示Ant执行的详细信息,包括操作系统和Java环境等信息
  7. -debug,-d:显示Ant执行时的调试信息、详细的log信息
  8. -emacs,-e:显示不经修饰的日志信息,就是说不输出额外的日志信息
  9. -lib<path>:指定一个类库所在的位置(jar文件的位置),让Ant工具可以使用这些类文件。path类型指定类库的位置
  10. -logfile<file>,-l<file>:指定Ant执行时日志输出文件,让日志输出到指定文件而不在命令行输出。
  11. -logger<classname>:指定要输入日志信息的类名,指定的类都将会输入日志信息
  12. -listener<classname>:指定一个类作为这个project的监听器
  13. -noinput:表示不能接受输入信息
  14. -buildfile<file>,-file<file>,-f<file>:指定要执行的构件文件的位置及名称
  15. -D<property>=<value>:用于设定一些变量,这些变量可以再target中直接引用,或覆盖已设定的属性值
  16. -keep-going,-k:当执行所有的target时不需要使用depends设定依赖关系
  17. -propertyfile<name>:引用指定的属性文件中的属性,若同时指定-D<property>=<value>,则-D指定的属性优先。
  18. -inputhandler<class>:指定一个类来处理输入的请求
  19. -find<file>,-s<file>:查找构件文件,并执行找到的构件文件
  20. -nice number:设定主线程的数目,number为指定的数目。默认时主线程总数为5,最小值为1,最大值为10
  21. -nouserlib:运行Ant时不使用${user.home}/.ant/lib下的jar库
  22. -noclasspath:运行Ant时不使用classpath变量中指定的类路径。

3.4 Ant中使用环境变量和Java系统属性

3.4.1 Ant中使用环境变量

  1. JAVACMD:若配置了JAVACMD,Ant工具会以JAVACMD来替代JAVA_HOME。换句话说,你想换一个系统默认的java环境来编译项目时,可以设置JAVACMD这个环境变量。
  2. ANT_OPTS:用于设置Java的优化属性,作用相当于在Ant工具中直接设定JAVA_OPTS参数。如果要设定JAVA堆栈大小就可用这个环境变量进行设置
  3. 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库文件的位置

&#8195&#8195

参考资料:

《Ant开发及整合应用详解》

Ant的任务(task)

博客发表时间: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
  这篇博客里面是我对于我读过的,并且感觉有意义的文章的收集整理,纯粹的个人爱好,大家感觉有兴趣的可以阅读一下,我也会时常的对其进行更新。
********************************************************************************感谢********************************************************************************************