-
public interface ModuleFinder
模块的取景器。 AModuleFinder
用于在resolution或service 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 -> ... );
这里定义的
find
和findAll
方法可能由于几个原因而失败。 这些包括I / O错误,检测到解析模块描述符(module-info.class
)的错误,或由ModuleFinder
返回的ModuleFinder的情况下,在目录中找到两个或多个具有相同名称的模块。 当检测到错误时,这些方法抛出FindException
与适当的cause
。 抛出ModuleFinder
之后的一个FindException
的行为是未定义的。 例如,抛出异常后调用find
可能会扫描或导致异常的相同模块。 建议在抛出异常之后丢弃模块查找器。A
ModuleFinder
不需要线程安全。- 从以下版本开始:
- 9
-
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 Default Methods Modifier and Type 方法 描述 static ModuleFinder
compose(ModuleFinder... finders)
返回由零个或多个模块查找器的序列组成的模块查找器。Optional<ModuleReference>
find(String name)
查找给定名称的模块的引用。Set<ModuleReference>
findAll()
返回此查找器可以找到的所有模块引用的集合。static ModuleFinder
of(Path... entries)
返回通过搜索一系列目录和/或打包模块来定位文件系统上的模块的模块查找器。static ModuleFinder
ofSystem()
返回找到 系统模块的模块查找器。
-
-
-
方法详细信息
-
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)
返回通过搜索一系列目录和/或打包模块来定位文件系统上的模块的模块查找器。 给定数组中的每个元素都是以下之一:到模块目录的路径。
分解模块 顶级目录的路径。
打包模块的路径。
如果元素是模块目录的路径,则目录中的每个条目都是打包的模块或分解模块的顶级目录。 如果目录包含多个具有相同名称的模块,则会出现错误。 如果一个元素是目录的路径,并且该目录包含一个名为
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
。通过此方法创建的查找器是懒惰的,不要急于检查给定的文件路径是目录或打包的模块。 因此,如果调用这些方法导致搜索目录或打包的模块并遇到错误,则
find
或findAll
方法将失败。- 参数
-
entries
- 到包装或分解模块的模块或路径的目录的可能空的数组 - 结果
-
A
ModuleFinder
,用于定位文件系统上的模块
-
compose
static ModuleFinder compose(ModuleFinder... finders)
返回由零个或多个模块查找器的序列组成的模块查找器。 所得到的模块查找器的find
方法将通过以数组索引顺序调用每个模块查找器的find
方法来定位模块,直到找到该模块或已搜索到所有模块查找器。 得到的模块查找器的findAll
方法将返回一组模块,其中包含由第一个模块查找器定位的所有模块。 该组模块将包括由第二个或后续模块查找器定位的所有模块,它们不是按照序列中的先前模块查找器定位的。当定位模块然后被抛出的异常或错误
find
或findAll
底层模块发现者的方法将被传播到的所产生的模块取景器的呼叫者find
或findAll
方法。- 参数
-
finders
- 模块查找器阵列 - 结果
-
A
ModuleFinder
组成一系列模块查找器
-
-