选择器

选择器是一种机制,它允许根据除文件名之外的其他条件选择构成 <fileset> 的文件,这些条件由 <include><exclude> 标签提供。

如何使用选择器

选择器是 FileSet 的一个元素,出现在 FileSet 中。它也可以在任何目标之外定义,方法是使用 <selector> 标签,然后将其用作引用。

不同的选择器具有不同的属性。一些选择器可以包含其他选择器,这些选择器称为 选择器容器。还有一类选择器允许用户定义扩展,称为 自定义选择器。内置于 Apache Ant 的选择器称为 核心选择器

核心选择器

核心选择器是 Ant 中自带的选择器。它们可以在 fileset 中使用,也可以包含在选择器容器中。

核心选择器是

包含选择器

FileSet 中的 <contains> 标签将该 fileset 定义的文件限制为仅包含 text 属性指定的字符串的文件。

<contains> 选择器可以用作 ResourceSelector(参见 <restrict> ResourceCollection)。

属性 描述 必需
text 指定每个文件必须包含的文本
casesensitive text 属性中查找字符串时是否区分大小写。 否;默认值为 true
ignorewhitespace 在检查 text 属性中的字符串之前是否消除空格。 否;默认值为 false
encoding 正在选择资源的编码。自 Ant 1.9.0 起 否;默认为默认 JVM 字符编码

以下是如何使用包含选择器的示例

<fileset dir="${doc.path}" includes="**/*.html">
    <contains text="script" casesensitive="no"/>
</fileset>

选择所有包含字符串 script 的 HTML 文件。

日期选择器

FileSet 中的 <date> 标签将对 include 标签指定的文件进行限制,因此最后修改日期不符合选择器指定的日期限制的标签最终不会被选中。

属性 描述 必需
datetime 指定要测试的日期和时间。应使用美国区域设置以 MM/dd/yyyy hh:mm a 格式,或通过 pattern 属性指定备用模式。 两者中至少有一个
millis 自 1970 年以来的毫秒数,应对此进行测试。通常使用 datetime 属性要容易得多。
when 指示如何解释日期,是要选择最后修改时间在指定值之前、之后还是等于指定值的那些文件。此属性的有效值为
  • before—选择最后修改日期在指定日期之前的文件
  • after—选择最后修改日期在指定日期之后的那些文件
  • equal—选择最后修改日期正好是此日期的文件
否;默认值为 equal
granularity 比较文件修改时间时要使用的毫秒数宽限值。这是必需的,因为并非所有文件系统都支持将最后修改时间跟踪到毫秒级别。 否;默认值为 0 毫秒,或在 DOS 系统上为 2 秒
pattern 使用当前区域设置解释 datetime 属性时要使用的与 SimpleDateFormat 兼容的模式。自 Ant 1.6.2 起
checkdirs 指示是否检查目录的日期。 否;默认为 false

以下是如何使用日期选择器的示例

<fileset dir="${jar.path}" includes="**/*.jar">
    <date datetime="01/01/2001 12:00 AM" when="before"/>
</fileset>

选择所有在 2001 年 1 月 1 日午夜之前最后修改的 JAR 文件。

依赖选择器

<depend> 标签选择最后修改日期比另一个位置的另一个等效文件更晚的文件。

<depend> 标签支持使用包含的 <mapper> 元素来定义要比较的文件的位置。如果没有指定 <mapper> 元素,则使用 identity 类型映射器。

<depend> 选择器区分大小写。

属性 描述 必需
targetdir 查找要比较的文件的基目录。确切位置取决于此属性和 <mapper> 元素(如果有)的组合。
granularity 在决定文件已过期之前要给予的毫秒数宽限值。这是必需的,因为并非所有文件系统都支持将最后修改时间跟踪到毫秒级别。 否;默认值为 0 毫秒,或在 DOS 系统上为 2 秒

以下是如何使用依赖选择器的示例

<fileset dir="${ant.1.5}/src/main" includes="**/*.java">
    <depend targetdir="${ant.1.4.1}/src/main"/>
</fileset>

选择在 1.5 版本中修改的所有 Java 源文件。

深度选择器

