Ant 核心任务

Ant为我们提供了很多Task来辅助我们完成复杂工作,提供的太多了只针对部分进行解说。详细信息可访问:https://ant.apache.org/manual/index.html

注意:由于表格显示的效果不好,不过可以查看利用GitBook编写的《Ant核心任务》。

一、 Ant Task【任务】

作用:执行过程中调用并执行其他target

注意:虽然Ant任务与Ant重名,但是不是一回事。

Ant任务的作用是执行项目的子项目的构件文件,值得注意的是Ant任务依赖于target元素,需要在某个target元素中使用,不能在target元素外独立使用。

属性作用
antfile指定要执行的构件文件的名称,可包含路径信息。
dir用于指定构件文件所在的目录,相当于指定了要执行的构件文件的basedir属性。这个属性设定后,被执行的构件文件的basedir属性将被dir属性的值取代。
target指定被执行的构件文件中所要执行的target,如果target属性没有设定,那么将会执行被调用的构件文件中默认target
output指定Ant工具执行时的信息输出,可定位到控制台或定位到文件中。
inheritAll用于指定被调用的构件文件的project元素中可使用当前project元素中的属性。这个属性类似于Java程序中类的继承关系。默认inheritAll属性取值为true。
inheritRefs如果设定了inheritRefs属性为true,那么被调用的构件文件中的project元素可引用当前project元素中的reference(参考)任务。

Reference任务的作用是把当前的属性复制到被调用的Ant project中使用。

Reference任务包含以下两个属性:

  • refid属性:这个属性代表当前project中的属性id
  • torefid属性:用于指定在被调用的project中的引用id
<reference refid="path1" torefid="path2"/>
<!-- 把当前project中的path1属性传递给被调用的project中使用,在被调用project中通过path2引用这个属性 -->

注意:当输出信息到文件中时,相当于在命令行指定-logfile<file>,-l<file>选项。如果指定了dir属性,那么被指定的输出文件的位置是相对于dir属性指定的目录的,当然也可以通过绝对路径指定。

使用Ant Task整合子项目的实例

在实际的项目中,大的项目都会拆分成独立的几个子项目,开发完后在整合在一起。这样做有利于项目的独立测试和长期维护。

<1>指定子项目

<!-- 指定子项目构件文件及根目录,同时指定要执行的target -->
<ant antfile="subproject/subbuild.xml" dir="subproject" target="compile"/>

<2>指定属性并在子项目中调用

<!-- 由于在默认时 inheritAll="true",因为当前项目中定义的param1属性和属性文件default.properties都可以在子项目中引用 -->
<ant antfile="subproject/property_based_subbuild.xml">
    <property name="param1" value="version 1.x"/>
    <property file="config/subproject/default.properties"/>
</ant>

<3>继承关系

假设在当前构件文件中定义了以下元素:

<path id="path1">
...
</path>
<path id="path2">
...
</path>
...
<ant antfile="subbuild.xml" inheritrefs="true"/>
...

在被调用的subbuild.xml中定义了<path>类型的path1但没定义<path>类型的path2。那么刚执行构件文件时,被调用的Ant project中的path1不会被覆盖,但path2可以被调用。如果指定inheritrefs=“false”,那么在被调用的project中既不会覆盖path1也不能引用path2

当需要覆盖path1时可把Ant任务改为:

<ant antfile="subbuild.xml" inheritrefs="false">
    <reference refid="path1"/>
</ant>

当需要当前project中的path1同时也要使用本身的path1,那可以通过reference做到,改写Ant任务为:

<ant antfile="subbuild.xml" inheritrefs="false">
    <reference refid="path1" torefid="path2"/>
</ant>

这个任务的作用是,再被调用的project中建立对当前project中的path1的引用,并命名为path2。在被调用的project中可通过path2来引用。

二、AntCall Task【任务】

作用:执行过程中调用并执行其他target。

AntCall任务的作用是允许一个target的执行过程中调用并执行其他的target
在打包项目前需要对项目进行编译,那么可以在打包项目的target中通过AntCall任务使得编译的target先执行。当然这种情况也可以通过target间设置depends属性来实现。AntCall任务必须在target元素内执行,这个任务不能在target元素外执行。

