资源

类似文件的实体可以抽象为资源的概念。除了提供对类似文件属性的访问外,资源实现还应尽可能提供从底层实体读取内容和/或向底层实体写入内容的方法。虽然资源概念是在 Apache Ant 1.5.2 中引入的,但资源从 Ant 1.7 开始可供显式使用。

内置资源类型

内置资源类型包括:

resource

基本资源。其他资源类型派生自这种基本类型;因此,所有属性都可用,尽管在大多数情况下,无关属性将被忽略。这种资源实现以及所有资源实现都可用作单元素资源集合

属性 描述 必需
name 此资源的名称
exists 此资源是否存在 否;默认值为 true
lastmodified 此资源的最后修改时间
directory 此资源是否类似目录 否;默认值为 false
size 此资源的大小
refid 使此 resource 成为对在其他地方定义的 resource引用。如果指定此属性,则不允许其他属性或嵌套元素。

file

表示通过本地文件系统约定可访问的文件。

属性 描述 必需
file 此资源表示的文件
basedir 此资源的基目录。当设置此属性时,尝试访问资源的名称将产生相对于此位置的路径。
refid 使此 file 成为对在其他地方定义的 file引用。如果指定此属性,则不允许其他属性或嵌套元素。

javaresource

表示通过 Java 类加载器可加载的资源。

属性 描述 必需
name 资源的名称。
classpath 查找资源时要使用的类路径。
classpathref 查找资源时要使用的类路径,以对在其他地方定义的 <path>引用形式给出。
loaderRef 用于加载资源的加载器的名称,由指定的类路径构造。
parentFirst 在使用嵌套类路径时,是否首先咨询父类加载器——父类加载器很可能是系统类加载器。
从 Ant 1.8.0 开始
否;默认为 true
refid 使此 javaresource 成为对在其他地方定义的 javaresource引用。如果指定此属性,则不允许其他属性或嵌套元素。

类路径也可以作为嵌套类路径元素指定,其中 <classpath>路径状结构

javaconstant

加载 Java 常量的值。作为javaresource 的特例,支持其所有属性和嵌套元素。常量必须指定为 public static,否则无法加载。

属性 描述 必需
name 资源的名称。必须指定为完全限定的字段名称。
refid 使此 javaconstant 成为对在其他地方定义的 javaconstant引用。如果指定此属性,则不允许其他属性或嵌套元素。
示例

这将 org.acme.Main 类的常量 VERSION 的值加载到 version 属性中。查找该类的类路径通过嵌套的 classpath 元素提供。

<loadresource property="version">
  <javaconstant name="org.acme.Main.VERSION">
    <classpath>
      <pathelement location="${acme.lib.dir}"/>
    </classpath>
  </javaconstant>
</loadresource>

使用该常量的值 (build.xml) 创建一个新文件 c:/temp/org.apache.tools.ant.Main.DEFAULT_BUILD_FILENAME

<copy todir="c:/temp">
  <javaconstant name="org.apache.tools.ant.Main.DEFAULT_BUILD_FILENAME"/>
</copy>

zipentry

表示 ZIP 存档中的条目。可以使用 archive 属性或嵌套的单元素资源集合指定存档。zipentry 仅支持文件系统资源作为嵌套元素。

属性 描述 必需
zipfile 包含此资源的 zip 文件 是,除非已指定嵌套资源集合
archive zipfile 的别名
name 存档资源的名称
encoding zip 文件的编码 否;默认为默认 JVM 字符编码
refid 使此 propertyresource 成为对在其他地方定义的 propertyresource引用。如果指定此属性,则不允许其他属性或嵌套元素。

tarentry

表示 TAR 存档中的条目。可以使用 archive 属性或嵌套的单元素资源集合指定存档。

属性 描述 必需
archive 包含此资源的 tar 存档 是,除非已指定嵌套资源集合
name 存档资源的名称

gzipresource

这不是一个独立的资源,而是另一个资源的包装器,它提供对资源内容的即时压缩。必须将单元素资源集合指定为嵌套元素。

bzip2resource

