Ant 初级入门

时间:2021-02-18 01:57:15

一、Ant简介

Ant是一个Apache基金会下的跨平台的构件工具。

由于Ant是基于Java的,所以需要Java环境的支持,也就是配置好 JAVA_HOME 和 ANT_HOME 环境变量分别指向JavaAnt目录,并将${ANT_HOME}/bin (Unix) 或 %ANT_HOME%/bin (Windows) 配置到PATH中。

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

Windows环境:

  1.  
    set ANT_HOME = ant的安装目录的根目录
  2.  
    set JAVA_HOME = JDK安装的根目录
  3.  
    set PATH = %PATH%;%ANT_HOME%\bin;

LinuxUnix环境:

  1.  
    export ANT_HOME = ant的安装目录的根目录
  2.  
    export JAVA_HOME = JDK安装的根目录
  3.  
    export PATH = ${PATH}:${ANT_HOME}/bin;

示例小程序

预备知识:

  • Ant工具的配置文件采用XML任务树的形式。
  • 运行时没有指定文件名,则会自动搜索build.xml文件。

创建FirstTestAnt.xml

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <project name="first ant example" default="firstExample">
  3.  
        <target name="firstExample">
  4.  
            <echo message="这是一个简单的Ant实例"></echo>
  5.  
            <echo message="操作系统为:${os.name}"></echo>
  6.  
            <echo message="根目录为:${basedir}"></echo>
  7.  
            <echo message="ant文件的信息:${ant.file}"></echo>
  8.  
            <echo message="ant的版本:${ant.version}"></echo>
  9.  
            <echo message="项目的名称:${ant.project.name}"></echo>
  10.  
            <echo message="Java的版本:${ant.java.version}"></echo>
  11.  
        </target>
  12.  
    </project>

运行如下命令:

  1.  
    D:\【当前目录】>ant -f FirstTestAnt.xml
  2.  
    Buildfile: D:\360极速浏览器下载\FirstTestAnt.xml
  3.  
     
  4.  
    firstExample:
  5.  
    [echo] 这是一个简单的Ant实例
  6.  
    [echo] 操作系统为:Windows 8.1
  7.  
    [echo] 根目录为:D:\360极速浏览器下载
  8.  
    [echo] ant文件的信息:D:\360极速浏览器下载\FirstTestAnt.xml
  9.  
    [echo] ant的版本:Apache Ant(TM) version 1.9.7 compiled on April 9 2016
  10.  
    [echo] 项目的名称:first ant example
  11.  
    [echo] Java的版本:1.8
  12.  
     
  13.  
    BUILD SUCCESSFUL
  14.  
    Total time: 0 seconds

注:如果文件名是build.xml就直接在当前的目录下直接使用ant命令即可。

二、Ant配置文件

2.1 Ant构件文件

Ant的构件文件是基于XML的方式进行编写的,其默认的名称为build.xml,当然也可以取别的文件名称(此时要在构建时指定具体的构件文件名称)。

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个属性:namedefaultbasedir。这三个属性不是必须的,可以根据项目的需要进行选择。

2.2.1 name属性

name属性的作用就是给project元素起一个名字。

2.2.2 default属性

default属性用于指定project默认执行时所执行的targetAnt从1.6.0版本后,每个project元素里都包含一个隐藏的target元素,这个隐藏的target元素包含所有构件文件中*的ant tasksant types
运行Ant工具时加入-projecthelp选项,这个隐藏的target会在project初始化时被执行。

2.2.3 basedir属性

basedir属性在Ant工具中用于指定基路径的位置。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果该属性以及basedir property都没有设定,则Ant就是用构件文件的父目录作为基准目录。在Anttarget元素中可以通过${basedir}来获取基目录的位置。

基路径可以这样理解:就是文件中其他部分所有相对路径的起始路径,或者说调用${basedir}时的使用路径。

2.2.4 description子元素

description属性对于对project及其内容进行相关说明。当Ant运行时,加上-projecthelp选项,命令行中就会输出description属性中的说明信息。

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <project name="first ant example" default="A">
  3.  
        <description>
  4.  
            描述信息:这是一个简单的Ant实例。
  5.  
        </description>
  6.  
        <target name="firstExample">
  7.  
            <echo message="这是一个简单的Ant实例"></echo>
  8.  
        </target>
  9.  
        <target name="A">
  10.  
            <echo message="这是A"></echo>
  11.  
        </target>
  12.  
    </project>

2.3 target元素

