Зачем открывать несуществующий пакет из модуля Java? - PullRequest
5 голосов
/ 15 мая 2019

JLS 11 "7.7.2. Экспортируемые и открытые пакеты" говорит:

Для opens разрешено указывать пакет, который не объявленЕдиница компиляции, связанная с текущим модулем.

Каков будет сценарий для этого?Зачем это нужно?

1 Ответ

2 голосов
/ 16 мая 2019

Спасибо Алану Бейтману и Майклу Пасхе за объяснения, и я могу придумать некоторые реалистичные сценарии.

Во-первых, как объяснили Алан и Майкл: 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:

  1. компилирует .java файлы (у нас module-info.java определить opens com.foo.abc; и com/foo/abc директория ("пакет") не существует)
  2. создает com/foo/abc каталог
  3. копирует туда config_dev.properties файл, на этом шаге принимается решение, для какой среды мы делаем сборку (PROD / TEST / DEV)
  4. JAR-файл упакован, содержит байт-код и ресурсы.

В случае, если opens для несуществующего каталога не было разрешено, шаг # 1 завершился бы неудачно. Но он только выдает предупреждение во время компиляции, что нормально.

...