这不是一个独立的资源,而是另一个资源的包装器,它提供对资源内容的即时压缩。必须将单元素资源集合指定为嵌套元素。

xzresource

这不是一个独立的资源,而是另一个资源的包装器,它提供对资源内容的即时压缩。必须将单元素资源集合指定为嵌套元素。

XZ 压缩支持从 Apache Ant 1.10.1 开始添加,并且依赖于 Ant 分发版中未包含的外部库。有关更多信息,请参阅库依赖项

url

表示 URL。

属性 描述 必需
url 要公开的 URL 这些属性中只有一个
file 要作为 file: URL 公开的
baseUrl 必须与 relativePath 组合的基 URL
relativePath baseUrl 组合时定义 URL 的相对路径 如果使用 baseUrl
refid 使此 url 成为对在其他地方定义的 url引用。如果指定此属性,则不允许其他属性或嵌套元素。

string

表示 Java 字符串。可以写入它,但只能写入一次,之后再次写入它将是错误的。

属性 描述 必需
value 此资源的值
refid 使此 string 成为对在其他地方定义的 string引用。如果指定此属性,则不允许其他属性或嵌套元素。

该资源还支持嵌套文本,只有在未设置 value 属性的情况下才能提供。

<string>
    self.log("Ant version =${ant.version}");
</string>

propertyresource

表示 Ant 属性。

属性 描述 必需
name 属性名称

资源集合

资源集合是对将多个资源分组在一起的实体的抽象。Ant 的一些“传统”数据类型已被修改为表现得像资源集合一样。

奇怪的是,一些任务甚至可以合法地表现得像资源集合一样。

其他内置资源集合

其他内置资源集合包括:

resources

一个通用资源集合,专为与引用一起使用而设计。例如,如果第三方 Ant 任务生成未知类型的资源集合,则仍然可以通过 <resources> 集合访问它。这种集合类型的次要用途是作为其他资源集合的容器,保留嵌套集合的顺序以及重复资源(与union 相比)。

属性 描述 必需
cache 是否缓存结果。从 Ant 1.8.0 开始 否;默认值为 false
refid 使此 resourcecollection 成为对在其他地方定义的 resourcecollection引用。如果指定此属性,则不允许其他属性或嵌套元素。

files

一组文件。这些文件通过从多个PatternSets 中获取的绝对模式进行匹配。这些模式可以作为嵌套的 <patternset> 元素指定。此外,<files> 持有一个隐式 PatternSet,并直接支持 PatternSet 的嵌套 <include><includesfile><exclude><excludesfile> 元素,以及 PatternSet 的属性。

文件选择器 可用作嵌套元素。文件必须被所有选择器选中才能被包含;因此,<files> 等效于 <and> 文件选择器容器。

更简单地说,这种类型等效于没有基目录的fileset请注意,如果没有基目录,文件系统扫描将完全基于包含和排除模式。filename(或任何)选择器只能影响基于模式的选择包含文件的扫描过程。

属性 描述 必需
includes 必须包含的文件模式的逗号或空格分隔列表 至少一个
includesfile 文件的名称;此文件的每一行都被视为包含模式。
excludes 必须排除的文件模式的逗号或空格分隔列表 否;默认为默认排除项,或者如果 defaultexcludesno,则为无
excludesfile 文件的名称;此文件的每一行都被视为排除模式。
defaultexcludes 是否应使用默认排除项 否;默认值为 true
casesensitive 模式是否区分大小写 否;默认值为 true
refid 使此 files 成为对在其他地方定义的 files引用。如果指定此属性,则不允许其他属性或嵌套元素。

restrict

使用资源选择器限制嵌套资源集合

属性 描述 必需
cache 是否缓存结果;禁用可能会严重影响性能 否;默认值为 true
refid 使此 restrict 成为对在其他地方定义的 restrict引用。如果指定,则不允许其他属性或嵌套元素。
作为嵌套元素指定的参数

需要单个资源集合。

嵌套资源选择器用于通过逻辑AND组合来“缩小”包含的资源。这些模式类似于 文件选择器,但不出所料,它们针对的是资源。内部 antlib org.apache.tools.ant.types.resources.selectors 中提供了几个内置资源选择器。

