- 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
模块都是从配置创建的。 通过调用ModuleLayer.boot().configuration()
获取boot
层的配置。 创建新配置时,引导层的配置通常是父配置。例
以下示例使用
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
-
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 变量和类型 方法 描述 static Configuration
empty()
返回 空配置。Optional<ResolvedModule>
findModule(String name)
在此配置中查找已解析的模块,如果不在此配置中,则 查找parent配置。Set<ResolvedModule>
模块()
返回此配置中已解析模块的不可变集合。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
- 用于查找模块的 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
- 用于查找模块的 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
- 用于查找模块的 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
而失败,原因与FindException
指定的原因resolve
。- 参数
-
before
- 用于查找模块的 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
-
-