target元素是Ant工具的基本执行单元,每个target里包含一个或多个具体的操作。一个target可以依赖于其他的一个或多个targettarget包含5个基本属性:namedependsifunless、和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的版本。

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <project name="if ceshi" >
  3.  
        <target name="checkJavaVersion" if="ant.java.version">
  4.  
            <echo message="Java的版本为:${ant.java.version}" />
  5.  
         </target>
  6.  
        <target name="linshi" if="a">
  7.  
            <echo message="我不应该出现的!" />
  8.  
        </target>
  9.  
    </project>

运行结果:

  1.  
    D:\360极速浏览器下载>ant -f ceshi.xml checkJavaVersion linshi
  2.  
    Buildfile: D:\360极速浏览器下载\ceshi.xml
  3.  
     
  4.  
    checkJavaVersion:
  5.  
    [echo] Java的版本为:1.8
  6.  
     
  7.  
    linshi:
  8.  
     
  9.  
    BUILD SUCCESSFUL
  10.  
    Total time: 0 seconds

可以看出,a这个变量值不存在,所以linshi这个target没有运行。

2.3.4 unless属性

unless属性的功能与if属性功能正好相反。也就是说,如果unless属性中指定的属性没有被设定,那么这个target元素将会被执行。

注意:ifunless属性只能限定本target元素的功能是否被执行,但是它们并不能限制这个target依赖的target的执行。

简单来说:<target name="targetA" depends="targetB" if="Aproperty">,同时Aproperty没有被设定,当执行targetA时,虽然targetA不会被执行,但是targetB会正常地被执行。

2.3.5 description属性

是一个描述性的子元素,使用-projecthelp可以查看,但是都会被提取到全局描述,但是通过向description中添加描述,使用户能够更好地了解这个target元素要执行的功能,这是一个良好的习惯。

2.4 task和property元素

task元素是Ant工具执行的功能单元,可以看作是一段可执行的代码。property元素可以看作是一个名字和一个值的对应关系,用于定义一些需要用到的变量。taskproperty都可在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还定义了一些自己的内置属性。如下:

  • basedir:project基目录的绝对路径(与<project>basedir属性一样)
  • ant.file:buildfile的绝对路径
  • ant.version:Ant的版本
  • ant.project.name:当前执行的project的名字,由<project>name属性设定
  • ant.java.version:Ant检测到的JVM的版本

一个简单完整的Ant工具构件Java项目的实例:

  1.  
    <?xml version="1.0"?>
  2.  
    <project name="MyProject" default="dist" basedir=".">
  3.  
        <property name="src" value="."/>
  4.  
        <property name="build" value="build"/>
  5.  
        <property name="dist" value="dist"/>
  6.  
     
  7.  
        <!-- 初始化target建立一个用于存放class文件的目录 -->
  8.  
        <target name="init">
  9.  
            <!-- Create the time stamp -->
  10.  
            <tstamp/>
  11.  
            <!-- Create the build directory structure used by compile -->
  12.  
            <mkdir dir="${build}"/>
  13.  
        </target>
  14.  
     
  15.  
        <!-- 编译源文件 -->
  16.  
        <target name="compile" depends="init">
  17.  
            <!-- 编译${src}目录下的源文件,生成的class文件存放到${build}目录中 -->
  18.  
            <javac srcdir="${src}" destdir="${build}"/>
  19.  
        </target>
  20.  
     
  21.  
        <target name="dist" depends="compile">
  22.  
            <!-- Create the distribution directory -->
  23.  
            <mkdir dir="${dist}/lib"/>
  24.  
            <!-- 把所有${build}目录下的class文件打包到MyProject-${DSTAMP}.jar 文件中 -->
  25.  
            <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
  26.  
        </target>
  27.  
     
  28.  
        <target name="clean">
  29.  
            <!-- 删除${build}和${dist}目录下的所有文件和目录 -->
  30.  
            <delete dir="${build}"/>
  31.  
            <delete dir="${dist}"/>
  32.  
        </target>
  33.  
     
  34.  
    </project>

MyProject是一个常用的构件文件,这个构件文件的作用是对项目的源文件进行编译,并打包生成jar文件。

上面的propertytarget元素中被引用。其中,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@的形式,其中tokenfilter task中设定的token名称,而@为默认的token开始和结束符。

另外,如果一个文件中发现一个@token@形式的token,但没有filter与这个token关联,那么是不会发生任何作用(不进行过滤行为)的。

2.5.1 path-like结构

这种结构通常在定义pathclasspath元素时使用,可称为路径匹配。如果在构件文件中可以使用“:”“;”作为分隔符,指定对pathclasspath元素的引用。那么,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工具

如果将Antbin目录设定到环境变量中,就可以运行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:若配置了JAVACMDAnt工具会以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.SystemgetProperties方法:

相关值的描述
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库文件的位置