Обновление: я ответил на свой вопрос здесь:
Сканирование classpath/modulepath во время выполнения в Java 9
--
[Старый вопрос -- устарел:]
В системе модулей Java 9 вы можете найти системные модули, используя
Set<ModuleReference> ms = ModuleFinder.ofSystem().findAll();
Затем эти объекты ModuleReference
можно использовать для отображения содержимого каждого модуля, используя:
for (ModuleReference m : ms) {
System.out.println(m.descriptor().name());
System.out.println(" " + m.descriptor().toNameAndVersion());
System.out.println(" " + m.descriptor().packages());
System.out.println(" " + m.descriptor().exports());
Optional<URI> location = m.location();
if (location.isPresent()) {
System.out.println(" " + location.get()); // e.g. "jrt:/java.base"
}
m.open().list().forEach(s -> System.out.println(" " + s));
}
А чтобы получить модуль текущего класса, вы можете использовать
Module m = getClass().getModule();
но я не могу получить ModuleReference
из этого Module
(поэтому я не могу перечислить содержимое модуля, кроме пакетов), а несистемные Module
не перечислены ModuleFinder
.
Два вопроса:
- Как перечислить ресурсы в несистемных модулях?
- Как немодульные пути к классам читаются в JRE 9? Я просто должен полагаться на системное свойство
java.class.path
? (ПолеAppClassLoader#ucp
типаURLClassPath
невидимо и заблокировано в JRE 9, поэтому вы также не можете получить его путем самоанализа.)
ModuleLayer
изModule
. Если вы посмотрите на пример по ссылке там, вы можете найти конфигурацию и слой, используя каталог модулей через ModuleFinder. - person Naman   schedule 22.12.2017