2.1 AntCall Task属性及功能

属性功能
target指定要被调用执行的target,通过名称指定这个target属性是必须的。值得注意的是,当通过AntCall任务调用的target存在依赖的target,则depends属性中被指定的target也会被执行。
inheritAll用于指定是否继承当前的属性。默认时为true,代表被调用的target可使用这些属性。
inhertRefs用于指定是否覆盖reference属性或者是否建立一个对当前reference属性的引用。在默认情况下,AntCall任务不会被覆盖reference属性,除非把inheritRefs属性设为true默认时inheritRefs属性为false。

2.2 利用AntCall Task实现target间调用时传递参数的实例

当需要从一个target传递参数到被调用的target时,可以使用<param>类型进行传递。当然也可以在target中定义property来实现,与Java中的方法调用时传递参数相似。

实例如下:

<?xml version="1.0"?>
<project name="antcallSample" default="targeA">
    <target name="init">
        <echo message="在init target中"/>
    </target>
    <target name="targeA">
        <echo message="在targetA中调用targetB"/>
        <!-- 通过property传递 -->
        <property name="prop" value="prop property"/>
        <antcall target="targetB">
            <!-- 通过antcall设定param实现 -->
            <param name="path1" value="path1 param"/>
        </antcall>
        <echo message="调用targetB之后。。。"/>
    </target>
    <target name="targetB" depends="init">
        <echo message="在targetB中。。。"/>
        <echo message="path1=${path1}"/>
        <echo message="prop=${prop}"/>
    </target>
</project>

运行结果:

E:\Workspace\ceshi>ant
Buildfile: E:\Workspace\ceshi\build.xml

targeA:
    [echo] 在targetA中调用targetB

init:
    [echo] 在init target中

targetB:
    [echo] 在targetB中。。。
    [echo] path1=path1 param
    [echo] prop=prop property
    [echo] 调用targetB之后。。。

BUILD SUCCESSFUL
Total time: 1 second

三、Apply/ExecOn Task

作用:通过Ant工具直接执行系统命令。

通过这个Task执行系统命令,这个命令依赖操作系统,而且只能在Ant支持的操作系统下执行。Ant支持Windows、Linux、UNIX、OS/2 Warp、Novell Netware 6MacOS X

3.1 Apply/ExecOn属性及功能

属性功能
executable用于指定要执行的命令,不带命令行参数,这个属性是必须的。
dest用于指定命令执行时目标文件的存放位置。
spawn用于指定是否在执行命令时产生输出信息,取值为true,表示Ant将不会产生这个命令的日志输出。默认为false。
dir用于指定执行命令所在的目录,在此目录下执行这个命令。
relative用于指定命令是否支持相对路径。默认为false,不支持相对路径,相对于当前目录或dest属性设定的目录。
forwardslash用于设定文件路径是否支持斜线分隔符,尽管有些操作系统支持其他的分隔符。默认时为false,如果操作系统的分隔符为斜线,那么这个属性将被忽略。
os列出允许执行这个命令的操作系统。
output指定把命令行执行的输出重定向到一个输出文件。如果错误信息没有重定向到特定文件,错误信息则将输出到这个文件中。
error指定一个文件用于接收错误的输出信息。从Ant1.6后提供了这个属性。
logErrot这个属性用于指定把错误的日志输出到Ant工具的日志信息中,也可以通过error属性指定到错误的输出文件。
append指定是否可以输出到一个存在的文件或者覆盖存在的文件,默认为false。
outputproperty指定输出定向到的属性的名字,在属性中可定义一个文件,这样就可以把输出信息输出到文件中。
errorproperty用于指定把错误信息输出到的属性的名字。
input指定一个文件,从这个文件中读取属性,在执行命令时可以引用得到这些属性。
inputstring用于把inputstring属性指定的字符串传递给执行的命令。
resultproperty这个属性用于存放命令执行后所返回的结果。
timeout设定一个时间,如果这段时间内命令没执行完毕,则这个命令会被中断。
failonerror这个属性用于指定是否出错时命令终止。如果属性取值为true,那么在执行的命令退出的同时返回一个部位0的代码,则构建进程将会终止。
failifexecutionfails用于指定当不能执行程序时是否终止构建命令的执行。默认为true。
skipemptyfilesets当指定的目录中没有文件,则构建明令将不会被执行。
parallel如果属性为true,则构建命令只执行一次,并把附加的文件作为命令参数。如果为false则每一个附加的文件都会执行一次这个命令。默认为false。
type指定传给要执行的命令的参数类型,可为file(文件),dir(目录),path(路径)。默认为false。
newenvironment如果当前的环境变量被声明,将不传递旧的环境变量,魔人认为false。
vmlauncher默认为true,通过Java虚拟机的特性来进行构件文件。如果为false,则通过操作系统本身的脚本功能去执行。
resolveExecutable默认为false,如果设为true,那么命令会在project的根目录下执行。如果在UNIX或Linux下只允许用户在自己的路径下执行这个命令,那么要把这个属性设为false。
maxparallel设定一个最大的平行值,用于指定一次执行的源文件的最大数目。如果设定为<0代表没有限制。默认为没有限制。
addsourcefile是否自动添加源文件名到执行的命令中,默认为true。
verbose是否输出命令执行时的概要信息,默认为false不输出。
ignoremissing是否忽略不存在的文件,默认为true。
force是否通过timestamp来对target文件进行对比。默认为false。