<depth> 标签根据文件相对于 fileset 的基目录的目录级别深度来选择文件。

属性 描述 必需
min 文件必须位于基目录下方的最小目录级别数,才能被选中。 两者中至少有一个;默认值为无限制
max 文件可以位于基目录下方的最大目录级别数,才能被选中。

以下是如何使用深度选择器的示例

<fileset dir="${doc.path}" includes="**/*">
    <depth max="1"/>
</fileset>

选择基目录和基目录下方的所有文件。

不同选择器

如果 <different> 选择器认为文件与另一个位置的等效文件“不同”,则会选择该文件。确定两个文件之间差异的规则如下

  1. 如果文件仅存在于您应用选择器的资源集合中,而不在 targetdir 中(或在应用映射器之后),则会选择该文件。
  2. 如果文件仅存在于 targetdir 中(或在应用映射器之后),则会忽略该文件。
  3. 长度不同的文件是不同的。
  4. 如果 ignoreFileTimes 被设置为 off,则不同的文件时间戳会导致文件被视为不同。
  5. 除非 ignoreContents 设置为 true,否则会对两个文件进行逐字节检查。

对于无法正确处理依赖项检查的程序和任务,这是一个有用的选择器;即使前置任务始终创建其输出文件,后续任务也可以从使用不同选择器制作的副本中驱动,因此它们的依赖项取决于文件的绝对状态,而不仅仅是时间戳。例如:从网站获取的任何内容,或某些程序的输出。为了减少检查量,在 <copy> 任务中使用此任务时,将 preservelastmodified 设置为 true 以将时间戳从源文件传播到目标文件。

<different> 选择器支持使用包含的 <mapper> 元素来定义要比较的文件的位置。如果没有指定 <mapper> 元素,则使用 identity 类型映射器。

属性 描述 必需
targetdir 查找要比较的文件的基目录。确切位置取决于此属性和 <mapper> 元素(如果有)的组合。
ignoreFileTimes 是否在比较中使用文件时间。 否;默认值为 true(忽略时间差异)
ignoreContents 是否执行逐字节比较。自 Ant 1.6.3 起 否;默认值为 false(比较内容)
granularity 在决定文件已过期之前要给予的毫秒数宽限值。这是必需的,因为并非所有文件系统都支持将最后修改时间跟踪到毫秒级别。 否;默认值为 0 毫秒,或在 DOS 系统上为 2 秒

以下是如何使用不同选择器的示例

<fileset dir="${ant.1.5}/src/main" includes="**/*.java">
    <different targetdir="${ant.1.4.1}/src/main"
        ignoreFileTimes="true"/>
</fileset>

比较 1.4.1 和 1.5 版本之间的所有 Java 源文件,并选择那些不同的文件,忽略文件时间。

文件名选择器

<filename> 标签的作用类似于 fileset 中的 <include><exclude> 标签。但是,通过使用选择器,可以将其与所有其他选择器结合使用,使用任何所需的选择器容器。

<filename> 选择器区分大小写。

属性 描述 必需
name 要选择的文件的名称。name 参数可以包含标准的 Ant 通配符。 两者中只有一个
regex 匹配要选择的文件的正则表达式。
casesensitive 在查看文件名时是否区分大小写。 否;默认值为 true
negate 是否反转此文件名选择的效用,因此模拟 exclude 而不是 include 标签。 否;默认值为 false

以下是如何使用文件名选择器的示例

<fileset dir="${doc.path}" includes="**/*">
    <filename name="**/*.css"/>
</fileset>

选择所有层叠样式表文件。

存在选择器

<present> 标签选择在另一个目录树中具有等效文件的那些文件。

<present> 标签支持使用包含的 <mapper> 元素来定义要测试的文件的位置。如果没有指定 <mapper> 元素,则使用 identity 类型映射器。

<present> 选择器区分大小写。

属性 描述 必需
targetdir 查找要比较的文件的基目录。确切位置取决于此属性和 <mapper> 元素(如果有)的组合。
present 无论我们要求文件仅存在于源目录树中,还是同时存在于源目录树和目标目录树中。有效值为
  • srconly—仅当文件存在于源目录树中,但不存在于目标目录树中时才选择文件
  • both—仅当文件同时存在于源目录树和目标目录树中时才选择文件
