Module  java.base
软件包  java.lang.module

Class 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
    • 方法详细信息

      • 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要求模块m2m2需要m1

        • 模块读取两个或多个具有相同名称的模块。 这包括一个模块读取另一个与其自身相同名称的情况。

        • 配置中的两个或多个模块将同一个包导出到读取两者的模块。 这包括其中一个模块的情况下M含有包p读取出口另一个模块pM

        • 模块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如果在此配置中没有此名称的模块或任何父配置
      • toString

        public String toString​()
        返回描述此配置的字符串。
        重写:
        toString在类 Object
        结果
        A possibly empty string describing this configuration