以编程方式提取JarFile的模块名称的最佳方法是什么?

时间:2017-12-29 01:58:37

标签: java jar java-9 java-module

我正在为Java 9开发一个使用模块分层的启动器库。为了在图层中添加模块,我需要将模块名称(作为String)传递给父级的配置。 ModuleLayer Javadoc在类文档的最后有一个例子。

现在,我不想转发我的库用户的负担来声明模块名称,而是希望只允许将jar文件位置作为StringURL,{{1 },或File

所以我的问题,给定一个JarFile什么是以编程方式提取模块名称的最简单方法;自动还是申报?

1 个答案:

答案 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(Mod‌​uleDescriptor::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"
);