代码构建(三)——ANT脚本在实际项目中的应用场景

5.3 ANT核心任务

5.3.1 ant任务
5.3.1.1 概述

       基于另一个构建文件中的一个目标调用Ant从而可以将构建文件分解为多个Ant构建文件,它会实例化一个新的Ant工程。属性值能在新ant工程中使用。如果需要在一个构件文件中通过Ant命令去执行另一个Ant项目,或者说要执行本项目的子项目的构件文件。这时Ant这个核心任务就派上用场了。简单地说Ant任务的作用就相当于在命令行通过Ant命令执行构件文件。值得注意的是Ant任务依赖于target元素,需要在某个target元素中使用,不能在target元素外独立使用。

5.3.1.2常见属性

       ●Antfile:要调用的构建文件名,默认是build。Xml

       ●Dir:新工程所用的基目录,antfile属性相对于dir所指定的目录,默认是当前的工作目录。

       ●Inheritall:控制特性如果向新工程传递。默认是true。

       ●Output: 文件名,输出即要写志此文件

       ●Target: 新工程中要调用的目标名,如果忽略就调用新工程的默认目标。

       ●可以嵌套的元素:Property(传递特性)

5.3.1.3 应用示例

5.3.2 typedef任务
5.3.2.1 概述

       typedef是Ant内置任务,用于将任务或数据类型定义添加到当前project,以便当前project可以使用新的任务或数据类型。任务可以是任何继承org.apache.tools.ant.Task的类或者使用适配类适配为task。数据类型类似path和fileset,可以在project级别定义并且可以通过它们的id属性对其进行引用。自定义数据类型通常需要自定义任务才能很好的使用它们。需要两个属性来定义一个定义:唯一标识此数据类型的名称和实现此类型的类全名。还可以通过file或resource属性来指向java属性文件或xml文件来定义多个数据类型。

5.3.2.2 常见属性

       ●name:数据类型的名称。

    ●classname:实现数据类型的类全名。

    ●file:加载定义的文件名称。

    ●resource:加载定义的资源名称。如果在类路径中按此名称找到多个资源,并且format属性为properties,那么只加载第一个资源,否则会加载所有资源。

     ●format:ant1.6起,文件或资源的格式,值为properties或xml。当file或resource属性值以“.xml”结尾时默认为xml,否则为properties。

     ●classpath:查找classname的类路径。

     ●classpathref:查找classname的类路径的引用。

     ●loaderRef:ant1.5起,由指定的类路径构造的类加载器的名称,使用此属性允许多个任务或类型由相同的加载器加载,以便相互调用。

     ●onerror:定义类型出错时的处理方法。可选值有fail(导致构建异常)、report(输出警告,但是继续构建)、ignore(忽略)、failall(ant1.6引入,导致所有行为失败,例如当找不到文件或资源时),ant1.7起,默认为fail。

     ●adapter:ant1.6起,用于将定义的类适配另一个接口(类)的类。适配类必须实现org.apache.tools.ant.TypeAdapter接口。除非定义的类实现(继承)adaptto属性指定的类,否则适配类将用于包装定义的类。如果未设置adaptto属性,则始终包装定义的类。

     ●adaptto:ant1.6起,此属性与adapter属性联合使用,如果定义的类没有实现(继承)此属性指定的接口(类),适配器类会包装此类。

     ●uri:ant1.6起,存有定义的uri。

5.3.2.3 应用示例

<project>

       <typedef name="fs" classname="org.apache.tools.ant.types.FileSet" />

    <fs id="files" dir=".." includes="*/*.txt"/>

    <echo>${toString:files}</echo>

</project>

5.3.3 taskdef任务
5.3.3.1概述

    taskdef是Ant内置任务,用于将任务定义添加到当前project中,以便可以在当前project中使用此任务。taskdef是一种将adapter和adaptto属性分别设置为org.apache.tools.ant.TaskAdapter和org.apache.tools.ant.Task的typedef。typedef的特性同样适用于taskdef。