将此属性设置为 srconly 等效于将选择器包装在 <not> 选择器容器中。
否;默认值为 both

以下是如何使用 Present 选择器的示例

<fileset dir="${ant.1.5}/src/main" includes="**/*.java">
    <present present="srconly" targetdir="${ant.1.4.1}/src/main"/>
</fileset>

选择 1.5 版本中新增的所有 Java 源文件。

正则表达式选择器

FileSet 中的 <containsregexp> 标签将该 fileset 定义的文件限制为仅那些内容包含与 expression 属性指定的正则表达式匹配的文件。

<containsregexp> 选择器可用作 ResourceSelector(参见 <restrict> ResourceCollection)。

属性 描述 必需
expression 指定每个文件中必须匹配为真的正则表达式
casesensitive 执行区分大小写的匹配。自 Ant 1.8.2 起 否;默认值为 true
multiline 执行多行匹配。自 Ant 1.8.2 起 否;默认值为 false
singleline 这允许 . 匹配新行。SingleLine 不要与 multiline 混淆,SingleLine 是 perl 正则表达式术语,它对应于 Java 正则表达式中的 dotall。自 Ant 1.8.2 起 否;默认值为 false

以下是如何使用正则表达式选择器的示例

<fileset dir="${doc.path}" includes="*.txt">
    <containsregexp expression="[4-6]\.[0-9]"/>
</fileset>

选择所有与正则表达式匹配的文本文件(有 4、5 或 6 后面跟着一个点和一个 0 到 9 之间的数字)。

大小选择器

FileSet 中的 <size> 标签将对 include 标签指定的文件进行限制,以便不满足选择器指定的大小限制的标签最终不会被选中。

属性 描述 必需
value 要测试的文件的大小。
units value 属性以其表示的单位。使用标准单字母 SI 指定(如 kMG)时,使用 1000 的倍数。如果要使用 2 的幂单位,请使用 IEC 标准:Ki 代表 1024,Mi 代表 1048576,等等。默认情况下没有单位,这意味着 value 属性表示确切的字节数。
when 指示如何解释大小,即要选择的文件应该大于、小于还是等于该值。此属性的有效值为
  • less—选择小于指定大小的文件
  • more—选择大于指定大小的文件
  • equal—选择与该大小完全相同的文件
否;默认值为 equal

以下是如何使用大小选择器的示例

<fileset dir="${jar.path}">
  <patternset>
    <include name="**/*.jar"/>
  </patternset>
  <size value="4" units="Ki" when="more"/>
</fileset>

选择所有大于 4096 字节的 JAR 文件。

类型选择器

<type> 标签选择特定类型的文件:目录或常规文件。

属性 描述 必需
type 要测试的文件类型。有效值为
  • file—常规文件
  • dir—目录

以下是如何使用类型选择器仅选择 ${src} 中的目录的示例

<fileset dir="${src}">
  <type type="dir"/>
</fileset>

类型选择器通常与其他选择器结合使用。例如,要选择也存在于 template 目录中的文件,但避免选择空目录,请使用

<fileset dir="${src}">
    <and>
        <present targetdir="template"/>
        <type type="file"/>
    </and>
</fileset>

修改选择器

<modified> 选择器计算文件的值,将其与存储在缓存中的值进行比较,如果这两个值不同,则选择该文件。

由于此选择器高度可配置,因此选择执行的顺序为

  1. 获取文件的绝对路径
  2. 从配置的缓存中获取缓存的值(绝对路径作为键)
  3. 从配置的算法中获取新值
  4. 使用配置的比较器比较这两个值
  5. 根据需要和请求更新缓存
  6. 根据比较结果进行选择

比较、哈希值的计算和存储由特殊接口的实现完成。因此,它们可能提供其他参数。

<modified> 选择器可用作 ResourceSelector(参见 <restrict> ResourceCollection)。在这种情况下,它将简单文件资源映射到文件并执行其工作。如果资源来自其他类型,<modified> 选择器会尝试(注意!)将内容复制到本地文件以计算哈希值。

