Спасибо Алану Бейтману и Майклу Пасхе за объяснения, и я могу придумать некоторые реалистичные сценарии.
Во-первых, как объяснили Алан и Майкл: JLS позволяет «открывать» каталоги без типов Java для ситуаций, когда мы храним ресурсы в них. Итак, для нас это «каталоги ресурсов», но JLS называет его package which is not declared by a compilation unit
. И это даже не вопрос «позволяет», а скорее «должен». Без директивы opens
для каталога ресурсов (com/foo/abc
) другой модуль не может прочитать ресурс так:
InputStream is = ClassLoader.getSystemResourceAsStream("com/foo/abc/config.properties");
Во-вторых, я написал этот вопрос главным образом потому, что был озадачен тем, что opens
позволяет указывать даже несуществующие «пакеты» (каталоги), хотя он выдает предупреждения, но компилируется успешно.
Возможный сценарий, который я могу придумать для сценария сборки для модульного файла JAR:
- компилирует
.java
файлы (у нас module-info.java
определить opens com.foo.abc;
и com/foo/abc
директория ("пакет") не существует)
- создает
com/foo/abc
каталог
- копирует туда
config_dev.properties
файл, на этом шаге принимается решение, для какой среды мы делаем сборку (PROD / TEST / DEV)
- JAR-файл упакован, содержит байт-код и ресурсы.
В случае, если opens
для несуществующего каталога не было разрешено, шаг # 1 завершился бы неудачно. Но он только выдает предупреждение во время компиляции, что нормально.