Luk*_*son 6 java classpath java-9 java-module
更新:我在这里回答了我自己的问题:
-
[旧问题 - 已过时:]
在Java 9中获取ModuleReference给定Module对象的正确方法是什么?
考虑以下两种方法java.base:
Module mod = ModuleLayer.boot().findModule("java.base").orElse(null);
ModuleReference modRef = ModuleFinder.ofSystem().find("java.base").orElse(null);
Run Code Online (Sandbox Code Playgroud)
mod有一个方法Set<String> getPackages(),但是你只获得包的名称,你不能列出每个包中的资源.
modRef有一个方法ModuleReader open(),并ModuleReader有一个方法Stream<String> list()列出模块中的资源,这是我需要做的.
但是,对于通过向类路径添加非模块jar文件而生成的自动(因此未命名)模块,您无法获取ModuleReferencefrom ModuleFinder.ofSystem().find(String name)或ModuleFinder.ofSystem().findAll()- 您只能从中获取Module引用getClass().getModule().
我找不到任何方法来获得ModuleReference自动模块.我也找不到ModuleReference从Module对象获取a的方法,这意味着Module如果模块是自动和/或未命名的,我无法列出资源.
当然必须有一种方法来获得ModuleReference一个给定的(已经加载)Module?
返回的模块查找器ModuleFinder.ofSystem()定位系统模块,这些模块内置于运行应用程序的 JRE 环境中。
如果文件系统上自动模块的位置已知,您可以尝试使用目录检索模块查找器,即使用ModuleFinder.of(path). 另一种方法是使用模块层\xe2\x80\x99s配置来解析模块引用:
Optional<ResolvedModule> resolvedModule = ModuleLayer.boot().configuration().findModule(name);\nOptional<ModuleReference> moduleReference = resolvedModule.map(ResolvedModule::reference);\nRun Code Online (Sandbox Code Playgroud)\n\n回答有关仅从Module,有一种方法:
Optional<ModuleReference> moduleReference\n = module.getLayer().configuration()\n .findModule(module.getName())\n .map(ResolvedModule::reference);\nRun Code Online (Sandbox Code Playgroud)\n\n对于未命名的模块,我的猜测是您无法检索它ModuleReference,但至少可以尝试调用 configuration().modules()并查看它们是否包含未命名的模块。
| 归档时间: |
|
| 查看次数: |
3094 次 |
| 最近记录: |