Как определить, к какому модулю относится пакет?

#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();