3.2 Apply/ExecOn Task可使用的参数

执行Apply/ExecOn任务时可以通过Ant提供的内置类型来简化操作,类似于参数传递的作用。

可使用的Ant类型有:

  • FileSet:可以通过<fileset>元素来设定文件集合,在任务中引用这个FileSet。
  • FileList:可以通过一个或多个FilList来指定文件列表,然后在Apply/ExecOn Task中进行引用。
  • DirSet:通过DirSet定义目录集合,然后在Apply/ExecOn Task中进行引用。
  • Arg:可通过<arg>类型指定命令行参数,然后在Apply/ExecOn Task中使用。
  • Mapper:通过Mapper类型可以指定dest属性的文件的映射关系。
  • Srcfile:通过参数指定源文件,在<arg>的后面使用,<arg>参数的值为Srcfile指定的源文件。
  • Targetfile:与Srcfile作用相似,用于指定目录文件的参数。
  • Env:指定一个环境变量,并在命令行中传递,以<env>类型的形式使用。

3.3 通过Apply/ExecOn Task执行Linux下ls命令的实例

<apply executable="ls">
    <arg value="-l"/>
    <fileset dir="/tmp">
        <patternset>
            <exclude name="**/*.txt"/>
        </patternset>
    </fileset>
    <fileset refid="other.files"/>
</apply>

这个例子的作用是:调用ls -lshell命令,列出/tmp目录下的所有非.txt文件和所有为other.filesFileSet类型所指定的文件的详细信息。

3.4 使用Mapper、Srcfile类型的实例

<apply executable="cc" dest="src/C" parallel="false">
    <arg value="-c"/>
    <arg value="-o"/>
    <targetfile/>
    <srcfile/>
    <fileset dir="src/C" includes="*.c"/>
    <mapper type="glob" from="*.c" to="*.o"/>
</apply>

这个例子的作用是:通过Mapper指定为每个比.o文件新的.c文件执行cc -c -o targetfile sourcefile命令。这个命令中用.o文件的名称替换targetfile(目标文件),用.c文件的名称替换sourcefile(源文件)。

四、Chmod Task

作用:改变Linux/UNIX系统的文件权限。

UNIXLinux系统下要改变文件的权限,可以使用chmodshell命令。在Chmod任务中可以引用FileSetDirSet类型指定的文件集合和目录集合。

4.1 Chmod Task属性及功能