5.3.3.2属性

       ●name:数据类型的名称。

    ●classname:实现数据类型的类全名。

    ●file:加载定义的文件名称。

    ●resource:加载定义的资源名称。如果在类路径中按此名称找到多个资源,并且format属性为properties,那么只加载第一个资源,否则会加载所有资源。

     ●format:ant1.6起,文件或资源的格式,值为properties或xml。当file或resource属性值以“.xml”结尾时默认为xml,否则为properties。

     ●classpath:查找classname的类路径。

     ●classpathref:查找classname的类路径的引用。

     ●loaderRef:ant1.5起,由指定的类路径构造的类加载器的名称,使用此属性允许多个任务或类型由相同的加载器加载,以便相互调用。

     ●onerror:定义类型出错时的处理方法。可选值有fail(导致构建异常)、report(输出警告,但是继续构建)、ignore(忽略)、failall(ant1.6引入,导致所有行为失败,例如当找不到文件或资源时),ant1.7起,默认为fail。

     ●adapter:ant1.6起,用于将定义的类适配另一个接口(类)的类。适配类必须实现org.apache.tools.ant.TypeAdapter接口。除非定义的类实现(继承)adaptto属性指定的类,否则适配类将用于包装定义的类。如果未设置adaptto属性,则始终包装定义的类。

     ●adaptto:ant1.6起,此属性与adapter属性联合使用,如果定义的类没有实现(继承)此属性指定的接口(类),适配器类会包装此类。

     ●uri:ant1.6起,存有定义的uri。

5.3.3.3应用示例

5.3.4 condition任务
5.3.4.1概述

    condition是Ant内置任务,当某个条件成立时会设置一个属性。在默认情况下,如果条件成立会将属性设为true,否则不会设置属性,还可以通过value属性设置为默认值以外的其他值。condition是available和uptodate的泛化。

5.3.4.2常见属性

    property:要设置的属性的名称。

    ●value:要设置的属性值,默认为“true”。

    ●else:Ant1.6.3起,当条件为false时,设置的值,如果不设置此属性,条件为false时,默认不设置值。

5.3.4.3 应用示例

5.3.5 copy任务

copy主要用来对文件和目录的复制功能。其常用的属性有:

5.3.5.1 常见属性

●file:用于指定要复制的源文件。

●preservelastmodified:作用是使得复制后的文件与源文件的最后修改时间相同。默认为false。

●tofile:用于指定要复制到的文件。

●todir:用于指定要复制到的目标目录。todir和tofile只能使用其中一个属性。

●overwrite:用于指定是否需要覆盖目录和文件,不管文件是否比源文件新,都会覆盖。默认为false。

●filtering:用于指定在复制时是否使用构件文件的全局过滤器对文件进行过滤。默认为false。

●flatten:用于指定是否需要复制目录,如果为true代表把所有的文件复制到todir属性设定的目录下。默认为false,复制目录。

●includeEmptyDirs:用于指定是否复制空目录。默认为true。

●failonerror:用于指定当遇到错误时是否停止执行。默认为true。

●verbose:用于指定当复制文件时是否记录日志信息。

●encoding:用于设定复制文件时的编码或文件过滤器使用的编码方式。默认时使用Java虚拟机的编码方式。

●outputencoding:指定写文件时的编码方式。默认时使用Java虚拟机的编码方式。

●enablemultiplemappings:用于设定是否允许多个映射。默认为false。

●granularity:用于指定一个文件修改时间的毫秒数据的允许误差。因为不是所有的文件系统的修改时间都是精确到毫秒数。默认时为0,如果为DOS系统则为2。

5.3.5.2 应用举例

● 复制单个文件:

<copy file="old.txt" tofile="new.txt"/>

● 对文件目录进行复制:

<copy todir="../dest_dir">

<fileset dir="src_dir"/>

</copy>

● 将文件复制到另外的目录:

<copy file="src.txt" todir="c:/base"/>

5.3.5.3 在执行Copy Task时使用文件过滤的实例(未验证)

下面是一个复制文件的同时替换文件中的特殊符号的例子:

<copy todir="../backup/dir">

    <fileset dir="src_dir"/>

    <filterset>

      <filter token="TITLE" value="Foo Bar"/>

    </filterset>

</copy>

这个例子的作用是把src_dir目录下的所有文件复制到“../backup/dir”目录,并在所有文件中查找并替换“TITLE”为“Foo Bar”。当要进行新产品发布时通过需要替换文件中的版本信息和时间信息。

5.3.6 delete任务
5.3.6.1 Delete Task的属性及功能

