Каков наилучший способ извлечь имя модуля для 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(ModuleDescriptor::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"
);