属性功能
file用于指定即将被给变权限的文件名称。
dir用于指定这个目录下的所有文件的权限将要被改变。在Chmod任务中dir属性和file属性两者必须选择其中一个。
perm用于指定文件的新权限。
includes用于指定一个或多个文件的匹配模式,只有符合这些模式的文件的权限才会被改变。可用逗号符或空格符进行分隔。
excludes与includes属性的作用正好相反。
defaultexcludes用于指定是否不包括Ant工具默认不包含的文件匹配模式。可取值为yes或no。忽略此属性时代表不包含默认的不包含的文件模式。在Ant工具中默认不包含的文件模式如:**/*~,**/#*#,**/.#*,**/%*%,**/._*,**/CVS,**/CVS/**,**/.cvsignore,**/SCCS,**/SCCS/**,**/vssver.scc,**/.svn,**/.svn/**,**/.DS_Store
parallel用于指定是否为每个包含的文件独立执行Chmod命令,默认为true。
type可取值 为file、dir或both。取值file表示只改变文件的权限;若取值dir表示只改变目录的权限;若取值both则代表改变文件和目录两者的权限。
maxparallel用于指定一次执行Chmod命令的最大值。设为 < =0代表不限制,默认为不限制。
verbose用于指定在执行命令后是否输出这个命令的执行信息。默认为false不输出。

4.2 通过Ant改变Linux/UNIX文件和目录权限的例子

LinuxUNIX下通常通过Chmod命令来改变或目录的权限,Ant工具的Chmod任务也能实现同样地功能。

改变start.sh文件的权限让所有人对此文件具有读和执行的权限:

<chmod file="${dist}/start.sh" perm="ugo+rx"/>

所有用户对${dist}/start.sh文件都具有读和执行的权限。如果只有文件的所有者才具有读、写和执行权限,那么可以编写以下程序:

<chmod file="${dist}/start.sh" perm="o+rx"/>

当然也可以用数值来表示权限,上面的程序可改变:

<!-- 与上面的程序作用形同,文件的所有者才具有读、写和执行的权限 -->
<chmod file=${dist}/start.sh} perm="700"/>

当然也可以通过FileSet和DirSet类型实现更复杂的功能,例如:

<chmod perm="go-rwx" type="file">
    <fileset dir="/web">
        <include name="**/*.cgi"/>
        <include name="**/*.old"/>
    </fileset>
    <dirset dir="/web">
        <include name="**/private_*"/>
    </dirset>
</chmod>

这个例子的作用是让不是文件的所有者可以访问cgi脚本。文件的权限将会改变的文件有:所有/web目录下的.cgi.old文件,所有以private_*开头的文件或目录以private_*开头的目录下的文件。

五、Copy Task

作用:对文件和目录进行复制

Copy任务是把一个或多个文件复制到指定的目录下。但要注意的是,如果目标目录下具有同名的文件,那么只有当源文件相对于目标文件更新时,Ant工具才会复制这个文件。

5.1 Copy Task的属性及功能

属性功能
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.2 通过Copy Task实现文件和目录复制功能实例

5.2.1 对单个文件进行复制

<copy file="myfile.txt" tofile="mycopy.txt"/>
<copy file="myfile.txt" todir="../some/other/dir"/>

5.2.2 对文件目录进行复制

<copy todir="../new/dir">
    <fileset dir="src_dir"/>
</copy>

上面是个简单的例子,下面这个例子在复制的时候去除掉了非Java文件并且复制后重命名为.bak后缀的文件,以作备份:

<copy todir="../backup/dir>
    <fileset dir="src_dir">
        <exclude name="**/*.java/>
    </fileset>
    <globmapper from="*" to="*.bak"/>
</copy>

5.2.3 在执行Copy Task时使用文件过滤的实例

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

<copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <fileset>
        <fileset token="TITLE" value="Foo Bar"/>
    </fileset>
</copy>

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

六、Delete Task

作用:对文件和目录进行删除。

默认时不会删除空目录,要删除空目录可以设定includeEmptyDirs属性为true。在Delete任务中可以使用FileSetDirSet类型。

6.1 Delete Task 的属性及功能

