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任务的一切特性,并且接受文件集作为参数,传递给指定的应用程序,可以逐个或者一次性传完。