一些任务利用目录树来执行一些动作。例如,javac这个任务就是一个基于目录的任务,它将一个目录中的.java文件编译为.class文件。因为一些这样的任务在目录树上做很多的工作,所以这些任务本身充当了隐含的文件集(FileSet)。下面这些标准的ant任务充当了隐含的文件集:
(列表来自 ant官网手册:https://ant.apache.org/manual/index.html)
基于目录的任务可以在目录树的子集上操作。
ant提供了两种方式在一个FileSet上创建文件的一个子集:
1)基于模式集来选择:只包含匹配include模式、但不匹配exclude模式的文件和目录。
2)基于选择器来选择:基于内嵌的选择器的规则来选择文件。下面是核心选择器:
列表来自ant官网手册:https://ant.apache.org/manual/index.html
1)用includes 和 excludes属性
2)内嵌
元素
3)用includesfile 和 excludesfile属性指明引用的外部文件
4)用
内嵌元素指明引用的外部文件
如果引用了外部文件,外部文件的每一行作为一个模式,被添加到包含、不包含模式的列表中。
几个例子:
“*”和“?”
“*”
匹配0个或者多个字符,“?”
匹配1个字符。
中使用,那么是相对于dir属性指定的目录。只有在基目录下发现的文件才会被考虑。“*”
和“?”
可以结合使用。例如, …/Demo.java不会匹配任何文件,因为“..”
表示上层目录,而基目录的上层目录不会被扫描。
例如*.java 可以匹配 .java, A.java 和Demo.java,但不会匹配Demo.class。
?.java可以匹配A.java,B.java,但不会匹配Demo.java。
例如模式/?abc/*/*.java
,路径/xabc/foobar/Test.java
,首先,?abc
和xabc
是匹配的,然后*
和foobar
是匹配的,最后*.java
和Test.java
是匹配的。因为所有都匹配上了,就说这个模式和路径是匹配的。
"**"
匹配多个目录层级"**"
能够匹配多个目录层级。这个可以用来匹配一个完整的目录树,或者目录树上任何地方的一个文件。为了实现这个功能,"**"
必须作为一个目录的名字使用。当"**"
在模式中作为一个目录的名字来使用的时候,它匹配0个或者多个目录。举例:
/test/**
匹配/test/
目录下的任何目录和文件,例如 /test/A.java
, 或者 /test/foo/bar/abc.html
,但不匹配 /xyz.xml
"/"
或者"\"
结尾,那么"**"
被会附加上去。例如test/
被解释为test/**
列表来自ant的手册:https://ant.apache.org/manual/index.html
从Ant 1.8.1 版本以来,下面的定义被基于目录的任务默认排除:
**/*~
**/#*#
**/.#*
**/%*%
**/._*
**/CVS
**/CVS/**
**/.cvsignore
**/SCCS
**/SCCS/**
**/vssver.scc
**/.svn
**/.svn/**
**/.DS_Store
从Ant 1.8.2版本以来,又增加了如下的默认排除:
**/.git
**/.git/**
**/.gitattributes
**/.gitignore
**/.gitmodules
**/.hg
**/.hg/**
**/.hgignore
**/.hgsub
**/.hgsubstate
**/.hgtags
**/.bzr
**/.bzr/**
**/.bzrignore