- java.lang.Object
-
- java.lang.module.Configuration
-
public final class Configuration extends Object
的构造的结果是resolution或分辨率service binding 。一个配置封装了作为分辨率输出的可读性图 。 可读性图是一个有向图,其顶点是类型为
ResolvedModule
,边缘表示模块之间的可读性。Configuration
定义了modules()
方法来获取图中解析的模块集。ResolvedModule
定义了reads()
方法来获取已解析模块读取的一组模块。 读取的模块可能处于相同的配置中,也可能在parent
配置中。配置定义
resolve
方法来解析根模块的集合,而resolveAndBind
方法可以使用服务绑定进行解析。 这两种方法都有实例和静态变体。 实例方法创建配置,接收方作为父配置。 静态方法适用于可以有多个父配置的更高级的情况。Java虚拟机中的每个
layer
模块都是从配置创建的。boot
层的配置通过调用ModuleLayer.boot().configuration()
获得。 在创建新配置时,引导层的配置通常是父级。例
以下示例使用
resolve
方法将引导层配置作为父配置来解析名为myapp的模块。 它打印每个解析模块的名称和每个模块读取的模块的名称。ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3); Configuration parent = ModuleLayer.boot().configuration(); Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("myapp")); cf.modules().forEach(m -> { System.out.format("%s -> %s%n", m.name(), m.reads().stream() .map(ResolvedModule::name) .collect(Collectors.joining(", "))); });
- 从以下版本开始:
- 9
- 另请参见:
-
ModuleLayer
-
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 Modifier and Type 方法 描述 static Configuration
empty()
返回 空配置。Optional<ResolvedModule>
findModule(String name)
在此配置中查找已解决的模块,或者如果不在此配置中,则配置 parent 。Set<ResolvedModule>
modules()
在此配置中返回一组不可变的已解析模块。List<Configuration>
parents()
按照搜索顺序返回此配置的父母的不可修改列表。Configuration
resolve(ModuleFinder before, ModuleFinder after, Collection<String> roots)
解决一个根模块的集合,以此配置为其父级,以创建新的配置。static Configuration
resolve(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots)
解析根模块的集合以创建配置。Configuration
resolveAndBind(ModuleFinder before, ModuleFinder after, Collection<String> roots)
解决一系列根模块,具有服务绑定,并将此配置作为其父配置来创建新配置。static Configuration
resolveAndBind(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots)
解决一系列根模块,具有服务绑定功能,以创建配置。String
toString()
返回描述此配置的字符串。
-
-
-
方法详细信息
-
resolve
public Configuration resolve(ModuleFinder before, ModuleFinder after, Collection<String> roots)
解决一个根模块的集合,以此配置为其父级,以创建新的配置。 当使用此配置作为父配置调用时,此方法的工作原理与静态的resolve
方法一样。 换句话说,如果这个配置是cf
那么这个方法相当于调用:Configuration.resolve(before, List.of(cf), after, roots);
- 参数
-
before
- 以前的模块查找器找到模块 -
after
-模块取景 后定位模块时不位于由before
模块取景器或在父配置 -
roots
- 要解析的模块的模块名称可能为空的集合 - 结果
- 解决给定根模块的结果的配置
- 异常
-
FindException
- 如果静态resolve
方法指定的任何可观察性相关原因的解决方案失败 -
ResolutionException
- 如果解决方案无法通过静态resolve
方法指定的任何一致性检查 -
SecurityException
- 如果定位模块被安全管理器拒绝
-
resolveAndBind
public Configuration resolveAndBind(ModuleFinder before, ModuleFinder after, Collection<String> roots)
解决一系列根模块,具有服务绑定,并将此配置作为其父配置来创建新配置。 当使用此配置作为父级调用时,此方法的工作原理与静态resolveAndBind
方法所指定。 换句话说,如果这个配置是cf
那么这个方法相当于调用:Configuration.resolveAndBind(before, List.of(cf), after, roots);
- 参数
-
before
- 之前的模块查找器找到模块 -
after
-模块取景 后定位模块时不位于由before
模块取景器或在父配置 -
roots
- 要解决的模块的模块名称可能为空的集合 - 结果
- 解决结果的配置,与服务绑定,给定的根模块
- 异常
-
FindException
- 如果由静态resolve
方法指定的任何可观察性相关原因解析失败 -
ResolutionException
- 如果解决方案无法通过静态resolve
方法指定的任何一致性检查 -
SecurityException
- 如果定位模块被安全管理器拒绝
-
resolve
public static Configuration resolve(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots)
解析根模块的集合以创建配置。每个根模块都使用给定的
before
模块查找器。 如果未找到模块,那么它位于父配置中,就好像通过以迭代顺序调用每个父项的findModule
方法。 如果没有找到,则使用给定的after
模块查找器after
模块。 相同的搜索顺序用于定位传递依赖关系。 位于父配置中的根模块或依赖关系不再被解析,并且不包括在生成的配置中。当所有模块都被枚举,然后计算可读性图表,并结合模块导出和服务使用,检查一致性。
由于以下可观察性原因,解决方案可能会因为
FindException
而失败:找不到根模块或直接或传递依赖关系。
尝试查找模块时发生错误。 可能的错误包括I / O错误,检测到解析模块描述符(
module-info.class
)的错误或同一模块的两个版本在同一目录中。
如果下列任何一致性检查失败,则分辨率可能会与
ResolutionException
失败:检测到一个周期,例如模块
m1
要求模块m2
和m2
需要m1
。模块读取两个或多个具有相同名称的模块。 这包括一个模块读取另一个与其自身相同名称的情况。
配置中的两个或多个模块将同一个包导出到读取两者的模块。 这包括其中一个模块的情况下
M
含有包p
读取出口另一个模块p
到M
。模块
M
声明其“uses p.S
”或“provides p.S with ...
”,但是包p
既不在模块M
也不能由M
读取的任何模块导出到M
。
- Implementation Note:
- 在实现中,模块的可观察性可能取决于引用完整性或其他检查,以确保特定操作系统或架构的紧密耦合模块或模块的不同构建不被组合在同一配置中。
- 参数
-
before
- 之前的模块查找器找到模块 -
parents
- 搜索顺序列表父配置 -
after
-模块取景 后定位模块时不位于由before
模块取景器或在父配置 -
roots
- 要解析的模块的模块名称可能为空的集合 - 结果
- 解决给定根模块的结果的配置
- 异常
-
FindException
- 如果上述任何可观测性相关原因的解决方案失败 -
ResolutionException
- 如果上述任何一致性检查的解析失败 -
IllegalArgumentException
- 如果父母列表为空,或列表中有两个或多个父母,其中包含用于不同目标操作系统,体系结构或版本的模块 -
SecurityException
- 如果定位模块被安全管理器拒绝
-
resolveAndBind
public static Configuration resolveAndBind(ModuleFinder before, List<Configuration> parents, ModuleFinder after, Collection<String> roots)
解决一系列根模块,具有服务绑定功能,以创建配置。该方法的工作原理与
resolve
完全相同,只是解析模块的图形被增加了由服务使用依赖关系引起的模块。更具体地说,根模块被解析成通过调用
resolve
。 然后检查已解析的模块以及父配置中的所有模块,以及service dependences
。 给定模块找到的所有模块找到provide
一个或多个服务类型的实现被添加到模块图中,然后通过调用resolve
方法来解析。 将模块添加到模块图可能会引入新的服务使用依赖关系,因此该过程将反复运行,直到不再添加模块。作为服务绑定涉及的分辨率,然后它可能会失败,
FindException
或者ResolutionException
整整规定的同样的理由resolve
。- 参数
-
before
- 以前的模块查找器找到模块 -
parents
- 搜索顺序列表父配置 -
after
-模块取景 后定位模块时不位于由before
模块取景器或在父配置 -
roots
- 要解析的模块的模块名称可能为空的集合 - 结果
- 解决结果的配置,与服务绑定,给定的根模块
- 异常
-
FindException
- 如果静态resolve
方法指定的任何可观察性相关原因的解决方案失败 -
ResolutionException
- 如果解决方案无法通过静态resolve
方法指定的任何一致性检查 -
IllegalArgumentException
- 如果父母列表为空,或列表中有两个或更多父母,其中包含用于不同目标操作系统,体系结构或版本的模块 -
SecurityException
- 如果定位模块被安全管理器拒绝
-
empty
public static Configuration empty()
返回空配置。 空配置中没有模块。 没有父母- 结果
- 空配置
-
parents
public List<Configuration> parents()
按照搜索顺序返回此配置的父母的不可修改列表。 如果这是empty configuration,那么返回一个空列表。- 结果
- 这个父配置可能是空的不可修改的列表
-
modules
public Set<ResolvedModule> modules()
在此配置中返回一组不可变的已解析模块。- 结果
- 在此配置中可能为空的不可修改的已解析模块集
-
findModule
public Optional<ResolvedModule> findModule(String name)
在此配置中找到一个已解决的模块,或者在此配置中找不到parent配置。 在父配置中查找模块等同于按照搜索顺序调用每个父findModule
上的findModule
,直到找到该模块或已搜索所有父项。 在配置树中,这相当于深度优先搜索。- 参数
-
name
- 要查找的解析模块的模块名称 - 结果
-
具有给定名称的解析模块或空
Optional
如果在此配置中没有此名称的模块或任何父配置
-
-