属性功能
file用于指定要删除的文件的名称,可以为相对路径或绝对路径。
dir指定一个将要被删除的根目录。这个目录下的子目录及文件将可能被删除。dir属性和file属性两者必须指定其一。
verbose作用是指定是否在命令行中输出被删除的文件的名称。默认为false。
quiet作用是指定当要被删除的文件或目录不存在时是否不显示提示信息。默认为false,代表要显示提示信息。
failonerror用于指定当出现错误时是否停止执行命令。
includeemptydirs表示当使用FileSet类型时是否删除空的目录。
includes用于指定将要删除的文件或目录的模式。可用逗号或空格符进行分隔。
includesfile用于指定要删除的文件的模式。
excludes用于指定一个或多个文件模式或目录模式。这些符合条件的文件和目录将不被删除。
excludesfile用于指定将不被删除的文件模式,已不建议使用。
defaultexcludes用于指定是否使用Ant默认的default excludes模式,已不建议使用。
deleteonexit用于指定是否采用Java File类中的DeleteOnExit()方法进行判断,如果使用这个方法,那么仅当存在文件时才进行删除,默认取值为false。

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

6.2.1 删除单个文件

<delete file="/lib/ant.jar"/>

6.2.2 删除目录的实例

<delete dir="lib"/>

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

6.2.3 删除所有备份文件和空的目录的例子

<delete includeEmptyDirs="true">
    <fileset dir="." includes="**/*.bak"/>
</delete>

七、Echo Task:

作用:输出系统信息。

Echo任务的作用是根据logger(日志)或listener(监听器)的级别输出相应的信息。相当于Java中的System.out来输出信息。

7.1 Echo 任务的属性及功能

属性功能
message用于定义要输出的信息。这个属性是必需的。
file用于定义一个文件。这个文件用于接收message定义的输出信息,当设定为把信息输出到接收文件时才起作用。
append用于指定信息是否输出到指定的文件。默认为false。
level用于指定这个信息的级别。可取值为error,warning,info,verbose或debug。

输出到具体的文件中:

<echo message="This is simple message" file="/logs/messge.log" append="true"/>

八、Mkdir Task

作用:创建目录。

Mkdir任务只有一个属性dirdir属性用于指定要创建的目录名称,可为相对路径也可以为绝对路径。

<property name="dist" value="dist"/>
<mkdir dir="${dist}"/>

九、Move Task

作用:移动文件和目录

Move任务用于移动文件和目录,默认时Move任务会覆盖目标文件或目录(如果目标文件或目录存在)。当关闭overwrite时,Move任务只会移动源文件比目标文件新的文件,或者目标文件不存在时才移动。在Move任务中可以引用FileSet类型。

9.1 Move Task的属性及功能

属性功能
file用于指定要移动的文件或目录
preservelastmodified用于指定移动后的文件的最后修改时间与源文件相同
tofile作用是指定移动后的文件新名称和位置
todir作用是指定文件目录的目标位置
overwrite用于设定当源文件的最后修改时间大于目标文件的最后修改时间时,是否用袁恩建覆盖目标文件,默认为true
filtering用于定义在移动时是否允许符号过滤
flatten作用是忽略目录结构。把各层目录下的文件移动到同一个目录下,默认为false
includeEmptyDirs用于指定在移动时是否忽略空目录,默认为false
failonerror用于定义当出现错误时是忽略并继续执行,还是当遇到错误时就停止执行命令
verbose用于指定当文件移动时是否输出日志信息
encoding用于定义在移动文件时使用的过滤器的编码方式
outputencoding用于定义在写文件时使用的编码方式
enablemutiplemapping用于指定是否可以使用多个映射,默认时只使用一个映射
granularity用于指定一个文件修改时间的毫秒数据的允许误差。因为不是所有文件系统的修改时间都精确到毫秒数,默认时为0,如果DOS系统则为2

9.2 使用Move Task实现移动文件和目录功能的实例

9.2.1 移动单个文件

<move file="file.org" tofile="file.moved"/>

作用:重命名file.org文件为file.moved

<move file="file.org" todir="dir/to/move/to"/>

作用:把文件file.org移动到dir/to/move/to目录下。

9.2.2 移动目录

<move todir="new/dir/to/move/to">
    <fileset dir="src/dir"/>
</move>

作用:把src/dir目录移动到new/dir/to/move/to目录。

Ant1.6.3版本后,可以使用以下file属性来指定目录从而实现上面目录移动的功能:

<move file="src/dir" tofile="new/dir/to/move/to"/>

9.2.3 使用Mapper功能

<move todir="my/src/move" includeemptydirs="false">
    <fileset dir="my/src/dir">
        <exclude name="**/*.bak"/>
    </fileset>
    <mapper type="glob" from="*" to="*.bak"/>
