我正在为Java 9开发一个使用模块分层的启动器库。为了在图层中添加模块,我需要将模块名称(作为String)传递给父级的配置。 ModuleLayer
Javadoc在类文档的最后有一个例子。
现在,我不想转发我的库用户的负担来声明模块名称,而是希望只允许将jar文件位置作为String
,URL
,{{1 },或File
。
所以我的问题,给定一个JarFile
什么是以编程方式提取模块名称的最简单方法;自动还是申报?
答案 0 :(得分:4)
我能想到的一种方法是通过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());
编辑 ::根据Alan的建议,对于上面的单行模块(自动)可以是:
String moduleName = ModuleFinder.of(path_to_jar)
.findAll().stream().findFirst()
.map(ModuleReference::descriptor)
.map(ModuleDescriptor::name)
.orElse(null);
另一种方法是使用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"
);