与files元素类似,fileSets应用于那些相对于你的项目结构有一个明确位置的文件。然而,和files元素不同的是,fileSets描述一组文件,这组文件由文件模式或者路径模式定义,判断文件在总体目录结构中的位置是否匹配该模式。最简单的fileSet仅仅指定文件所处的位置:
<assembly> ... <fileSets> <fileSet> <directory>src/main/java</directory> </fileSet> </fileSets> ... </assembly>
这个文件集合仅仅包含src/main/java目录下的内容。它利用了很多该元素的默认设置,这里我简要的介绍一下。
首先,你会注意到我们没有指定匹配的文件集合应该位于套件中的什么位置。默认情况,目标输出目录(由outputDirectory指定)和源文件目录(在这里,是src/main/java)是一样的。此外,我们没有指定任何包含和排除模式。当它们为空的时候,fileSet假设会包含整个源文件目录,并伴随着一些重要的例外。这一规则的例外主要是为了排除源码控制元数据文件和目录,这一例外由userDefaultExclludes标记控制,其值默认为true。当userDefaultExcludes被开启的时候,所有如.svn/和CVS/的目录都会被排除在套件归档之外。Section 12.5.3, “fileSets的默认排除模式
”显示了一个详细的默认排除模式的列表。
如果想要更多的对于文件集的控制,我们可以进一步显式的指定。Example 12.7, “Including Files with fileSet
”展示了一个指定所有默认值的fileSet元素。
Example 12.7. Including Files with fileSet
<assembly> ... <fileSets> <fileSet> <directory>src/main/java</directory> <outputDirectory>src/main/java</outputDirectory> <includes> <include>**</include> </include> <useDefaultExcludes>true</useDefaultExcludes> <fileMode>0644</fileMode> <directoryMode>0755</directoryMode> </fileSet> </fileSets> ... </assembly>
includes元素使用了一系列include元素,后者包含了路径模式。这些模式可能包含一些通配符,“**”表示匹配一个或者多个目录,“*”表示匹配文件名的任一部分,“?”表示匹配文件名中的任意单个字符。Example 12.7, “Including Files with fileSet
”使用了一个fileMode元素来指定该文件集对于所有人可读,但是只有文件所有者可写。由于fileSet包含了目录,我们还可以指定directoryMode,它的使用方式和fileMode完全一样。一个目录的执行权限控制用户列出目录内容,我们这里想要确保目录对于所有人是可读且可执行的。和文件一样,只有目录所有者才拥有写的权限。
fileSet元素还提供了一些其它的配置选项。首先,它允许一个excludes子元素,其形式和includes完全一样。这些排除模式能让你从fileSet中排除特定的文件。包含模式优先于排除模式。此外,如果你想要将所包含文件中的表达式替换成属性值,你可以将filtering标记设置成true。表达式可以用${}标记(如org.sonatype.mavenbook)或者@@标记(这是标准的Ant表达式,如@project.groupId)来表示。你可以使用lineEnding元素来调整文件的换行字元;可用lineEnding值有:
- keep
-
保持原始文件的换行字元。(这是默认值。)
- unix
-
Unix风格的字元
- lf
-
仅仅一个换行符
- dos
-
MS-DOS风格的字元
- crlf
-
回车后加一个换行符
最后,如果你想要确保所有文件匹配模式都被使用到,你可以使用userStrictFiltering元素,并将其值指定为true(默认值为false)。有些时候未使用的模式可能预示着某个中间输出目录缺失文件。使用值为true的useStrictFiltering后,当某个包含模式未满足,Assembly插件就会失败。换句话说,如果你使用一个包含模式来包含构建中的某个文件,但是这个文件不存在,将userStrictFiltering设置成true会使得Maven构建失败。