#java #module #java-9 #java-module #jdeps
Вопрос:
Учитывая некоторый пакет foo.bar
, как мне найти, какому модулю он принадлежит?
Например, пакет java.util
принадлежит модулю java.base
. Я могу проверить это, введя jdeps -m java.base
и просмотрев длинный вывод. Это, однако, предполагает, что я заранее знаю, что пакет java.util
принадлежит модулю java.base
.
Как я могу проверить, какому модулю принадлежит пакет?
Комментарии:
1. Пакеты экспорта модулей, пожалуйста, смотрите здесь: openjdk.java.net/jeps/261
2. Ха, интересно. Я подумал, что, поскольку я могу объявить свой собственный
java.util
пакет в своем собственном модуле, вопрос о том, «какому модулю онjava.util
принадлежит», не очень четко определен. Но, попробовав это, я понял, что больше не могу этого делать в Java 9 . ПОКА3. Каков фактический вариант использования именно для этого? Я имею в виду, что вы, как правило, можете выполнять
jdeps
и над полным приложением, поэтому ваши предварительные знания не обязательно должны быть ограничены.4. @Sweeper вы никогда не смогли бы определить свой собственный
java.util
пакет. Все квалифицированные имена, начинающиеся сjava.
, были зарезервированы еще до Java 9. Для других не зарезервированных имен вы все равно можете определить пакеты с тем же именем, но с разными загрузчиками классов, если они принадлежат к безымянному модулю загрузчика или к разным слоям модулей без отношения «родитель-потомок».5. @user16320675 изменение содержимого
java.util
пакета полностью отличается от создания другого пакета с тем же именем во время выполнения. Измененныйjava.util
пакет по — прежнему будет принадлежатьjava.base
модулю.
Ответ №1:
Это то, чего ты хочешь?
Optional<Module> found = ModuleLayer
.boot()
.modules()
.stream()
.filter(module -> module.getPackages().contains("java.util"))
.findFirst();