zoukankan      html  css  js  c++  java
  • Ant快速入门(三)-----定义生成文件

      适应Ant的关键就是编写生成文件,生成文件定义了该项目的各个生成任务(以target来表示,每个target表示一个生成任务),并定义生成任务之间的依赖关系。

      Ant生成文件的默认名为build.xml,也可以取其他的名字。但如果为该生成文件起其他名字,将意味着要将该文件名作为参数传给Ant工具。生成文件可以放到项目的任何位置,但通常做法是放到项目的顶层目录中,这样有利于保持项目的简介和清晰。

      下面是一个典型的项目层次结构

      <project>:该文件夹存放整个项目的全部资源

        |—src:       存放源文件,各种配置文件的文件夹

        |—classes:   存放编译后的class文件的文件夹

        |—lib:     存放第三方JAR包的文件夹

        |—dist:        存放项目打包,项目发布的文件夹

        |—build.xml:  Ant生成文件

      Ant生成文件的根元素是<project..../>,每个项目下可以定义多个生成目标,每个生成目标以一个<target.../>元素来定义,它是<project.../>元素的子元素。

      project元素可以有多个属性,project元素的常见属性的含义如下。

      》default:  指定默认target,这个属性是必须的。如果运行ant.bat 命令时没有显示指定想执行的target,Ant将执行该target。

      》basedir:  指定项目的基准路径,生成文件中的其他相对路径都是基于该路径的。

      》name:  指定项目名,该属性仅指定一个名字,对编译,生成项目没有太大的实际影响。

      》description:  指定项目的描述信息,对编译,生成项目没有太大的实际影响。

      如下面代码片段:

      

    1 <?xml version='1.0' encoding='utf-8'?>
    2 <!--下面的配置信息指定基准路径是当前路径,默认target为空-->
    3 <project name="struts2" description="demo" basedir="." default="">
    4 ...
    5 </project>

       每个生成目标对应一个<target.../>元素。

      》name: 指定该target的名称,该属性是必须的,该属性非常重要,当希望Ant运行指定的生成目标时,就是根据该name来确定生成目标的。所以我们可以得出一个结论:同一个生成文件里不能有连个同名的target元素。

      》depends: 该属性可指定一个或多个 target名,表示运行该target之前应先运行该depends属性所指定的一个或多个target.

      》if: 该属性指定一个属性名,用该属性表示仅当设置了该属性时才执行此target。

      》unless: 该属性指定一个属性名,用属性表示仅当没有设置该属性时才执行此target。

      》description: 指定该target的描述信息。

      例如,如下配置片段

    1 <!--下面表示执行run target之前,必须先执行compile target-->
    2 <target name="run" depends="compile"/>
    3 <!--只有设置了prop1属性之后才执行 exA target-->
    4 <target name="exA" if="prop1"/>
    5 <!--只有没有设置prop2属性,就可以执行exB target-->
    6 <target name="exB" unless="prop2"/>

        每个生成目标又可能有一个或多个任务序列组成,当执行某个生成目标的时,实际上就是依次完成该目标所包含的全部任务。每个任务由一段可执行的代码组成。

      定义任务的代码格式如下:

     

    1 <name attribute1="value1" attribute2="value2"...../>

      上面的代码 name是任务的名称, 例如后面讲到的javac,java,echo,delete,mkdir......。 attributeN和valueN用于指定执行任务所需的属性名和属性值。

      简而言之,Ant生成文件的基本结构是project元素包含多个target元素,而每个target元素里又包含多个任务。

      Ant的任务可以分为如下三类。

      》核心任务: 核心任务是Ant自带的任务。

      》可选任务:   可选任务是来自第三方的任务,因此需要一个附加的JAR文件。

      》用户自定义的任务: 用户自定义的任务是用户自己开发的任务。

      根据上面的介绍,不难发现Ant生成文件具有如下图的结构:

      除此之外,project元素还可拥有如下两个重要的元素。

      》property: 用于定义一个或多个属性。

      》path:  用于定义一个或多个文件和路径。

         property元素

      <property.../>元素用于定义一个或多个属性,Ant生成文件中的属性类似于编程语言中的宏变量,他们具有名称和值。与编程语言不同的是:Ant生成文件中的属性值不可改变。

      定义一个属性最简单的形式如下:

    1 <!--下面代码定义一个名为 builddir的属性,其值为dd-->
    2 <property name="builddir" value="dd"/>

      如果需要获取属性值,则使用${propertyName}的形式。例如,如下代码即可获取builddir属性值:

    1 <!--输出builddir属性值-->
    2 ${builddir}

      由此可见:$符在Ant生成文件中具有特殊的意义,如果我们希望Ant将生成文件中的$当初普通字符,则应该使用$$。例如如下配置片段:

    1 <echo>$${builddir}=${builddir}</echo>

       上面的代码中的$${builddir}不会获取builddir属性值,而${builddir}才会获取builddir属性值,执行上面任务将会输出:

    1 [echo] ${builddir} =dd

          echo是Ant的核心任务之一,该任务直接输出某个字符串,通常用于输出提示信息。

      实际上,property元素可以接受如下几个常用的属性。

      》name:  指定需要设置的属性名。

      》value:  指定需要设置的属性值。

      》resource:  指定属性文件的资源名称,Ant将负责从属性文件中读取属性名和属性值。

      》file:  指定属性文件的文件名,Ant将负责从属性文件中读取属性名和属性值。

      》url:  指定属性文件的URL路径, Ant将负责从属性文件中读取属性名和属性值。

      》environment:  用于指定系统环境变量的前缀。通过这种方式允许Ant访问系统环境变量。

      》classpath:  指定搜索属性文件的文件和路径集。

      》classpathref: 指定搜索属性文件的文件盒路径集引用,该属性并不是直接给出系列文件或路径,而是给定文件盒路径集引用。

      关于文件和路径集以及文件盒路径集引用的知识请参考path元素和classpath元素。

      下面给出几个实用property元素的例子:

    1 <!--指定获取foo.properties属性文件中的属性名和属性值-->
    2 <property file="foo.properties"/>

      下面从网络中获取属性名和属性值:

    1 <property url="http://localhost:8080/webDemo/demo.properties"/>

      除此之外,通过property元素可以让Ant生成文件访问到操作系统的环境变量,例如如下代码:

    1 <!--定义访问操作系统环境变量的前缀env-->
    2 <property environment = "env"/>

      定义了上面property元素之后,下面就可以在Ant生成文件中通过如下形式访问操作系统环境变量:

    1 <!--输出JAVA_HOME环境变量-->
    2 <echo>${env.JAVA_HOME}</echo>

      

      path元素和classpath元素

      通常我们需要使用Ant编译,运行Java文件,编译,运行Java文件时常常需要引入第三方JAR包,这就需要使用<classpath.../>元素了。<path.../>和<classpath.../>元素都用于定义文件和路径集,区别是classpath元素通常作为其他任务的子元素,即可引用已有的文件和目录集,也可临时定义个文件和目录集;而<path.../>元素则作为<project.../>的子元素,用于定义一个独立的,有名称的的文件和目录集,用于被饮用。

      因为<path.../>和<classpath.../>都用于文件和目录集,所以也将<path.../>和<classpath.../>元素定义的内容称为Path-like Structres(似目录结构)。

      <path.../>和<classpath.../>元素都用于收集系统的文件和目录集,这两个元素都可以接受如下子元素。

      》pathname:   用于指定一个或多个目录。

      》direct:    采用模式字符串的方式指定系列目录。

      》fileset:    采用模式字符串的方式指定系列目录。

      》filelist:    采用直接列出系列文件名的方式指定系列文件。

      pathelement 元素用于指定一个或多个目录,pathelement元素可以指定如下两个属性中的一个。

      》path:    指定一个或者多个目录(或者JAR文件),多个目录或JAR文件之间以英文冒号(:)或英文分号(;)分开。

      》location:   指定一个目录和JAR文件。

         因为JAR文件还可以包含更多层次的文件结构,所以JAR文件实际上可以看成是一个文件路径。

      如下面配置片段所示:

    1 <!--定义 /path/to/file2.jar, /path/to/class2和/path/to/class3所组成的目录集-->
    2 <pathelement path="/path/to/file2.jar:/path/to/class2;/path/to/class3">
    3 <!--定义由lib/helper.jar单个文件对应的目录-->
    4 <pathelement location="lib/helper.jar">

      如果需要制定多个目录集,则应该使用<dirset.../>元素,该元素需要一个dir属性,dir属性指定该目录集的根路径。除此之外,dirset 还可以使用<include.../>和<exclude.../>两个子元素来指定包含和不包含那些目录,如下面的配置片段所示:

     

    1 <!--指定该目录集的根路径是build目录-->
    2 <dirset dir="build">
    3     <!--指定包含apps目录下的所有classes目录-->
    4     <include name="apps/**/classes"/>
    5     <!--指定排除目录名中有Test的目录-->
    6     <exclude name="apps/**/*Test*"/>
    7 </dirset>

      上面的配置文件代表 build/apps 目录下,所有名为classes切文件不包含Test字串的目录。

      如果希望配置多个文件,则可使用<fileset.../>或者<filelist.../>元素,通常<fileset.../>使用模式字符串来匹配文件集,而<filelist.../>则通过列出文件名的方式来指定文件集。

      <filelist.../>元素需要指定如下两个属性:

      》dir:  指定文件集里多个文件所在的基准路径,这是一个必须的属性。

      》files:  多个文件名列表,多个文件名之间用以英文逗号(,)或空白隔开。

      如下面的示例配置片段所示:

    1 <!--配置src/foo.xml和src/bar.xml 文件组成的文件集-->
    2 <filelist id="docfiles" dir="src" files="foo.xml,bar.xml">

       几乎多有的Ant元素都可以指定两个属性: id和refid, 其中id用于为该元素指定一个唯一标识,而refid用于指定引用另外一个元素。例如下面的filelist配置:

    1 <filelist refid="docfiles">

      实际上,该filelist元素所包含的的文件集和前面docfiles文件集里包含的文件完全一样。

      <filelist.../>还允许使用多个<file.../>子元素来指定文件列表,如下面的配置片段所示:

    1 <filelist id="docfiles" dir="${doc.src}">
    2     <!--通过两个file子元素指定的文件列表和通过files属性指定的效果完全一样-->
    3     <file name="foo.xml"/>
    4     <file name="bar.xml"/>
    5 </filelist>

      <fileset.../>元素可指定如下两个属性。

       》dir:  指定文件集里多个文件所在的基准路径,这是一个必须的属性。

       》casesensitive:  指定是否区分大小写,默认区分大小写。

       除此之外,<fileset.../>元素还可以使用<include.../>和<exclude.../>两个子元素来指定包含和不包含那些文件,如下面的配置片段所示:

    1 <!--定义src路径下的文件集-->
    2 <fileset dir="src" casesensitive="yes">
    3     <!--包含所有*.jar文件-->
    4     <include name="**/*.jar"/>
    5     <!--排除所有文件名中有Test字串的文件-->
    6     <exclude name="**/*Test*">
    7 </fileset>

      掌握了<pathelement.../>,<dirset.../>,<filelist.../>和<fileset.../>四个元素的用法之后,我们就可以使用<path.../>或者<classpath.../>将他们组合一起使用了,如下面的配置片段所示:

      

     1 <path id="classpath">
     2     <!--定义classpath属性所代表的路径-->
     3     <pathelement path="${classpath}"/>
     4     <!--定义lib路径下所有的*.jar文件-->
     5     <fileset dir="lib">
     6         <include name="**/*.jar"/>
     7     </fileset>
     8     <!--定义classes路径-->
     9     <pathelement location="classes"/>
    10     <!--定义build/apps路径下的所有classes路径-->
    11     <dirset dir="build">
    12         <include name="apps/**/classes"/>
    13         <exclude name="apps/**/*Test*"/>
    14     </dirset>
    15     <!--定义res路径下的a.properties和b.xml-->
    16     <filelist dir="res" files="a.properties,b.xml">
    17 </path>

      

     

  • 相关阅读:
    PS教程1000例
    [LeetCode] Ransom Note 赎金条
    Android LinkedList和ArrayList的区别
    Android 一种非常好用的Android屏幕适配
    Android MVC模式和MVP模式的区别
    Android 性能优化的方面方面都在这儿
    Android 高级面试题及答案
    Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)
    android studio 3.0 以上 查看sharedpreference
    Android adb命令查看sharedpreferences
  • 原文地址:https://www.cnblogs.com/ArtsCrafts/p/Ant_build.html
Copyright © 2011-2022 走看看