</move>

作用:把my/src/dir目录下的所有文件移动到my/src/move并重命名为.bak的备份文件。

十、Zip Task

作用:创建Zip文件

Zip这个任务用于实现打包zip文件的功能。在Zip任务里可以直接嵌套使用FileSet类型、include类型、exclude类型等,在这些文件类型中还可以对文件进行过滤。

10.1 Zip Task的属性及功能

属性功能
destfile用于指定将要打包的zip文件
zipfile也用于指定要打包的zip文件,但已不建议使用,应该使用destfile属性来代替,zipfile属性和destfile属性两者必须选择其一
basedir用于指定打包zip文件的目录
compress用于指定是否使用压缩的形式来保存数据,默认为true(对数据进行压缩)
keepcompression用于指定已压缩的zip文件保持原先的压缩格式,默认为false
encoding用于指定Zip任务里的文件名称的编码方式。默认时采用操作系统的编码方式
filesonly用于指定是否在Zip任务中只存储文件,默认为false
includes用于指定一个或多个在Zip任务中要包含的文件。可以使用逗号或空格符进行分隔,当这个属性被忽略时代表zip将包含所有文件
includesfile用于指定zip文件中要包含的文件的名称
excludes用于指定一个或多个Zip任务中不被包含的文件。可以使用逗号或空格符进行分隔,当这个属性被忽略时代表Zip任务将包含所有文件
excludesfile用于指定在Zip任务中不被包含的文件的名称
defaultexcludes用于定义是否在Zip中不包含Ant默认要排除的文件模式。可取值为yes或no,忽略时代表使用默认的排除文件模式,将不包含符合这些模式的文件
update用于定义是否更新或覆盖目标文件,当目标文件已存在时,默认为false
whenempty用于指定当没有满足打包条件的文件时的处理方式。可取值为fail、skip和create。fail代表创建zip失败,skip代表忽略不处理,create代表依然创建zip文件,默认为skip
duplicate定义当出现重复文件时的处理方式。可取值add、preserve和fail。add代表依然添加(覆盖)文件,preserve代表不打包重复文件,fail代表将打包失败,默认为add
roundup用于指定打包zip文件时文件的修改时间是否采用下一个连续的秒数,默认为true
comment作用是在zip文件中加上注释

10.2 使用Zip Task打包zip文件的实例

10.2.1 打包zip文件的实例

<zip destfile="${dist}/manual.zip" basedir="htdocs/manual" includes="api/**/*.html" excludes="**/todo.html" />

作用:打包htdocs/manual目录下的文件,并且命名为manual.zip。在这个zip文件中只包含htdocs/manual/api目录或其子目录下的html文件,但不包含其中文件名为todo.html文件。

10.2.2 使用ZipFileSet类型的Zip任务实例

<zip destfile="${dist}/manual.zip">
    <zipfileset dir="htdocs/manual" prefix="docs/user-guide"/>
    <zipfileset dir="." includes="ChangeLog27.txt" fullpath="docs/ChangeLog.txt"/>
    <zipfileset src="examples.zip" includes="**/*.html" prefix="docs/examples"/>
</zip>

作用:把htdocs/manual目录下的所有文件及子目录打包到doc/user-guide目录下;把当前目录下的ChangeLog27.txt文件打包为docs/ChangLog.txt;同时把example.zip下的所有html文件打包到docs/examples下。

10.2.3 使用zipgroupfileset的zip任务实例

<zip destfile="${dist}/manual.zip">
    <zipfileset dir="htdocs/manual" prefix="docs/user-guide"/>
    <zipgroupfileset dir="." includes="examples*.zip"/>
</zip>

作用:把htdocs/manual下的所有目录及文件打包到docs/user-guide下;同时包含所有zip文件名为example*.zip的文件,例如example1.zip

十一、LoadProperties:加载属性文件

为了便于维护和细分功能。通常会把Ant中定义的property元素放到一个或多个.properties文件中定义,然后在Ant中引入这些属性。LoadProperty可以导入.properties文件的功能,从而把property文件中的property元素导入Ant构件文件中。

11.1 LoadProperties Task的属性及功能

