我似乎无法找到关于是否仍然可以在运行时扫描所有可用类(用于接口,注释等)的任何信息,就像Spring,Reflections和许多其他框架和库当前所做的那样,面对Jigsaw相关的更改类的加载方式.
编辑:这个问题是关于扫描寻找类的真实物理文件路径.另一个问题是关于动态加载类和资源.这是相关的,但非常重复.
更新:Jetty项目为此制定了标准化API的 JEP建议.如果你有办法帮助实现这个目标,请做.否则,等待和希望.
更新2:找到这个相关的发声帖子.引用后代的代码片段:
如果您真的只是想了解启动层中的模块内容(启动时解析的模块),那么您将执行以下操作:
ModuleLayer.boot().configuration().modules().stream()
.map(ResolvedModule::reference)
.forEach(mref -> {
System.out.println(mref.descriptor().name());
try (ModuleReader reader = mref.open()) {
reader.list().forEach(System.out::println);
} catch (IOException ioe) {
throw new UncheckedIOException(ioe);
}
});
Run Code Online (Sandbox Code Playgroud) java classpath java-platform-module-system java-9 java-module
我试图了解JPMS的工作原理.
从这里开始
类路径还没有完全消失.所有JAR(模块化或非模块化)和类路径上的类都将包含在未命名模块中.与自动模块类似,它导出所有包并读取所有其他模块.但显然它没有名字.因此,命名的应用程序模块不能要求和读取它.未命名的模块又可以访问所有其他模块.
请注意...on the classpath will be contained in the Unnamed Module.模块是单数.
从这里开始
为了兼容性,类路径上的所有代码都打包为一个特殊的未命名模块,没有隐藏的包和对整个JDK的完全访问权限.
再次unnamed module.模块是单数.
我是否理解JPMS中始终只有一个未命名的模块?是否意味着在Java9之前开发但未针对Java9更新的应用程序将作为一个未命名的模块加载?