如果源资源不是文件系统资源,则修改选择器会将其下载到 临时目录

属性 描述 必需
algorithm 应使用的算法类型。有效值为(更多信息请参见后面)
  • hashvalue—HashvalueAlgorithm
  • digest—DigestAlgorithm
  • checksum—ChecksumAlgorithm
  • lastmodified—LastModifiedAlgorithm
否;默认为 digest
cache 应使用的缓存类型。有效值为(更多信息请参见后面)
  • propertyfile—PropertyfileCache
否;默认为 propertyfile
comparator 应使用的比较器类型。有效值为
  • equal—EqualComparator
  • rule—java.text.RuleBasedCollator (参见 注释 以了解限制)
否;默认为 equal
algorithmclass 自定义算法实现的类名。优先级低于 algorithm
cacheclass 自定义缓存实现的类名。优先级低于 cache
comparatorclass 自定义比较器实现的类名。优先级低于 comparator
update 如果值不同,是否应更新缓存?(布尔值) 否;默认为 true
seldirs 是否应选择目录?(布尔值) 否;默认为 true
selres 是否应选择没有 InputStream 的资源,因此没有检查?(布尔值) 否;默认为 true。仅在用作 ResourceSelector 时才相关。
delayupdate 如果设置为 true,则缓存的存储将延迟到下一个完成的 BuildEvent;任务完成、目标完成或构建完成,以先发生者为准。这是为了提高性能。如果设置为 false,则缓存的存储将在每次更改时发生。此属性取决于 update 属性。(布尔值) 否;默认为 true
作为嵌套元素指定的参数

<modified> 选择器支持一个嵌套的 <classpath> 元素,它表示用于查找自定义接口实现的 路径状结构

<modified> 选择器的所有属性都可以使用嵌套的 <param/> 标签设置。根据以下规则,可以使用 <param/> 标签设置其他值。

algorithm

algorithm 属性相同,具有以下附加值

Name 描述
hashvalue 将文件的内容读入 java.lang.String 并使用该 hashValue()。不需要其他配置。
digest 使用 java.security.MessageDigest。此算法支持以下属性
  • algorithm.algorithm(可选):摘要算法的名称(例如 MD5SHA);默认为 MD5
  • algorithm.provider(可选):摘要提供程序的名称;默认为 null
checksum 使用 java.util.zip.Checksum。此算法支持以下属性
  • algorithm.algorithm(可选):算法的名称(例如 CRCADLER);默认为 CRC)
lastmodified 使用文件的 lastModified 属性。不需要其他配置。
cache

cache 属性相同,具有以下附加值

Name 描述
propertyfile 使用 java.util.Properties 类及其加载和存储到文件的功能。此缓存实现支持以下属性
  • cache.cachefile(可选):属性文件的名称;默认为 cache.properties
comparator

comparator 属性相同。

algorithmclass

algorithmclass 属性相同。

comparatorclass

comparatorclass 属性相同。

cacheclass

cacheclass 属性相同。

update

update 属性相同。

seldirs

comparatorclass 属性相同。

示例

以下是如何使用修改选择器的一些示例

<copy todir="dest">
    <fileset dir="src">
        <modified/>
    </fileset>
</copy>

这将复制 src 中所有内容已更改的文件到 dest。使用更新的 PropertyfileCache 和 cache.properties 以及 MD5-DigestAlgorithm。

<copy todir="dest">
    <fileset dir="src">
        <modified update="true"
                  seldirs="true"
                  cache="propertyfile"
                  algorithm="digest"
                  comparator="equal">
            <param name="cache.cachefile"     value="cache.properties"/>
            <param name="algorithm.algorithm" value="MD5"/>
        </modified>
    </fileset>
</copy>

这是将同一个示例重写为 CoreSelector,并设置所有值(与默认值相同)。

<copy todir="dest">
    <fileset dir="src">
        <custom class="org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector">
            <param name="update"     value="true"/>
            <param name="seldirs"    value="true"/>
            <param name="cache"      value="propertyfile"/>
            <param name="algorithm"  value="digest"/>
            <param name="comparator" value="equal"/>
            <param name="cache.cachefile"     value="cache.properties"/>
            <param name="algorithm.algorithm" value="MD5"/>
        </custom>
    </fileset>