属性功能
srcFile定义要导入的属性文件
resource也用于指定属性文件的名称,resource属性和srcFile属性两者必须指定其一
encoding指定导入文件时的编码方式
classpath指定查找resource指定的文件的路径
classpathref用于指定一个classpath类型的引用,当在查找resource指定的文件时使用

11.2 LoadProperties Task加在属性文件的实例

这里举一个文件复制的例子。假设现在需要把src目录下的所有文件复制到dest目录下,这里使用copyproperties文件来定义源文件和目标文件的位置,然后在Ant工具中使用copy.properties中定义的属性。当文件目录改变时,只需要改变copy.properties中的属性,而不需要改变build.xml

copy.properties文件内容:

copy.src=src
copy.dest=dest
aaa=ceshi

下面的额构件文件中也是用一个文件行的过滤器:

<?xml version="1.0"?>
<project name="loadpropertiesSample" default="copyFile">
    <!-- 导入属性文件 -->
    <loadproperties srcFile="copy.properties">
        <!-- 定义文件过滤器 -->
        <filterchain>
            <linecontains>
                <contains value="copy." />
            </linecontains>
        </filterchain>
    </loadproperties>
    <!-- 复制文件 -->
    <target name="copyFile">
        <copy todir="${copy.dest}">
            <fileset dir="${copy.src}" />
        </copy>
        <echo message="${aaa}" />
    </target>
</project>

运行结果:

E:\Workspace\ceshi\111>ant
Buildfile: E:\Workspace\ceshi\111\build.xml

copyFile:
    [copy] Copying 1 file to E:\Workspace\ceshi\111\dest
    [echo] ${aaa}

BUILD SUCCESSFUL
Total time: 2 seconds

十二、Tstamp Task

作用:获取并格式化日期或时间

Tstamp任务的作用是设定当前日期和时间的格式,可在target中使用。默认时日期的格式为yyyyMMdd(例如:20060516)。默认的时间格式为hhmm(例如:1200)。默认时Ant工具设定TODAY(今天)格式MMMM dd yy(例如:May 05 06)。这些格式与Java的日期格式相同。

12.1 Tstamp Task的属性及功能

属性功能
property用于定义一个属性名称,通过这个属性可以得到Tstamp格式化后的日期或时间
pattern用于设定要格式化时间或日期的格式,与Java中的SimpleDateFormat类中的格式相同
timezone用于指定格式化时的时区,与Java中的timezone类中定义的相同
unit用于设定与当时时间相差的单位。可设为millisecond(毫秒)、second(秒)、minute(分钟)、hour(小时)、day(日)、week(周)、month(月)和year(年)
offset用于设定与当前时间相差的值,单位由unit设定
locale用于指定格式化的locale值(不同国家和语言有不同的值)。与Java中的Locale类指定的il8n国际化功能时间,用不同国家的日期格式

12.2 通过Tstamp Task格式化日期和时间的例子

Tstamp格式化日期的时间的例子如下:

<?xml version="1.0"?>
<project name="timestamp" default="timestampTarget">
    <tstamp>
        <format property="TODAY_UK" pattern="d-MMMM-yyyy" locale="en"/>
    </tstamp>
    <tstamp>
        <format property="TODAY_CN" pattern="d-MMMM-yyyy" locale="zh"/>
    </tstamp>
    <tstamp>
        <format property="touch.time" pattern="MM/dd/yyyy hh:mm aa" offset="-5" unit="hour"/>
    </tstamp>
    <!-- 输出的日期格式定义 -->
    <target name="timestampTarget" >
        <echo message="${DSTAMP}"/>
        <echo message="${TODAY_UK}" />
        <echo message="${TODAY_CN}" />
        <echo message="${touch.time}" />
    </target>
</project>

运行结果:

E:\Workspace\ceshi\111>ant -f timestamp.xml
Buildfile: E:\Workspace\ceshi\111\timestamp.xml

timestampTarget:
    [echo] 20161217
    [echo] 17-December-2016
    [echo] 17-十二月-2016
    [echo] 12/17/2016 07:49 上午

BUILD SUCCESSFUL
Total time: 0 seconds

参考资料:

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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页