Каков наилучший способ извлечь имя модуля для JarFile программно?

Я работаю над библиотекой запуска для Java 9, которая использует многоуровневую структуру модулей. Чтобы добавить модуль в слой, мне нужно передать имя модуля (в виде строки) в конфигурацию родителя. ModuleLayer Javadoc есть пример только в конце документации класса.

Теперь вместо того, чтобы перекладывать бремя пользователя моей библиотеки на объявление имен модулей, я хотел бы разрешить просто передавать местоположение файла jar как String, URL, File, или же JarFile,

Так что мой вопрос, учитывая JarFile что было бы самым простым способом извлечения имени модуля программно; автоматический или заявленный?

1 ответ

Решение

Один из способов узнать имена модулей, присутствующих в каталоге, можно получить через 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:: One-liner для вышеизложенного, предложенный 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"
);
Другие вопросы по тегам