name

按名称选择资源。

属性 描述 必需
name 使用标准 Ant 模式测试的名称模式。 这两个中的一个
regex 与要选择的匹配文件的正则表达式。
casesensitive 名称比较是否区分大小写 否;默认值为 true
handledirsep 如果指定此项,映射器将把资源名称或名称属性中的 \ 字符视为 /,以进行匹配。此属性可以是 truefalse自 Ant 1.8.0 起否;默认值为 false
exists

选择现有资源。

date

按日期选择资源。

属性 描述 必需
millis 自 1970 年 1 月 1 日以来的毫秒数表示的比较日期/时间 以下之一
datetime 格式化的比较日期/时间
pattern datetime 属性一起使用的 SimpleDateFormat 兼容模式,使用当前区域设置 否;默认值为 MM/dd/yyyy hh:mm a,使用美国区域设置
granularity 比较文件修改时间时使用的毫秒数宽限值。这是必需的,因为并非所有文件系统都支持将最后修改时间跟踪到毫秒级。 否;默认值因平台而异:FAT 文件系统 = 2 秒;Unix = 1 秒;NTFS = 1 毫秒。
when 以下之一:beforeafterequal 否;默认值为 equal
type

按类型(文件或目录)选择资源。

属性 描述 必需
type 以下之一:filedirany自 Ant 1.8 起
size

按大小选择资源。

属性 描述 必需
size 要比较的大小
when 以下之一:equaleqgreatergtlessltge(大于或等于)、ne(不等于)、le(小于或等于) 否;默认值为 equal
instanceof

按类型选择资源。

属性 描述 必需
class 资源必须是其实例的类 以下之一
type 必须从资源分配的 Ant 类型
uri 必须在其中定义 type 的 URI
and

如果资源被所有嵌套资源选择器选中,则选择该资源。

or

如果资源被至少一个嵌套资源选择器选中,则选择该资源。

not

否定允许的单个嵌套资源选择器的选择结果。

none

如果资源未被任何嵌套资源选择器选中,则选择该资源。

majority

如果资源被大多数嵌套资源选择器选中,则选择该资源。

属性 描述 必需
allowtie 是否将平局(当嵌套资源选择器的数量为偶数时)视为多数 否;默认值为 true
compare

根据资源与一个或多个“控制”资源的比较选择资源,使用嵌套的 资源比较器

