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

问题描述 投票:3回答:1

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

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

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

java jar java-9 java-module
1个回答
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所建议的,来自其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"
);
© www.soinside.com 2019 - 2024. All rights reserved.