Delete任务包括以下属性:

●file:用于指定要删除的文件的名称,可以为相对路径或绝对路径。

●dir:指定一个将要被删除的根目录。这个目录下的子目录及文件将可能被删除。dir属性和file属性两者必须指定其一。

●verbose:作用是指定是否在命令行中输出被删除的文件的名称。默认为false。

●quiet:作用是指定当要被删除的文件或目录不存在时是否不显示提示信息。默认为false,代表要显示提示信息。

●failonerror:用于指定当出现错误时是否停止执行命令。

●includeemptydirs:表明当使用FileSet类型时是否删除空的目录。

●includes:用于指定将要删除的文件或目录的模式。可用逗号或空格符进行分隔。

●includesfile:用于指定要删除的文件的模式。已不建议使用。

●excludes:用于指定一个或多个文件模式或目录模式。这些符合条件的文件和目录将不被删除。

●excludesfile:用于指定将不被删除的文件模式,已不建议使用。

defaultexcludes:用于指定是否使用Ant默认的default excludes模式,已不建议使用。

●deleteonexit:用于指定是否采用Java File类中的deleteOnExit()方法进行判断,如果使用这个方法,那么仅当存在文件时才进行删除,默认取值为false。

5.3.6.2 在执行Delete Task时使用文件过滤的实例

●删除单个文件的实例:

<delete file="${basedir}\Test.java"/>

这个例子的作用是删除当前目录下的Test.java文件。

●删除目录的实例:

<delete dir="lib"/>

这个例子的作用是删除lib目录,包括这个目录的所有子目录及文件,可以通过includes或excludes类型指定删除的部分文件,而不是目录下的所有文件。

● 删除所有的jar文件或空目录:

<delete includeEmptyDirs="true">

<fileset dir="." includes="**/*.jar"/>

</delete>

5.3.7 mkdir 任务
5.3.7.1概述

mkdir是Ant内置任务,用于创建目录,如果父目录不存在,会创建父目录,如果要创建的目录已存在,则不执行任何操作。

5.3.7.2属性

dir:要创建的目录。可以是绝对路径,还是可以是相对于project的basedir的相对路径。

5.3.7.3简单示例

创建目录。<mkdir dir="/home/philander/build/classes"/>

5.3.8 move 任务
5.3.8.1概述

move是ant内置任务,用于将文件移动到新的文件或者目录,或者将一组文件移动到新的目录。默认情况下,如果目标文件存在会被覆盖。当overwrite关闭时,只有当前文件比目标文件更新或者目标文件不存在时才会移动文件。资源集合可以用来选择一组要移动的文件。只支持基于文件系统的资源集合,包括fileset、filelist和path。而ant1.7之前只支持fileset。如果要使用资源集合,就必须设置todir属性。ant1.6.3起,file属性可以用来移动或重命名整个目录。如果tofile是已有文件,或者有与todir中同名的目录,操作会失败。

5.3.8.2常见属性

●file:要移动的文件或目录。

●preservelastmodified:是否将移动文件的最后修改时间设置为源文件的最后修改时间,默认为false。

●tofile:要移动到的文件。

●todir:要移动到的目录。

●overwrite:即使目标文件比源文件更新也会覆盖目标文件,默认为false。

●force:从Ant1.8.2起,即使目标文件是只读的也会覆盖文件,默认为fale。

●filtering:在进行移动时是否进行过滤。具体可查看filter。

●flatten:是否忽略源目录的目录结构,如果为true,所有文件拷贝到todir属性指定的目录中。使用flattenmapper可以达到相同的效果,默认为false。

●includeEmptyDirs:是否拷贝fileset中的空目录。默认为true。

●failonerror:如果为false,当文件不存在或者指向一个目录嵌套的fileset不存在,或者移动发生异常时,会记录一个警告信息,但不会停止构建,默认为true。

●quiet:ant1.8.3起,如果failonerror属性设置为false,当文件不存在或者指向一个目录嵌套的fileset不存在,或者拷贝发生异常时,如果quiet为true不会记录警告信息。默认为false。

●verbose:是否记录正在移动的文件,默认为false。

●encoding:从Ant1.5起,设置拷贝文件的编码,默认为JVM编码格式。

