模块  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模块都是从配置创建的。 通过调用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
    • 方法详细信息

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

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

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

        • 模块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方法进行解析。 将模块添加到模块图可能会引入新的服务使用依赖性,因此该过程会反复进行,直到不再添加模块为止。

        由于服务绑定涉及解决方案,因此可能会因FindExceptionResolutionException而失败,原因与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
      • toString

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