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

Mor*_*hai 4 java jar java-9 java-module

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

现在,我不想让我的库的用户承担声明模块名称的责任,而是允许只将 jar 文件位置作为String, URL, File, 或JarFile.

所以我的问题是,JarFile以编程方式提取模块名称的最简单方法是什么;自动的还是声明的?

Nam*_*man 5

我能想到的了解目录中模块名称的一种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)

  • 或者,这应该这样做:`String mn = ModuleFinder.of(path_to_jar).findAll().stream().findFirst().map(ModuleReference::descriptor).map(ModuleDescriptor::name).orElse(null) ;` (2认同)