● outputencoding:从Ant1.6起,设置写文件时的编码,如果设置encoding属性,默认与encoding属性相同,否则与JVM编码格式相同。

●enablemultiplemappings:从Ant1.6起,是否处理所有源路径映射,如果为true,处理所有映射,如果为false,则只处理第一个文件或目录。这个属性只有在存在mapper子元素时才有效。默认为false。

●granularity:因为不是每个文件系统都支持将修改时间精确到毫秒,所以从Ant1.6.2起,可以设置修改时间允许的时间误差。默认是0毫秒,DOS系统是2秒。

●performGCOnFailedDelete:ant1.8.3起,如果ant删除文件或目录失败,会重新尝试一次。如果此属性设置为true,会在重试之前执行垃圾回收。设置为true,可以解决windows上的一些问题和NFS共享目录树。默认为true。

5.3.8.3应用举例

● 移动单个文件:

<move file="sourcefile" tofile="destfile"/>

● 移动单个文件到另一个目录:

<move file="sourcefile" todir="movedir"/>

● 移动某个目录到另一个目录:

<move todir="newdir">

<fileset dir="olddir"/>

</move>

5.3.9 echo 任务
5.3.9.1概述

echo是Ant内置任务,用于向当前记录器和监听器(不覆盖的情况下是System.out)发送消息。通过设置level属性,可以控制消息按什么日志级别过滤。还可以输出到文件,可以选择追加或者覆盖文件,此时会忽略level属性。

5.3.9.2常见属性

●message:发送的消息。

●file:写入消息的文件。

●output:Ant1.8起。写入消息的资源。

●append:是否追加到已经存在的文件,默认为false。此属性在设置了output属性时才生效,否则被忽略。

●level:控制消息级别。可选值按级别降序为error、warning、info、verbose、debug。默认为warning。

●encoding:Ant1.7起,编码格式,默认为“”,使用本地系统编码。

●force:Ant1.8.2起,是否覆盖只读目标文件,默认为false。

注意:①紧跟在echo标签后的文本会作为输出的一部分,还要注意的是$,如果要输出$,则需要通过$$进行转义。

②根据ant运行时的日志级别,消息可能会被忽略,-quiet只输出warning及以上级别消息,-verbose输出debug以上级别消息,-debug输出所有级别消息。默认情况下,输出info及以上级别消息。

5.3.9.3应用举例

5.3.10 replace任务
5.3.10.1概述

       replace是ant内置任务,用于将选择的文件中出现的指定字符串替换为另一个字符串。如果要替换跨行的文本,必须嵌套replacetoken元素。当与存在的文件不同时,才会写入输出文件,以此防止此任务基于未变更的文件进行伪重建。replace形成了一个隐式文件集,支持fileset的大多数属性以及嵌套include、exclude、patternset元素。ant1.8起,replace支持嵌套任何基于文件系统的资源集合。

5.3.10.2常见属性

       ●file:要进行替换的文件。

       ●dir:替换多个文件时使用的基本目录。

       ●encoding:进行替换的文件编码,默认为JVM编码。

       ●token:要替换掉的字符串。

       ●value:替换成的字符串,如果不设置,默认为空字符串“”。

       ●summary:是否生成替换操作的摘要,详细说明处理了多少字符串和文件,默认不生成摘要。

       ●propertyFile:描述嵌套replacefilter元素指定的属性的属性文件,当replacefilter元素使用property属性时必须设置。

       ●replacefilterfile:属性文件,每一个属性都视为一个replacefilter,属性名是token,属性值是value。

       ●includes:逗号或空格分隔的必须包含的文件模式列表。

       ●includesfile:文件名。指定文件的每一行都会做为一个includes模式。

       ●excludes:逗号或空格分隔的必须排除的文件模式列表。

       ●excludesfile:文件名。指定文件的每一行都会做为一个excludes模式。

       ●defaultexcludes:是否使用默认排除列表,默认为true。

       ●preserveLastModified:ant1.8起,是否保留时间戳,即使文件被修改,默认为false。

       ●failOnNoReplacements:ant1.8起,如果没有做任何事是否构建失败,默认为false。

       ●replace还支持以下嵌套元素:

       replacetoken/replacevalue:如果要替换的文本或替换文本跨行,可以使用这两个嵌套元素来分别指定。支持以下属性:

       expandProperties:ant1.8起,是否扩展嵌套文本中的属性,默认为false。

       replacefilter:使用replacefilter元素,可以从属性文件中提取替换值,属性文件的名字通过replace任务的  propertyFile属性设置。支持以下属性:

       token:要替换掉的字符串。

       value:替换成的字符串。

       property:用其值作为替换值的属性名。property与value不能同时指定。ant1.8起,token、value属性可以作为replacefilter的嵌套元素使用。如果value和property都没有设置,就使用replace的value属性值或者replacevalue元素的值。如果这些都没有设置,那么就用空字符串进行替换。

