Mor*_*hai 4 java jar java-9 java-module
我正在为 Java 9 开发一个使用模块分层的启动器库。为了在层中添加模块,我需要将模块名称(作为字符串)传递给父级的配置。ModuleLayerJavadoc 在类文档的末尾有一个示例。
现在,我不想让我的库的用户承担声明模块名称的责任,而是允许只将 jar 文件位置作为String, URL, File, 或JarFile.
所以我的问题是,JarFile以编程方式提取模块名称的最简单方法是什么;自动的还是声明的?
我能想到的了解目录中模块名称的一种ModuleFinder.findAll()方法是通过方法:
Path jarDirectory1, jarDirectory2;
ModuleFinder finder = ModuleFinder.of(jarDirectory1, jarDirectory2);
Set<ModuleReference> moduleReferences = finder.findAll();
Set<String> moduleNames =
moduleReferences.stream().map(mRef -> mRef.descriptor().name()).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
编辑:: 上面的 One-liner 按照 Alan 的建议,用于其 jar 中的单个模块(自动)可能是:
String moduleName = ModuleFinder.of(path_to_jar)
.findAll().stream().findFirst()
.??map(ModuleReference:??:descriptor)
.map(Mod??uleDescriptor::name)??
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
另一种方法可能是利用ToolProvider并调整输出流,以便能够仅存储来自以下内容的模块名称:
Optional<ToolProvider> jar = ToolProvider.findFirst("jar");
jar.get().run(
System.out,
System.err,
"--describe-module",
"--file",
"path/to/the/jar/for/example/commons-lang3-3.6.jar"
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
988 次 |
| 最近记录: |