</copy>

这是将同一个示例重写为 CustomSelector。

<target name="generate-and-upload-site">
    <echo> generate the site using forrest </echo>
    <antcall target="site"/>

    <echo> upload the changed file </echo>
    <ftp server="${ftp.server}" userid="${ftp.user}" password="${ftp.pwd}">
        <fileset dir="htdocs/manual">
            <modified/>
        </fileset>
    </ftp>
</target>

此选择器在构建环境中用于生成主页(例如,使用 Apache Forrest)的实用场景。这里所有已更改的文件都上传到服务器。因此,CacheSelector 节省了大量的上传时间。

<modified cacheclassname="com.mycompany.MyCache">
    <classpath>
        <pathelement location="lib/mycompany-antutil.jar"/>
    </classpath>
</modified>

使用来自 Ant 自身类路径之外的 jar 的 com.mycompany.MyCache 作为缓存实现

关于 RuleBasedCollator 的注释

RuleBasedCollator 需要一种格式来完成其工作,但在实例化时需要它。在这种情况下,初始化算法存在问题。因此,您不应使用它(或告诉我解决方法 :-)。

签名选择器

<signedselector> 标签选择已签名的文件,并可选地选择使用特定名称签名的文件。

自 Apache Ant 1.7 起

属性 描述 必需
name 要检查的签名名称。

可读选择器

<readable> 选择器仅选择可读的文件。Ant 仅调用 java.io.File#canRead,因此如果文件不可读,但 JVM 无法检测到此状态,则此选择器仍将选择该文件。

可写选择器

<writable> 选择器仅选择可写文件。Ant 仅调用 java.io.File#canWrite,因此如果文件不可写,但 JVM 无法检测到此状态,则此选择器仍将选择该文件。

可执行选择器

<executable> 选择器仅选择可执行文件。Ant 仅调用 java.nio.file.Files#isExecutable,因此如果文件不可执行,但 JVM 无法检测到此状态,则此选择器仍将选择该文件。

自 Ant 1.10.0 起

<symlink> 选择器仅选择符号链接。Ant 仅调用 java.nio.file.Files#isSymbolicLink,因此如果文件是符号链接,但 JVM 无法检测到此状态,则此选择器将不会选择该文件。

自 Ant 1.10.0 起

OwnedBy 选择器

<ownedBy> 选择器仅选择由给定用户拥有的文件。Ant 仅调用 java.nio.file.Files#getOwner,因此如果文件系统不支持此操作,则此选择器将不会选择该文件。

自 Ant 1.10.0 起

属性 描述 必需
owner 预期所有者的用户名
followsymlinks 选择器是否必须跟踪符号链接?(另请参见该属性如何与 FileSet 的相应属性交互) 否;默认为 true

PosixGroup 选择器

<posixGroup> 选择器仅选择由给定 POSIX 组拥有的文件。Ant 仅调用 java.nio.file.Files#readAttributes,因此如果文件系统不支持该操作或 POSIX 属性,则此选择器将不会选择该文件。

自 Ant 1.10.4 起

属性 描述 必需
group POSIX 组名称
followsymlinks 选择器是否必须跟踪符号链接?(另请参见该属性如何与 FileSet 的相应属性交互) 否;默认为 true

PosixPermissions 选择器

<posixPermissions> 选择器仅选择具有给定 POSIX 权限的文件。Ant 仅调用 java.nio.file.Files#getPosixFilePermissions,因此如果文件系统不支持该操作,则此选择器将不会选择该文件。

自 Ant 1.10.4 起

属性 描述 必需
permissions POSIX 权限,以字符串 (rwxrwxrwx) 或八进制 (777) 格式表示
followsymlinks 选择器是否必须跟踪符号链接?(另请参见该属性如何与 FileSet 的相应属性交互) 否;默认为 true

脚本选择器

<scriptselector> 元素使您能够以任何 Apache BSFJSR 223 支持的语言编写复杂的选取算法。有关脚本和依赖项的说明,请参阅 脚本 任务。