5.3.13.3 应用示例

       把文件夹“copyfile”中的所有文件中的所有的“lixiang”字符串全部替换为“name”字符串。

5.3.11 javac 标签节点元素
5.3.11.1 概述

任务和javac命令是相似,它编译两种类型的Java文件1)没有被编译的java文件2)曾经编译过,但是class文件版本和当前对应的java文件版本不匹配的java文件。

5.3.11.2常用属性设置

       ●srcdir :必须的,除非嵌套有标签。包含源文件的文件夹。

       ●destdir:编译后文件存放的目标文件夹,默认是当前文件夹。

       ●includes: 必须包括的文件模式的列表,以逗号或空格分隔。如果忽略,将包括所有文件。

       ●excludes :必须排除的文件模式的列表,以逗号或空格分隔。如果忽略,将不会排除任何文件(默认排除的文件除外)。

       ●classpath:The class path to use. 文件夹中class会被导入的jar包

       ●debug: 当值未为true时产生调试信息。

       ●optimize: 指出是否应该用优化方式编译源代码,默认为 off。

       ●verbose: 控制生成消息的输出量。表示提供详细的输出信息。

       ●failonerror: 指定 clientgen Ant 任务在出现错误的情况下是否继续执行。 此特性的有效值为 True 或 False。默认值为 True,这意味着即使遇到错误也要继续执行。

       ●bootclasspath:编译过程中需要导入class文件会被导入。

       ●bootclasspathref:编译过程中需要引用的class文件夹目录。

       ●classpathref:文件夹中class文件会被引用的jar包。

       ●compiler :指定要使用的编译器。如果未设置该特性,将使用build.compiler属性的值(如果设置)。否则,将使用当前 VM 的默认编译器。

       ●debuglevel: 相当于命令行中要追加到 -g 命令行开关后面的关键字列表。这将会被除modern和classic(ver >= 1.2) 以外的所有实现忽略。合法值是 none 或下列关键字的逗号分隔列表:lines、vars 和 source。如果不指定 debuglevel,则默认情况下,将不会在 -g 的后面追加任何关键字。如果不打开 debug,该特性将被忽略。

       ●depend: 这个任务依赖的任务。当运行这个任务时,首先按照顺序依次执行完依赖的任务,如果出错将停止执行。

       ●deprecation: 假如为真,将会给出不建议使用的API,默认值false

       ●encoding:指定编码格式

       ●excludesfile:该文件的每一行都将作为一个 exclude 模式。

       ●fork: 为true时在外部启用一个新的JDK 编译器进程执行编译。默认值是true,应用在需要配置编译器运行时环境时

       ●includeantruntime :指出是否应在类路径中包括 Ant 运行时程序库,默认为 yes。

       ●includejavaruntime: 指出是否应在类路径中包括来自执行 VM 的默认运行时程序库,默认为 no。

       ●includesfile: 文件名。该文件的每一行都将作为一个 include 模式。

       ●listfiles: 为真时显示被编译文件列表,默认为false

       ●memoryinitialsize 如果 javac 在外部运行,则是底层 VM 的初始内存大小;否则将被忽略。默认为标准 VM 内存设置。(例如:83886080、81920k 或 80m)

       ●memorymaximumsize: 如果 javac 在外部运行,则是底层 VM 的最大内存大小;否则将被忽略。默认为标准 VM 内存设置。(例如:83886080、81920k 或 80m)

       ●nowarn: 为真时将忽略所有警告信息

       ●source: 假如设置为1.4,将激活断言。默认是1.3

       ●sourcepath: 指定源资源文件夹。默认指向srcdir

       ●sourcepathref: 指定你想引用资源

       ●target: Specifies the VM version to generate class files for (for example, 1.1 or 1.3).

