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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以编程方式提取Jar文件的模块名称的最佳方法是什么?相关的知识,希望对你有一定的参考价值。

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

现在,我不想转发我的库用户的负担来声明模块名称,我想允许只将jar文件位置传递为StringURLFileJarFile

所以我的问题,给出一个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());

编辑::对于上面的内容,如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"
);

以上是关于以编程方式提取Jar文件的模块名称的最佳方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

在模块内以编程方式在 Drupal 9 上创建示例内容的最佳技术

如何以编程方式从 YouTube 视频中提取音频? [关闭]

以编程方式读取 ildasm 输出的最佳方法是啥

以编程方式填充组合框 dojo (1.8) 的最佳方法是啥?

在 Windows 中以编程方式复制、重命名和粘贴文件的最佳方法

以编程方式访问主类的 MANIFEST.MF