本质上,一个module就是本地和输入资源的聚合。本地资源构成模块本身;一般来源于JAR文件或者本地文件系统上的目录。可输入的资源包括任何模块外部的模块 class loader可见的东西,根据对其它模块的依赖来确定。我们使用 imports(输入) 来表示这个聚合。
除了 imports 概念外,一个 module可要定义它自身被别的module依赖时,哪些是可见的。这个集合总是模块可输入资源集合的子集,被称作模块的 exports(输出)。当一个 module 和别的 module 建立起依赖关系时,输入的资源仅由依赖 module 的输出资源构成。
当一个模块从一个依赖的模块中输入了资源,然后输入同样的资源(或者其子集)给依赖它的module,这称为将依赖 re-export(再次输出)。
为了限制从一个依赖 module中可以输入什么资源,或者限制什么资源被输出或者再次输出给依赖其的 module,就需要采用 filter(过滤器),这是下面的子章节要关注的焦点。
大部分模块依赖的资源可以没有任何限制的输入,除了一个例外:META-INF 目录以及其下所有的子目录被排除在 import 之外。也就是说,当一个被依赖的模块没有定义任何 filters 或者其他的属性,就像下面的代码片段:
<
module
name
=
"org.jboss.logging"
/>
|
那么,依赖于该模块的 imports 被配置成像下面的规则:
需要import META-INFO/services这个目录是非常普遍的,这可以通过很多现有APIs和使用JDK java.util.ServiceLoader API的框架来发现服务。因为这个原因,可以通过指定默认的filter在排除 META-INF子目录之前,应该包含 META-INF/services。
Filter元素对path set还有更进一步的限制。当过滤输入时,不仅影响哪些 classes 和 resources 可以被输入,而且也影响那些输入的资源的再次输出(re-export)。
关于如何在 module.xml 中配置 import filters ,可以参考 Moudle descriptors 一章。如何在 MANIFEST.MF 中配置 service imports,参考 Manifest module information 一章。
默认情况下,一个 module 仅能输出它本地定义的资源。特别是,module输入的资源一般不被再次输出。然而,可以通过为依赖指定一个不同的 export filter来改变这个策略。
在 module.xml描述文件或者 MANIFEST.MF JAR依赖 manifest属性文件中,有一个简单的 "export" 标记,可以为依赖来指定不同的策略,改变为再次输出(re-exports)大多数该依赖的资源(并不是所有), 而不是默认的 "reject-all" filter 策略。这个 filter 将包括除了 META-INF目录以及其子目录下的资源之外的任何东西。
在特定情况下,为了能够在特殊的 module configuration 中使用 java.util.ServiceLoader, 一个依赖要和 META-INF/services一起被再次输出。在module.xml 中有一个快捷的标记来做这个事情,而不用需要改动 filter。 关于这个属性更多的信息,可以参考模块描述一章中的 services attribute section 章节。
其它关于 re-export 的配置信息,需要完整过滤器规范。关于如果用 xml 配置 filter,请参考 Module Descriptor 的 filters section 章节。