5.3.11.3应用示例

(1)使用默认的编译器编译Java程序

    编译${src}下的所有Java文件。编译后的class文件保存在${build}下。在编译时使用当前目录下的spring.jar进行编译,并显示调试信息。这个例子使用JVM1.5进行编译。

(2)通过src类型指定源文件,并制定要编译的Java源文件

    编译${src}和${src2}指定的源文件,包括package名为mypackage.p1开头或mypackage.p2开头的Java源文件,但是不包括mypackage.p1.testpackage开头的源文件。

(3)使用外部编译器编译Java源文件

    使用外部Java编译器来编译Java程序,通过executable指定javac程序的位置。这里使用JVM1.1进行编译编译。 

5.3.12 java任务
5.3.12.1概述

    Ant提供了Java这个核心任务用于实现执行Java程序的功能,该标签用来执行编译生成的.class文件。

5.3.12.2常见属性

    ●classname:用于指定要执行的Java类。

    ●jar:用于指定要执行的jar文件的位置。这个jar文件一定要包含manifest目录和Main-Class实体。值得注意的时,如果这个属性被指定,那么fork属性必须设定为true。jar和classname这两个属性中的其一必须被指定。

       ●classpath:用于指定执行Java程序的引用类路径。

    ●fork:用于指定是否允许Java程序在另外的Java虚拟机上运行,而不是用当前运行Ant的JVM。

    ●failonerror:用于指定当命令出错或退出时返回一个非0的值时是否停止执行构建进程。默认为false。

       ●output:用于指定一个用于信息输出的文件。

       ●appended:用于指定是否附加或覆盖output和error指定的文件。默认为false

    ●resultproperty:用于指定一个已定义的属性,这个被指定的属性用于记录命令执行时的返回值。

    ●args:用于指定类执行时的参数。已不建议使用,可使用arg类型来代替。

    ●classpathref:用于指定类库的引用。允许引用path类型定义的类库路径。

    ●outlive:用于指定是否允许打开一个进程并在Ant工具外运行。使用这个属性时需要设定fork属性为true。这个属性不兼容timeout、input、output、error和result属性。

    ●jvm:用于指定一个命令,然后调用Java虚拟机执行这个命令。这个命令将会通过java.lang.Runtime.exec()方法执行。默认时执行java命令。

    ●jvmargs:用于设定Java虚拟机参数,供Java虚拟机调用。这个属性已不建议使用,可以使用jvmarg类型来定义。

    ●maxmemory:用于设定Ant工具所启动的Java虚拟机所占用内存的最大值。

    ●dir:用于调用Java虚拟机的目录。

    error:用于指定标准错误信息的输出目录。

    ●logError:用于设定是否把信息输出到Ant的日志文件中。

    ●outputproperty:用于指定一个已定义的属性,这个属性用于存储输出信息。

    ●errorproperty:用于指定一个已定义的属性,这个属性用于存储输出的错误信息。

    ●input:用于指定输入文件,作为命令执行时的标准输入使用。

    ●inputstring:用于指定一个输入字符串,作为执行命令的输入参数。

    ●newenvironment:用于指定当新的环境变量被指定时不再传递旧的环境变量。默认为false。

    ●timeout:用于指定一个命令的执行时间,如果在指定时间内构建进程没完成,则这个命令将会被终止。建议当fork属性为true时才使用这个属性。

5.3.12.3应用示例

5.3.13 jar任务
5.3.13.1 概述

jar文件可称为Java归档文件,对编译后的.class文件进行打包。它可放在classpath中直接引用,也可以直接运行jar文件(需要指定jar中的Main-Class)。Ant工具提供了jar和Unjar这两个任务,可以方便地实现生成和解压jar文件的功能。该标签用来生成一个JAR文件。

5.3.13.2常用属性

       ●destfile:用于定义将要生成的.jar文件的名称。这个属性是必须的。

●basedir:用于指定要打包的.class文件的位置。

●compress:用于设定是否对打包的文件进行压缩。默认为true,进行压缩。

●keepcompression:在Ant1.6版本后提供了这个属性用于指定来自ZipFileSet等归档文件的文件是否保存本身的压缩方式。默认为false。

