Почему javac жалуется на именованные автоматические модули?
Почему компилятор Java 9 предупреждает "требует директивы для автоматического модуля", если module-info.java
ссылается на автоматические модули с установленным "Automatic-Module-Name"? Каков риск таких модулей?
Этот вопрос не является точной копией Что такое автоматический модуль? потому что последний не рассматривает конкретные причины, стоящие за предупреждением компилятора, на которое я ссылался (контекст вопроса имеет значение). Тем не менее, это полезная ссылка для последующего чтения.
1 ответ
Основная проблема заключается в том, что автоматический модуль может видеть классы из пути к классам, но он также экспортирует весь свой пакет, так что нет инкапсуляции, и как только вам требуется один автоматический модуль, все автоматические модули из пути к модулю видны.
Таким образом, автоматический модуль - отличный инструмент, когда вы переходите в мир модулей, но в целом вам не нужны автоматические модули в вашем графике зависимостей.
Проблема в том, что автоматические модули транзитивно требуют всех остальных модулей. Таким образом, требуя этого, вы загрязняете график зависимостей множеством вещей, и позже вы можете получить очень неожиданное поведение.
Представьте, что у вас есть автоматический модуль com.logging
что требуется для вашего (явного) модуля my.app
. Однако у вас также есть еще один автоматический модуль (не требуетсяmy.app
, просто находящийся в пути к модулю), называемый com.dbconnectors
. Он будет загружен, потому что, когда требуется один автоматический модуль, все остальные также будут разрешены. Он также будет доступен дляmy.app
потому как com.logging
требует это транзитивно.
Затем, когда ваш модуль my.app
требует com.logging
ваш код, используя материал из com.dbconnectors
"волшебным образом" работает, а когда вы удаляете requires com.logging
из дескриптора модуля.
В общем, транзитивные зависимости следует использовать разумно.