选择器是一种机制,它允许根据除文件名之外的其他条件选择构成 <fileset>
的文件,这些条件由 <include>
和 <exclude>
标签提供。
选择器是 FileSet 的一个元素,出现在 FileSet 中。它也可以在任何目标之外定义,方法是使用 <selector>
标签,然后将其用作引用。
不同的选择器具有不同的属性。一些选择器可以包含其他选择器,这些选择器称为 选择器容器
。还有一类选择器允许用户定义扩展,称为 自定义选择器
。内置于 Apache Ant 的选择器称为 核心选择器
。
核心选择器是 Ant 中自带的选择器。它们可以在 fileset 中使用,也可以包含在选择器容器中。
核心选择器是
<contains>
—选择包含特定文本字符串的文件<date>
—选择在特定日期和时间之前或之后修改的文件<depend>
—选择比其他地方的等效文件修改时间更晚的文件<depth>
—选择在目录树中向下出现指定目录级别的文件<different>
—选择与其他地方不同的文件<filename>
—选择其名称与特定模式匹配的文件。相当于 patternset 的 include 和 exclude 元素。<present>
—选择在其他位置存在或不存在的文件<containsregexp>
—选择与正则表达式匹配的文件<size>
—选择大小大于或小于特定字节数的文件。<type>
—选择是普通文件还是目录的文件。<modified>
—如果配置的算法的返回值与存储在缓存中的返回值不同,则选择文件。<signedselector>
—如果文件已签名,并且可选地具有特定名称的签名,则选择文件。<scriptselector>
—使用 BSF 或 JSR 223 脚本语言创建自己的选择器<readable>
—如果文件可读,则选择文件。<writable>
—如果文件可写,则选择文件。<executable>
—如果文件可执行,则选择文件。<symlink>
—如果文件是符号链接,则选择文件。<ownedBy>
—如果文件由给定用户拥有,则选择文件。<posixGroup>
—如果文件具有给定的 POSIX 组,则选择文件。<posixPermissions>
—如果文件具有给定的 POSIX 权限,则选择文件。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 | 指示如何解释日期,是要选择最后修改时间在指定值之前、之后还是等于指定值的那些文件。此属性的有效值为
|
否;默认值为 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>
选择器认为文件与另一个位置的等效文件“不同”,则会选择该文件。确定两个文件之间差异的规则如下
off,则不同的文件时间戳会导致文件被视为不同。
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等效于将选择器包装在 <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 指定(如 k、 M或 G)时,使用 1000 的倍数。如果要使用 2 的幂单位,请使用 IEC 标准: Ki代表 1024, Mi代表 1048576,等等。默认情况下没有单位,这意味着 value 属性表示确切的字节数。 |
否 |
when | 指示如何解释大小,即要选择的文件应该大于、小于还是等于该值。此属性的有效值为
|
否;默认值为 equal |
以下是如何使用大小选择器的示例
<fileset dir="${jar.path}"> <patternset> <include name="**/*.jar"/> </patternset> <size value="4" units="Ki" when="more"/> </fileset>
选择所有大于 4096 字节的 JAR 文件。
<type>
标签选择特定类型的文件:目录或常规文件。
属性 | 描述 | 必需 |
---|---|---|
type | 要测试的文件类型。有效值为
|
是 |
以下是如何使用类型选择器仅选择 ${src}
中的目录的示例
<fileset dir="${src}"> <type type="dir"/> </fileset>
类型选择器通常与其他选择器结合使用。例如,要选择也存在于 template 目录中的文件,但避免选择空目录,请使用
<fileset dir="${src}"> <and> <present targetdir="template"/> <type type="file"/> </and> </fileset>
<modified>
选择器计算文件的值,将其与存储在缓存中的值进行比较,如果这两个值不同,则选择该文件。
由于此选择器高度可配置,因此选择执行的顺序为
比较、哈希值的计算和存储由特殊接口的实现完成。因此,它们可能提供其他参数。
<modified>
选择器可用作 ResourceSelector(参见 <restrict> ResourceCollection)。在这种情况下,它将简单文件资源映射到文件并执行其工作。如果资源来自其他类型,<modified>
选择器会尝试(注意!)将内容复制到本地文件以计算哈希值。
如果源资源不是文件系统资源,则修改选择器会将其下载到 临时目录。
属性 | 描述 | 必需 |
---|---|---|
algorithm | 应使用的算法类型。有效值为(更多信息请参见后面)
|
否;默认为 digest |
cache | 应使用的缓存类型。有效值为(更多信息请参见后面)
|
否;默认为 propertyfile |
comparator | 应使用的比较器类型。有效值为
|
否;默认为 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 属性相同,具有以下附加值
Name | 描述 |
---|---|
hashvalue | 将文件的内容读入 java.lang.String 并使用该 hashValue() 。不需要其他配置。 |
digest | 使用 java.security.MessageDigest 。此算法支持以下属性
|
checksum | 使用 java.util.zip.Checksum 。此算法支持以下属性
|
lastmodified | 使用文件的 lastModified 属性。不需要其他配置。 |
与 cache 属性相同,具有以下附加值
Name | 描述 |
---|---|
propertyfile | 使用 java.util.Properties 类及其加载和存储到文件的功能。此缓存实现支持以下属性
|
与 comparator 属性相同。
与 algorithmclass 属性相同。
与 comparatorclass 属性相同。
与 cacheclass 属性相同。
与 update 属性相同。
与 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 需要一种格式来完成其工作,但在实例化时需要它。在这种情况下,初始化算法存在问题。因此,您不应使用它(或告诉我解决方法 :-)。
<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>
选择器仅选择由给定用户拥有的文件。Ant 仅调用 java.nio.file.Files#getOwner
,因此如果文件系统不支持此操作,则此选择器将不会选择该文件。
自 Ant 1.10.0 起
属性 | 描述 | 必需 |
---|---|---|
owner | 预期所有者的用户名 | 是 |
followsymlinks | 选择器是否必须跟踪符号链接?(另请参见该属性如何与 FileSet 的相应属性交互) | 否;默认为 true |
<posixGroup>
选择器仅选择由给定 POSIX 组拥有的文件。Ant 仅调用 java.nio.file.Files#readAttributes
,因此如果文件系统不支持该操作或 POSIX 属性,则此选择器将不会选择该文件。
自 Ant 1.10.4 起
属性 | 描述 | 必需 |
---|---|---|
group | POSIX 组名称 | 是 |
followsymlinks | 选择器是否必须跟踪符号链接?(另请参见该属性如何与 FileSet 的相应属性交互) | 否;默认为 true |
<posixPermissions>
选择器仅选择具有给定 POSIX 权限的文件。Ant 仅调用 java.nio.file.Files#getPosixFilePermissions
,因此如果文件系统不支持该操作,则此选择器将不会选择该文件。
自 Ant 1.10.4 起
属性 | 描述 | 必需 |
---|---|---|
permissions | POSIX 权限,以字符串 (rwxrwxrwx) 或八进制 ( 777) 格式表示 |
是 |
followsymlinks | 选择器是否必须跟踪符号链接?(另请参见该属性如何与 FileSet 的相应属性交互) | 否;默认为 true |
<scriptselector>
元素使您能够以任何 Apache BSF 或 JSR 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>
—仅当包含的所有选择器都选择文件时才选择文件。<majority>
—如果大多数选择器选择文件,则选择文件。<none>
—仅当包含的任何选择器都没有选择文件时才选择文件。<not>
—只能包含一个选择器,并反转其选择和未选择的内容。<or>
—如果包含的任何一个选择器选择文件,则选择文件。<selector>
—仅包含一个选择器,并在满足任何 "if"
或 "unless"
条件的情况下,将所有请求转发给它,而不进行任何更改。如果您想定义引用,则应使用此选择器。它可以用作 <project>
的元素。如果您希望文件的选择依赖于 Ant 属性设置,则也应使用它。所有选择器容器都可以包含任何其他选择器,包括其他容器,作为元素。使用容器,选择器标签可以任意深度。以下是容器中允许的选择器元素的完整列表
<and>
<contains>
<custom>
<date>
<depend>
<depth>
<filename>
<majority>
<none>
<not>
<or>
<present>
<selector>
<size>
<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>
标签选择文件,前提是包含的元素中大多数也选择它。平局的处理方式由 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>
选择所有包含三个短语 project
、taskdef
和 IntrospectionHelper
中至少两个的 HTML 文件(最后一个短语必须完全匹配大小写)。
<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 选择器的示例
<fileset dir="${src}" includes="**/*.java"> <not> <contains text="test"/> </not> </fileset>
选择 src 目录中所有不包含字符串 test
的文件。
<or>
标签选择被其包含的任何一个元素选择的那些文件。它会在找到一个选择文件的选择器时立即返回,因此它不保证会检查每个选择器。
以下是如何使用 Or 选择器的示例
<fileset dir="${basedir}"> <or> <depth max="0"/> <filename name="*.png"/> <filename name="*.gif"/> <filename name="*.jpg"/> </or> </fileset>
选择顶层目录中的所有文件以及它下面的所有图像文件。
<selector>
标签用于创建可以通过引用重复使用的选择器。它是唯一可以作为 <project>
标签的元素,在任何目标之外使用的选择器。它只能包含另一个选择器,但当然,该选择器可以是容器。
<selector>
标签还可以用于有条件地选择文件,具体取决于 Ant 属性是否存在。此功能通过 if 和 unless 属性实现,与它们在目标或 <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>
元素指定其属性来用作自定义选择器。它们是
org.apache.tools.ant.types.selectors.ContainsSelector
org.apache.tools.ant.types.selectors.DateSelector
org.apache.tools.ant.types.selectors.DepthSelector
org.apache.tools.ant.types.selectors.FilenameSelector
org.apache.tools.ant.types.selectors.SizeSelector
以下是 Depth 选择器部分中的示例,改写为通过 <custom>
使用选择器。
<fileset dir="${doc.path}" includes="**/*"> <custom classname="org.apache.tools.ant.types.selectors.DepthSelector"> <param name="max" value="1"/> </custom> </fileset>
选择基目录和基目录下方的所有文件。
有关编写自己的选择器的更多详细信息,请参阅 在 Ant 中编程选择器。