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

Interface ModuleFinder



  • public interface ModuleFinder
    模块的取景器。 A ModuleFinder用于在resolutionservice binding期间查找模块。

    A ModuleFinder只能找到一个具有给定名称的模块。 例如,查找目录序列中的模块的ModuleFinder将定位给定名称的模块的第一次出现,并将忽略该序列中稍后的目录中出现的该名称的其他模块。

    使用示例

       Path dir1, dir2, dir3; ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3); Optional<ModuleReference> omref = finder.find("jdk.foo"); omref.ifPresent(mref -> ... );  

    这里定义的findfindAll方法可能由于几个原因而失败。 这些包括I / O错误,检测到解析模块描述符( module-info.class )的错误,或由ModuleFinder返回的ModuleFinder的情况下,在目录中找到两个或多个具有相同名称的模块。 当检测到错误时,这些方法抛出FindException与适当的cause 抛出ModuleFinder之后的一个FindException的行为是未定义的。 例如,抛出异常后调用find可能会扫描或导致异常的相同模块。 建议在抛出异常之后丢弃模块查找器。

    A ModuleFinder不需要线程安全。

    从以下版本开始:
    9
    • 方法详细信息

      • find

        Optional<ModuleReference> find​(String name)
        查找给定名称的模块的引用。

        A ModuleFinder提供了它所定位的模块的一致视图。 如果find被调用多次以找到相同的模块(按名称),则每次返回相同的结果。 如果一个模块位于,那么它将被保证是由findAll方法返回的一组模块的成员。

        参数
        name - 要查找的模块的名称
        结果
        引用具有给定名称的模块或空的 Optional如果没有找到)
        异常
        FindException - 如果发现错误发现模块
        SecurityException - 如果安全经理否认
      • findAll

        Set<ModuleReference> findAll​()
        返回此查找器可以找到的所有模块引用的集合。

        A ModuleFinder提供了ModuleFinder在模块的一致视图。 如果findAll被调用多次,那么它将每次返回相同的(等于)结果。 对于返回的集合中的每个ModuleReference元素,则保证find将找到ModuleReference如果被调用以找到该模块。

        API Note:
        对于诸如 resolveAndBind之类的方法 来说 ,这对于扫描模块路径来查找提供特定服务的模块非常重要。
        结果
        该查找器定位的所有模块引用的集合
        异常
        FindException - 发现错误发现所有模块
        SecurityException - 如果安全经理否认
      • ofSystem

        static ModuleFinder ofSystem​()
        返回找到系统模块的模块查找器。 系统模块是Java运行时映像中的模块。 模块查找器将始终找到java.base

        如果有一个安全管理器设置,那么它的checkPermission方法被调用来检查主叫方是否被授权RuntimePermission("accessSystemModules")访问系统模块。

        结果
        A ModuleFinder定位系统模块
        异常
        SecurityException - 如果安全经理否认
      • of

        static ModuleFinder of​(Path... entries)
        返回通过搜索一系列目录和/或打包模块来定位文件系统上的模块的模块查找器。 给定数组中的每个元素都是以下之一:
        1. 到模块目录的路径。

        2. 分解模块 顶级目录的路径。

        3. 打包模块的路径。

        模块查找器通过以数组索引顺序搜索每个目录,分解模块或打包模块来定位模块。 它发现具有给定名称的模块的第一次出现,并忽略该序列中稍后出现的该名称的其他模块。

        如果元素是模块目录的路径,则目录中的每个条目都是打包的模块或分解模块的顶级目录。 如果目录包含多个具有相同名称的模块,则会出现错误。 如果一个元素是目录的路径,并且该目录包含一个名为module-info.class的文件,则该目录将被视为一个分解模块而不是一个模块目录。

        通过此方法返回的模块查找器支持打包为JAR文件的模块。 用一个JAR文件module-info.class在其顶层目录,或在在一个版本条目multi-release JAR文件,是一个模块化的JAR文件,从而定义了一个明确的模块。 顶级目录中没有一个module-info.class JAR文件定义了一个自动模块 ,如下所示:

        • 如果JAR文件在其主清单中具有属性“ Automatic-Module-Name ”,则其值为module name 模块名称否则从JAR文件的名称派生。

        • version和属性“ Automatic-Module-Name ”不存在时的模块名称是从JAR文件的文件名派生的,如下所示:

          • .jar ”后缀被删除。

          • 如果名称与正则表达式"-(\\d+(\\.|$))"匹配,则模块名称将从第一次出现连字符之前的子序列导出。 连字符后的序列被解析为Version和忽略,如果它不能被解析为Version

          • 模块名称中的所有非字母数字字符( [^A-Za-z0-9] )都将替换为点( "." ),所有重复点都将替换为一个点,并删除所有前导点和尾随点。

          • 例如,名为“ foo-bar.jar ”的JAR文件将导出一个模块名称“ foo.bar ”,没有版本。 名为“ foo-bar-1.2.3-SNAPSHOT.jar ”的JAR文件将导出一个模块名称“ foo.bar ”和“ 1.2.3-SNAPSHOT ”作为版本。

        • 模块中的一组软件包来自JAR文件中的非目录条目,其名称以“ .class ”结尾。 候选包名称是从使用最多但不包括最后正斜杠的字符的名称派生的。 所有剩余的正斜杠都被替换为( "." )。 如果生成的字符串是合法的包名称,那么它被认为是一个包名称。 例如,如果JAR文件包含条目“ p/q/Foo.class ”,则派生的包名称为“ p.q ”。

        • META-INF/services/开头的条目的内容被假定为服务配置文件(参见ServiceLoader )。 如果文件的名称(跟随META-INF/services/ )是合法的类名称,那么它被认为是服务类型的全限定类名称。 文件中的条目被假定为提供者类的完全限定的类名。

        • 如果JAR文件的主清单中有一个Main-Class属性,它的值是一个合法的类名称,其包是在为该模块派生的包的集合中,则该值为模块main class

        如果无法通过自动模块创建ModuleDescriptor (通过ModuleDescriptor.Builder API),则抛出FindException 当“ Automatic-Module-Name ”属性的值不是合法的模块名称时,可能会出现这种情况,合法模块名称不能从JAR文件的文件名导出,其中JAR文件包含一个.class在顶级目录中JAR文件,其中服务配置文件中的条目不是合法的类名称,或者其包名称不在为该模块派生的包的集合中。

        除了JAR文件,实现还可以支持以其他实现特定模块格式打包的模块。 如果指定为此方法的数组中的元素是模块目录的路径,则将忽略该目录中未识别为模块的条目。 如果数组中的元素是未识别的打包模块的路径,那么遇到该文件时会抛出一个FindException 不存在的文件的路径总是被忽略。

        与自动模块一样,可能需要扫描包装或分解模块的内容,以确定模块中的包装。 是否忽略hidden files是否具体实现,因此未指定。 如果在顶级目录中找到了一个.class文件(不是module-info.class ),那么它被假定为未命名的包中的一个类,因此抛出FindException

        通过此方法创建的查找器是懒惰的,不要急于检查给定的文件路径是目录或打包的模块。 因此,如果调用这些方法导致搜索目录或打包的模块并遇到错误,则findfindAll方法将失败。

        参数
        entries - 到包装或分解模块的模块或路径的目录的可能空的数组
        结果
        A ModuleFinder ,用于定位文件系统上的模块
      • compose

        static ModuleFinder compose​(ModuleFinder... finders)
        返回由零个或多个模块查找器的序列组成的模块查找器。 所得到的模块查找器的find方法将通过以数组索引顺序调用每个模块查找器的find方法来定位模块,直到找到该模块或已搜索到所有模块查找器。 得到的模块查找器的findAll方法将返回一组模块,其中包含由第一个模块查找器定位的所有模块。 该组模块将包括由第二个或后续模块查找器定位的所有模块,它们不是按照序列中的先前模块查找器定位的。

        当定位模块然后被抛出的异常或错误findfindAll底层模块发现者的方法将被传播到的所产生的模块取景器的呼叫者findfindAll方法。

        参数
        finders - 模块查找器阵列
        结果
        A ModuleFinder组成一系列模块查找器