●encoding:用于设定文件名的编码方式。默认为utf-8编码。

●filesonly:用于指定是否只保存文件。默认为false。

●includes:用于指定jar文件中要包含的文件。可以使用逗号或空格符进行分隔。

●includesfile:用于指定要包含的文件的匹配模式。

●excludes:用于指定那些文件在jar文件中将不被包含。

●excludesfile:用于指定jar文件中将不被包含的文件的匹配模式,用于文件过滤。

●defaultexcludes:用于设定是否不包含Ant工具默认不包含的目录和文件。可取值true或false,忽略时代表不包含。

●manifest:用于指定是否使用jar规范中的manifest文件。相当于在jar中生成META-INF/MANIFEST.MF文件。

●filesetmanifest:用于定义当在jar文件中存在多个Manifest时(在ZipFileSet中存在),如何生成新的manifest属性。可取值skip、merge或mergewithoutmain。skip代表忽略ZipFileSet中原有的manifest,取值merge代表合并所有的manifests;取值mergewithoutmain代表合并所有manifests但是不包含manifest Main函数的定义。

●update:用于定义当jar中的目标文件已存在时是否更新或覆盖目标文件。默认为false。

●whenempty:用于指定当没有找到符合打包jar文件的文件时的处理方式。可取值为fail、skip或create。取值fail代表Ant工具会提示出错不生成jar文件;取值skip代表不处理不生成jar文件;取值create代表生成一个空的jar文件。默认为skip。

●duplicate:用于定义文件名重复时的处理方式。取值可以时add、preserve或fail。取值add代表添加用后面的覆盖前面的;取值preserve代表不覆盖已存在的文件;取值fail代表操作失败。

●index:用于设定是否使用一个索引文件,用于记录jar里的文件结构。默认为false。

●manifestencoding:用于定义读取jar文件中的manifest的编码方式,前提是jar文件中定义了manifest。

在打包jar文件时需要用到manifest任务,用于定义jar的文件描述。

5.3.13.3 manifest任务包含以下属性:

       ●file:用于指定建立或更新manifest-file文件。

●mode:定义文件操作。可取值为update或replace。默认为replace。

●encoding:用于定义读取manifest时的编码方式。

●另外,在manifest任务中还可以使用attribute和section类型。

    attribute类型包含一个名称和值得对应关系。

    section类型只有一个name属性,一个section可包含一个或多个attribute。

5.3.13.4使用Ant工具打包jar文件实例

(1)打包编译后的.class文件,并对文件进行过滤

   

(2)通过FileSet定义需要打包的.class文件

(3)打包jar文件并生成manifest文件

    运行上面的文件,生成的manifest文件内容如下:

    Manifest-Version: 1.0

    Ant-Version: Apache Ant 1.9.7

    Created-By: 1.8.0_112-b15 (Oracle Corporation)

    Built-By: fanxiaobin

    Name: common/class1.class

    Sealed: false

5.3.13.5打包操作的还有zip、tgz

<!-- 创建zip -->

<zip basedir="${basedir}\classes" zipfile="temp\output.zip"/>

<!-- 创建tgz -->

<gzip src="classes\**\*.class" zipfile="output.class.gz"/>

5.3.14 war任务
5.3.14.1 概述

    Ant WAR(Web Archive)是Java Archive文件的扩展。 它由库,类等组成,存储在WEB-INF/lib,WEB-INF/classes文件夹中。

5.3.14.2 常见属性

    ●destfile:要创建的WAR的名称。

    ●webxml: Servlet配置描述符。

    ●basedir:用于jar文件的目录。

    ●compress:存储和压缩数据。

    ●encoding:它用于指定编码。

    ●filesonly:仅存储文件。

    ●includes:包括文件列表。

    ●excludes:排除文件列表。

    ●update:即使存在,也更新目标文件。

5.3.14.3任务嵌套元素

    lib:此元素指定文件集,所有文件都位于创建的WAR的WEB-INF/lib文件夹中。

    classes:此元素指定类文件的文件集。创建war之后,所有类都位于WEB-INF/classes文件夹中。

    webinf:此嵌套元素指定文件集,所有文件都位于WEB-INF目录中。

5.3.14.4应用示例

(1)示例1