自 Apache Ant 1.7 起

属性 描述 必需
language 脚本的语言。
manager 要使用的脚本引擎管理器。有关使用此属性的信息,请参阅 script 任务。 否;默认值为 auto
src 脚本的文件名
encoding 脚本作为文件的编码。自 Ant 1.10.2 起 否;默认为默认 JVM 字符编码
setbeans 是否将所有属性、引用和目标作为全局变量包含在脚本中。 否;默认值为 true
classpath 要传递到脚本的类路径。
classpathref 要使用的类路径,作为对在其他位置定义的路径的 引用 给出。

此选择器可以接受嵌套的 <classpath> 元素。有关如何使用此元素的信息,请参阅 script 任务。

如果没有提供 src 属性,则脚本必须嵌套在选择器声明中。

嵌入式脚本将针对每次测试调用,其中 bean self 绑定到选择器。它有一个属性 selected,可以使用 setSelected(boolean) 设置它以选择文件。

除了经典的项目、属性和目标集之外,还为每个脚本配置了以下 bean。

Bean 描述 类型
self 选择器实例 org.apache.tools.ant.types.optional
filename 选择的名称 String
file 选择的的文件 java.io.File
basedir Fileset 基目录 java.io.File

self bean 映射到选择器,它具有以下属性。只有 selected 标志是可写的,其余的通过其 getter 方法只读。

属性 描述 类型
selected 用于选择此文件的可写标志 boolean
filename 选择的名称 String
file 选择的的文件 java.io.File
basedir Fileset 基目录 java.io.File

示例

<scriptselector language="javascript">
  self.setSelected(true);
</scriptselector>

选择每个文件。

<scriptselector language="javascript">
  self.setSelected((filename.length%2)==0);
</scriptselector>

选择文件名长度为偶数的文件。

选择器容器

为了创建更复杂的选取,您可以使用各种包含其他选择器的选择器。它们以各种方式组合其子选择器的选取。

选择器容器是

所有选择器容器都可以包含任何其他选择器,包括其他容器,作为元素。使用容器,选择器标签可以任意深度。以下是容器中允许的选择器元素的完整列表

And 选择器

<and> 标签选择被其包含的所有元素选择的那些文件。它会在找到一个没有选择文件的选择器时立即返回,因此它不保证会检查每个选择器。

以下是如何使用 And 选择器的示例

<fileset dir="${dist}" includes="**/*.jar">
    <and>
        <size value="4" units="Ki" when="more"/>
        <date datetime="01/01/2001 12:00 AM" when="before"/>
    </and>
</fileset>

选择所有大于 4096 字节且自上个千年以来未更新的 JAR 文件。

Majority 选择器

<majority> 标签选择文件,前提是包含的元素中大多数也选择它。平局的处理方式由 allowtie 属性指定。

属性 描述 必需
allowtie 如果选择文件的选择器数量与未选择文件的数量相同,是否应选择文件。 否;默认值为 true

以下是如何使用 Majority 选择器的示例

<fileset dir="${docs}" includes="**/*.html">
    <majority>
        <contains text="project" casesensitive="false"/>
        <contains text="taskdef" casesensitive="false"/>
        <contains text="IntrospectionHelper" casesensitive="true"/>
    </majority>
</fileset>

选择所有包含三个短语 projecttaskdefIntrospectionHelper 中至少两个的 HTML 文件(最后一个短语必须完全匹配大小写)。

None 选择器

<none> 标签选择不被其包含的任何元素选择的那些文件。它会在找到一个选择文件的选择器时立即返回,因此它不保证会检查每个选择器。

以下是如何使用 None 选择器的示例

<fileset dir="${src}" includes="**/*.java">
    <none>
        <present targetdir="${dest}"/>
        <present targetdir="${dest}">
            <mapper type="glob" from="*.java" to="*.class"/>
        </present>
    </none>
</fileset>

仅选择 .java 文件,这些文件在 dest 目录中没有等效的 .java.class 文件。

Not 选择器

<not> 标签反转其包含的单个选择器的含义。

以下是如何使用 Not 选择器的示例

