В чем разница между требует и требует статического в объявлении модуля

В чем разница между операторами модуля requires и requires static в объявлении модуля?

Например:

module bar {
    requires java.compiler;
    requires static java.base;
}

person Michał Szewczyk    schedule 03.10.2017    source источник


Ответы (2)


Предложение requires указывает, что требуемый модуль необходим во время компиляции и выполнения. Следовательно, когда модульная система обнаруживает такое предложение во время разрешения модуля ( фаза, на которой обрабатываются дескрипторы модулей и разрешаются зависимости), он выполняет поиск во вселенной наблюдаемых модулей (модули в JDK и на пути к модулю) и выдает ошибку, если не находит модуль.

Предложение requires static выражает зависимость, которая является необязательной во время выполнения. Это означает, что во время компиляции система модулей ведет себя точно так, как описано выше.

С другой стороны, во время выполнения он в основном игнорирует предложения requires static. Если он встречается, он не решает его. Это означает, что если на наблюдаемый модуль ссылается только requires static, он не попадает в граф модуля! Поначалу это может немного удивить. Если, с другой стороны, модуль попадает в граф другим способом (требуется некоторым другим модулем, добавлено вручную с помощью --add-modules, нарисовано привязка службы), все модули, которые имеют необязательную зависимость от нее, могут прочтите это.

person Nicolai Parlog    schedule 03.10.2017
comment
Не могли бы вы предоставить вариант использования, когда мне нужно статическое? Почему я должен иметь некоторую зависимость только во время компиляции? - person gstackoverflow; 13.05.2019
comment
Я думаю, что это выходит за рамки этого вопроса, но я приведу два примера в моем сообщении в блоге о необязательных зависимостях. - person Nicolai Parlog; 15.05.2019

Основное различие между ними заключается в том, что в случае

requires static foo.module;

Зависимость обязательна в статической фазе, во время компиляции, но не обязательна в динамической фазе, во время выполнения, а с другой стороны

requires bar.module;

Добавляется, чтобы объявить, что модуль зависит по имени от некоторых других модулей, как во время компиляции, так и во время выполнения.

person Naman    schedule 03.10.2017
comment
Не могли бы вы предоставить вариант использования, когда мне нужно статическое? Почему я должен иметь некоторую зависимость только во время компиляции? - person gstackoverflow; 13.05.2019
comment
@gstackoverflow lombok и другие инструменты обработки аннотаций (например, аннотации не во время выполнения) - person Etki; 18.05.2019
comment
@Etki опубликует это как ответ, мне потребовалось 5 минут, чтобы прочитать оба ответа, чтобы получить его только через ваш комментарий. И это случилось уже третий раз за 3 года! пожалуйста... - person Eugene; 27.07.2020