属性 描述 必需
when 比较(equal/eqgreater/gtless/ltle(小于或等于)、ge(大于或等于)、ne(不等于)。 否;默认值为 equal
against 量词(all/each/everyany/some、(正好)onemost/majoritynone 否;默认值为 all
作为嵌套元素指定的参数

必须使用嵌套的 <control> 元素指定将进行比较的资源,该元素表示 资源 集合。

示例

假设命名空间设置

rsel="antlib:org.apache.tools.ant.types.resources.selectors"
rcmp="antlib:org.apache.tools.ant.types.resources.comparators"
<restrict>
  <fileset dir="src" includes="a,b,c,d,e,f,g"/>
  <rsel:compare when="le" against="all">
    <control>
      <resource name="d"/>
    </control>
    <rcmp:name/>
  </rsel:compare>
</restrict>

选择文件 abcd

<project rsel="antlib:org.apache.tools.ant.types.resources.selectors">
    <macrodef name="copyFromPath">
        <attribute name="todir"/>
        <attribute name="refid"/>
        <element name="nested-resource-selectors" optional="yes" implicit="true"/>
        <sequential>
            <mkdir dir="@{todir}" taskname="copyFromPath"/>
            <copy todir="@{todir}" taskname="copyFromPath">
                <restrict>
                    <path refid="@{refid}"/>
                    <rsel:or>
                        <nested-resource-selectors/>
                    </rsel:or>
                </restrict>
                <flattenmapper/>
            </copy>
        </sequential>
    </macrodef>
    <copyFromPath refid="classpath" todir="todir">
        <rsel:name name="log4j.properties"/>
        <rsel:name name="default.properties"/>
    </copyFromPath>
</project>

创建 todir 目录,并从类路径(在编译时已使用)中复制(如果存在)文件 log4j.propertiesdefault.properties

<project>
    <filelist id="allfiles" dir="${ant.home}/bin" files="ant.cmd,foo.txt,ant.bat,bar.txt,ant"/>
    <restrict id="missingfiles">
        <filelist refid="allfiles"/>
        <rsel:not xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">
            <rsel:exists/>
        </rsel:not>
    </restrict>
    <echo>These files are missed: ${toString:missingfiles}</echo>
</project>

资源集合 allfiles 定义了预期的一系列文件。restrict missingfiles 使用 <not><exists> 选择器来获取所有不存在的文件。最后,我们使用 toString: pathshortcut 以可读形式获取它们:[echo] These files are missed: ....foo.txt;....bar.txt

sort

根据资源的自然顺序或一个或多个嵌套的 资源比较器 对嵌套资源集合进行排序

属性 描述 必需
cache 是否缓存结果;禁用可能会严重影响性能 否;默认值为 true
refid 使此 sort 成为对在其他地方定义的 sort引用。如果指定,则不允许其他属性或嵌套元素。
作为嵌套元素指定的参数

需要单个资源集合。

可以通过指定一个或多个资源比较器来控制和自定义排序。可以根据多个条件对资源进行排序;第一个指定的条件是“最外层”,而最后一个指定的条件是“最内层”。内部 antlib org.apache.tools.ant.types.resources.comparators 中提供了几个内置资源比较器。

资源比较器
name

按名称对资源进行排序。

exists

按是否存在对资源进行排序。不存在被视为“小于”存在。

date

按日期对资源进行排序。

type

按类型(文件或目录)对资源进行排序。由于目录包含文件,因此它们被视为“大于”。

size

按大小对资源进行排序。

content

按内容对资源进行排序。

属性 描述 必需
binary 是否应以二进制模式比较内容。如果为 false,则将不考虑特定于平台的行尾约定来比较内容。 否;默认值为 true
reverse

反转自然排序顺序或单个嵌套比较器的排序顺序。

示例
<property name="eol" value="${line.separator}"/>
<pathconvert property="sorted" pathsep="${eol}">
  <sort>
    <tokens>
      <string value="foo bar etc baz"/>
      <stringtokenizer/>
    </tokens>
  </sort>
</pathconvert>

类型为字符串的资源 foo bar etc bazstringtokenizer 分割为四个标记。这些标记被排序,并且 sorted 获取 bar baz etc foo 的值。

<sort>
  <fileset dir="foo"/>
  <reverse xmlns="antlib:org.apache.tools.ant.types.resources.comparators">
    <date/>
  </reverse>
</sort>

这将获取来自 foo 的所有文件,并按修改日期以反向顺序对其进行排序。由于使用的资源比较器(<reverse><date>)位于内部 antlib 中,因此必须显式设置其命名空间。

first

从嵌套资源集合中包含前 count 个资源。这可以与 sort 集合一起使用,例如,从更大的集合中选择前几个最旧、最大等资源。

属性 描述 必需
count 要包含的资源数量 否;默认值为 1
cache 是否缓存结果;禁用可能会严重影响性能 否;默认值为 true
refid 使此 first 成为对在其他地方定义的 first引用。如果指定,则不允许其他属性或嵌套元素。
作为嵌套元素指定的参数

需要单个资源集合。

last

自 Ant 1.7.1 起

从嵌套资源集合中包含最后 count 个资源。这可以与 sort 集合一起使用,例如,从更大的集合中选择最后几个最旧、最大等资源。

属性 描述 必需
count 要包含的资源数量 否;默认值为 1
cache 是否缓存结果;禁用可能会严重影响性能 否;默认值为 true
refid 使此 last 成为对在其他地方定义的 last引用。如果指定,则不允许其他属性或嵌套元素。
作为嵌套元素指定的参数

需要单个资源集合。

allbutfirst

自 Ant 1.9.5 起

包含除嵌套资源集合中的前 count 个资源之外的所有元素。这可以与 sort 集合一起使用,例如,从更大的集合中选择除前几个最旧、最大等资源之外的所有资源。

属性 描述 必需
count 要排除的资源数量 否;默认值为 1
cache 是否缓存结果;禁用可能会严重影响性能 否;默认值为 true
refid 使此 allbutfirst 成为对在其他地方定义的 allbutfirst引用。如果指定,则不允许其他属性或嵌套元素。
作为嵌套元素指定的参数

需要单个资源集合。

allbutlast

自 Ant 1.9.5 起

包含除嵌套资源集合中的最后 count 个资源之外的所有元素。这可以与 sort 集合一起使用,例如,从更大的集合中选择除最后几个最旧、最大等资源之外的所有资源。

属性 描述 必需
count 要排除的资源数量 否;默认值为 1
cache 是否缓存结果;禁用可能会严重影响性能 否;默认值为 true
refid 使此 allbutlast 成为对在其他地方定义的 allbutlast引用。如果指定,则不允许其他属性或嵌套元素。
作为嵌套元素指定的参数

需要单个资源集合。

tokens

包含从嵌套资源集合中收集的 string 标记。使用 TokenFilter 支持的相同标记器。对该资源集合的富有想象力的使用可以实现等效于 Unix 函数,例如 sortgrep -cwcwc -l

属性 描述 必需
encoding 嵌套资源的编码 否;默认值为默认 JVM 字符编码
cache 是否缓存结果;禁用可能会严重影响性能 否;默认值为 true
refid 使此 tokens 成为对在其他地方定义的 tokens引用。如果指定,则不允许其他属性或嵌套元素。
作为嵌套元素指定的参数
示例
<concat>
  <union>
    <sort>
      <tokens>
        <resources refid="input"/>
        <linetokenizer includedelims="true"/>
      </tokens>
    </sort>
  </union>
</concat>

对资源集合 input 实现 Unix sort -u

集合运算

以下资源集合实现集合运算

union

嵌套资源集合的并集。

唯一支持的属性是 refid,它使此 union 成为对在其他地方定义的 union引用。如果指定,则不允许其他属性或嵌套元素。

intersect

嵌套资源集合的交集。

唯一支持的属性是 refid,它使此 intersect 成为对在其他地方定义的 intersect引用。如果指定,则不允许其他属性或嵌套元素。

difference

嵌套资源集合的差集。

以下属性适用于所有集合运算资源集合

属性 描述 必需
cache 是否缓存结果;禁用可能会严重影响性能 否;默认值为 true
refid 将此 difference 设为对在其他地方定义的 difference引用。如果指定了此属性,则不允许其他属性或嵌套元素。
示例
<resources id="A">
    <string value="a"/>
    <string value="b"/>
</resources>
<resources id="B">
    <string value="b"/>
    <string value="c"/>
</resources>
<union id="union"><resources refid="A"/><resources refid="B"/></union>
<intersect id="intersect"><resources refid="A"/><resources refid="B"/></intersect>
<difference id="difference"><resources refid="A"/><resources refid="B"/></difference>
<echo>
  A: ${toString:A}                    = a;b
  B: ${toString:B}                    = b;c

  union     : ${toString:union}       = a;b;c
  intersect : ${toString:intersect}   = b
  difference: ${toString:difference}  = a;c
</echo>

mappedresources

从 Ant 1.8.0 开始

包装另一个资源集合,并使用 映射器 映射嵌套资源的名称。

即使 mappedresources 包装的资源集合包含基于文件系统的资源,mappedresources 也不会显示为基于文件系统。这意味着您不能将 mappedresources 与仅允许基于文件系统的资源的任务一起使用。

作为属性指定的参数
属性 描述 必需
cache 是否缓存结果;启用可能会提高性能。自 Ant 1.8.1 起 否;默认值为 false
enablemultiplemappings 如果为 true,则集合将对给定源路径使用所有映射。如果为 false,则它将仅处理第一个资源。自 Ant 1.8.1 起 否;默认为 false
refid 将此 mappedresources 设为对在其他地方定义的 mappedresources引用。如果指定了此属性,则不允许其他属性或嵌套元素。
作为嵌套元素指定的参数

需要单个资源集合。

可以使用单个 映射器 来映射名称。如果没有给出映射器(老实说,这没有意义),则将使用标识映射器。

示例

将给定目录中的所有文件复制到目标目录,并在扩展名中添加 .bak。请注意,这也可以通过将 mapper 直接嵌套到 copy 中来完成。

<copy todir="${target}">
  <mappedresources>
    <fileset dir="${src}"/>
    <globmapper from="*" to="*.bak"/>
  </mappedresources>
</copy>

创建一个 WAR 存档,将所有作为文件的 CLASSPATH 条目添加到 WEB-INF/lib 目录中,而不保留其文件系统结构。

<war destfile="${output}">
  <mappedresources>
    <restrict>
      <path path="${java.class.path}"/>
      <type type="file"/>
    </restrict>
    <chainedmapper>
      <flattenmapper/>
      <globmapper from="*" to="WEB-INF/lib/*"/>
    </chainedmapper>
  </mappedresources>
</war>

archives

从 Ant 1.8.0 开始

此资源集合接受任意数量的嵌套资源,并假设所有这些资源必须是 ZIP 或 TAR 存档。<archives> 返回的资源是嵌套存档的内容。

此资源集合是 zipgroupfileset 的泛化,它仅受 zip 系列任务支持。

唯一支持的属性是 refid,它将此 archives 设为对在其他地方定义的 archives引用。如果指定了此属性,则不允许其他属性或嵌套元素。

作为嵌套元素指定的参数

<archives> 有两个嵌套元素 <zips><tars>,它们本身是 联合,即它们接受任意数量的资源(集合)作为嵌套元素。

<zips> 的嵌套资源被视为 ZIP 存档,<tars> 的嵌套资源被视为 TAR 存档。

示例

将类路径上所有 jar 文件中的所有文件复制到 ${target}

<copy todir="${target}">
  <archives>
    <zips>
      <restrict>
        <path path="${java.class.path}"/>
        <name name="*.jar"/>
      </restrict>
    </zips>
  </archives>
</copy>

resourcelist

从 Ant 1.8.0 开始

此资源集合接受任意数量的嵌套资源,读取这些资源,并为读取的每一行返回一个资源。

如果该行包含冒号,Ant 将尝试将其用作 URL,如果失败(或该行不包含冒号),则将返回一个文件资源,其名称为该行的内容。

将为每一行扩展属性。如果属性扩展生成资源对象而不是字符串(例如,由于自定义属性帮助程序),则将直接返回这些资源。

<resourcelist><filelist> 的泛化。

属性 描述 必需
encoding 嵌套资源的编码 否;默认值为默认 JVM 字符编码
basedir 用于解析相对于其的相对文件名的基目录。还用于为此资源集合创建的 FileResources 提供基目录。自 Ant 1.10.4 起
preserveduplicates 使此 resourcelist 返回所有资源,次数与其指定的次数相同。否则,resourcelist 将仅返回每个资源,按其首次出现的顺序。自 Ant 1.10.10 起
refid 将此 resourcelist 设为对在其他地方定义的 resourcelist引用。如果指定了此属性,则不允许其他属性或嵌套元素。
作为嵌套元素指定的参数

<resourcelist> 接受任意数量的资源(集合)作为嵌套元素。

此外,<resourcelist> 支持嵌套的 <filterchain> 元素,这些元素可用于在扩展其行之前过滤/修改读取的资源。这样的嵌套元素对应于 过滤器链

示例

以下示例从几个可实际访问的备用 URL 的第一个 URL 中复制一个文件。它假设文件 mirrors.txt 如下所示

    mirrors.txt:
https://best.mirror.example.org/
http://second.best.mirror.example.org/mirror/of/best/
https://yet.another.mirror/
https://the.original.site/
<copy todir="${target}">
  <first>
    <restrict>
      <resourcelist>
        <file file="mirrors.txt"/>
      </resourcelist>
      <exists/>
    </restrict>
  </first>
</copy>