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

What is the best way to extract module name for a JarFile programmatically?

我正在为 Java 9 开发一个使用模块分层的启动器库。为了在层中添加模块,我需要将模块名称(作为字符串)传递给父级的配置。 ModuleLayer Javadoc 在 class 文档的末尾有一个示例。

现在,我不想让我的库的用户承担声明模块名称的负担,我只想允许将 jar 文件位置作为 StringURLFile, 或 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());

Edit:: Alan 建议从其 jar 中获取单个模块(自动)的上述内容的一行代码可能是:

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"
);