<fileset dir="${src}" includes="**/*.java">
    <not>
        <contains text="test"/>
    </not>
</fileset>

选择 src 目录中所有不包含字符串 test 的文件。

Or 选择器

<or> 标签选择被其包含的任何一个元素选择的那些文件。它会在找到一个选择文件的选择器时立即返回,因此它不保证会检查每个选择器。

以下是如何使用 Or 选择器的示例

<fileset dir="${basedir}">
    <or>
        <depth max="0"/>
        <filename name="*.png"/>
        <filename name="*.gif"/>
        <filename name="*.jpg"/>
    </or>
</fileset>

选择顶层目录中的所有文件以及它下面的所有图像文件。

选择器引用

<selector> 标签用于创建可以通过引用重复使用的选择器。它是唯一可以作为 <project> 标签的元素,在任何目标之外使用的选择器。它只能包含另一个选择器,但当然,该选择器可以是容器。

<selector> 标签还可以用于有条件地选择文件,具体取决于 Ant 属性是否存在。此功能通过 ifunless 属性实现,与它们在目标或 <patternset> 中的 <include><exclude> 标签上的使用方式完全相同。

属性 描述 必需
if 当命名属性已设置时 允许选择文件。
unless 当命名属性设置时 允许选择文件。

以下是如何使用选择器引用的示例

<project default="all" basedir="./ant">

    <selector id="completed">
        <none>
            <depend targetdir="build/classes">
                <mapper type="glob" from="*.java" to="*.class"/>
            </depend>
            <depend targetdir="docs/manual/api">
                <mapper type="glob" from="*.java" to="*.html"/>
            </depend>
        </none>
    </selector>

    <target>
        <zip>
            <fileset dir="src/main" includes="**/*.java">
                <selector refid="completed"/>
            </fileset>
        </zip>
    </target>

</project>

将所有具有与之关联的最新等效类文件和 javadoc 文件的 java 文件压缩在一起。

以及根据属性是否设置有条件地选择文件的示例

<fileset dir="${working.copy}">
    <or>
        <selector if="include.tests">
            <filename name="**/*Test.class">
        </selector>
        <selector if="include.source">
            <and>
                <filename name="**/*.java">
                <not>
                    <selector unless="include.tests">
                        <filename name="**/*Test.java">
                    </selector>
                </not>
            </and>
        </selector>
    </or>
</fileset>

一个有条件地包含 Java 源文件和测试源文件和类文件的 fileset。

自定义选择器

您可以编写自己的选择器,并在 <custom> 标签中指定它们,从而在选择器容器中使用它们。

首先,您必须用 Java 编写选择器类。为了成为选择器,它必须满足的唯一要求是它实现了 org.apache.tools.ant.types.selectors.FileSelector 接口,该接口包含一个方法。有关更多信息,请参阅 在 Ant 中编程选择器

编写完成后,您可以使用 <custom> 标签将其包含在构建文件中。

属性 描述 必需
classname 实现 org.apache.tools.ant.types.selectors.FileSelector 的类的名称。
classpath 用于加载自定义选择器类的类路径。如果既没有指定 classpath 也没有指定 classpathref,则该类将从 Ant 使用的类路径加载。
classpathref 对先前定义的类路径的引用。如果既没有指定 classpathref 也没有指定 classpath,则该类将从 Ant 使用的类路径加载。

以下是如何使用 <custom> 将您的类用作选择器的示例

<fileset dir="${mydir}" includes="**/*">
    <custom classname="com.mydomain.MySelector">
        <param name="myattribute" value="myvalue"/>
    </custom>
</fileset>

许多核心选择器也可以通过使用 <param> 元素指定其属性来用作自定义选择器。它们是

以下是 Depth 选择器部分中的示例,改写为通过 <custom> 使用选择器。

<fileset dir="${doc.path}" includes="**/*">
    <custom classname="org.apache.tools.ant.types.selectors.DepthSelector">
        <param name="max" value="1"/>
    </custom>
</fileset>

选择基目录和基目录下方的所有文件。

有关编写自己的选择器的更多详细信息,请参阅 在 Ant 中编程选择器