<project name="java-ant project" default="run">    

    <target name="run"> 

        <war destfile = "myapp.war" webxml = "web.xml" > 

            <fileset dir = "src/com/yiibai"></fileset> 

            <classes dir = "test/com/yiibai"></classes> 

        </war> 

    </target> 

</project>

上面的代码将创建一个myapp.war文件,其文件结构如下所示。

Archive:  myapp.war 

    META-INF/ 

        META-INF/MANIFEST.MF 

    WEB-INF/ 

        WEB-INF/web.xml 

        WEB-INF/classes/AllUpperCaseCondition.class 

        WEB-INF/classes/Hello.class

(2)示例2

<war destfile="${webRoot}/ash.war" basedir="${basedir}/web" webxml="${basedir}/web/WEB-INF/web.xml">    

    <exclude name="WEB-INF/classes/**"/>    

    <exclude name="WEB-INF/lib/**"/>    

    <exclude name="WEB-INF/work/_jsp/**"/>

    <lib dir="${lib.dir}" includes="**/*.jar, **/*.so, **/*.dll">

    <exclude name="${webRoot}\${helloworld_jar}"/>

</lib>

<lib file="${webRoot}/${helloworld_jar}"/>

<classes dir="${dest}" includes="**/*.xml, **/*.properites, **/*.xsd"> </classes>

</war>

5.3.15 unjar/untar/unwar/unzip任务
5.3.15.1概述

       unjar/untar/unwar/unzip是Ant内置任务,用于解压zip、war或jar文件,PatternSet用于选择从存档中提取的文件,资源集合用于选择执行解压的存档文件。Unjar/Unwar/Unzip只支持基于文件系统的资源结合,Untar支持任意资源集合。Ant1.7之前只支持fileset做为嵌套元素。可以通过嵌套mapper元素来定义文件名转换,默认映射器为identitymapper。 在进行文件时区偏移的计算时,不同的ZIP工具处理时间戳的方式不同,一些ZIP库从文件系统中读取时间戳并保存,而其他库在读和写文件时会修改时间戳,以使所有的时间戳有相同的时区。由一个库创建的zip存档可能会在其他库提取文件时提取到错误的时间戳。

5.3.15.2常见属性

       ●src:要解压的存档文件,可以通过嵌套资源集合元素来指定。

    ●dest:保存提取出的文档的目录。

    ●overwrite:是否覆盖文件,即使它们比存档中的条目更新,默认为true。

    ●compression:此属性只对untar有效,用于设置压缩方法。可选值有:none、gzip和bzip2,默认为none。

    ●encoding:此属性对untar无效,用于设置zip文件中文件名的编码。可选值参考java文档,默认为utf8,平台的默认字符编码使用魔术值native-encoding。

    ●failOnEmptyArchive:ant1.8起,尝试提取空的归档是否产生错误,默认为false。

    ●stripAbsolutePathSpec:ant1.8起,在提取文件之前,是否应当删除提取的文件的文件名之前的“/”或“\”,会在应用include/exclude模式和嵌套mapper之前改变条目名称,默认为false。

    ●scanForUnicodeExtraFields:此属性对untar无效,如果存档包含 Unicode 额外字段, 则使用它们来设置文件名, 而忽略指定的编码,默认为true。

5.3.15.3应用示例

5.3.16 exec任务
5.3.16.1 概述

    本地程序主要是指系统程序,一般指操作系统级的程序,例如在unix的shell命令,windows的系统程序如taskmgr,ping等系统程序,exec能够运行的好像一般都是exe程序,其他程序例如services.msc好像不能运行,批处理文件.bat也不能运行。也包括在系统变量path中包含的所有程序。

ant的exec任务和java任务的属性类似,也拥有arg,dir,failonerror,timeout,env等特性。

虽然exec任务具有很强的操作系统平台依赖型,但是却无法通过osfamily属性来选择是否运行exec。

可以在本地程序调用之前探测程序是否存在,可以使用condition来设置property。

当任务的输入参数为一系列文件时,而对这些文件的操作都一样,则可以使用apply任务,apply任务是继承exec任务的一个子任务。它拥有exec任务的一切特性,并且接受文件集作为参数,传递给指定的应用程序,可以逐个或者一次性传完。

5.3.16.2应用示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值