Поддерживается ли модуль (модули) внутри модуля в системе Java Platform Module System (JPMS)? Это хорошая практика?
В качестве примера возьмем следующую структуру. Я не включил дескрипторы модуля (module-info.java
) для outermodule1
и корневого модуля (?), который называется modulewithinmodule
.
Я считаю, что эта вложенная структура полезна для управления моими зависимостями с помощью модулей Maven. Конфигурация и инкапсуляция всех модулей (JPMS) с дескриптором модуля также работают должным образом.
Чтобы мой проект был, согласно JPMS, полностью модульным, должен ли я включать дескриптор модуля для модулей, у которых его сейчас нет? Если да, то какую директиву (команду) я должен использовать (если есть) для внутренних модулей? Если нет, то они считаются безымянный модуль и, следовательно, будут зависеть от всех модулей java-base (и, возможно, других), нужны они или нет и утяжеляют приложение; верный?
@Slaw Спасибо за ответ. Так моя последняя фраза верна? Обратите внимание, что outermodule1
содержит только модули (и один pom
файл). Зависит ли это приложение от всех java-модулей (независимо от того, нужны они или нет)?
@Slaw В качестве альтернативы, есть ли способ запросить команду, чтобы сообщить мне, какие модули названный, какие безымянный (и, возможно, какие автоматический)?
Модули Maven либо выводят артефакты, либо служат общей конфигурацией для подмодулей, либо и то, и другое (по крайней мере, я почти уверен; я больше знаком с Gradle). Вам нужны только дескрипторы информации модуля JPMS для тех модулей Maven, которые фактически компилируют код Java. В вашей настройке ни корневой модуль Maven, ни модуль outermodule1
Maven не создают никакого кода Java, не говоря уже о модуле JPMS. Обратите внимание, что Maven — это только инструмент сборки. Как только вы упаковываете и развертываете свое приложение, Maven больше не присутствует на картинке.
Что касается вашего второго комментария, то безымянный модуль особенный. Это модуль, в котором заканчивается весь код, размещенный на пути к классам. По определению, если код помещается в путь к модулю, он не может находиться в безымянный модуль. Именованные модули могут быть автоматическими или нет. Автоматический модуль не имеет дескриптора module-info
. Я считаю, что вы можете увидеть, является ли файл JAR автоматическим модулем или нет, используя jar
с опцией --describe-module
. Также может быть что-то, что вы можете сделать с jdeps
или, может быть, даже java
, но не уверен.
Благодаря ответам @Slaw и дополнительным исследованиям я собрал следующее. Поправьте меня, если я ошибаюсь.
Вложенные модули JPMS не поддерживаются.
Приведенная выше файловая структура не привела бы к какой-либо вложенной структуре JPMS, а модуль безымянный JPMS не существует. Компилятор должен иметь доступ к путям модулей, и Maven позаботится об этом. Обратите внимание, однако, что модули Maven являются вложенными.
Согласно здесь, хотя модуль безымянный автоматически требует все другие именованные модули, они загружаются только по требованию.
Нет, JPMS не поддерживает модули внутри модулей. Однако то, что вы делаете с модулями Maven, должно быть в порядке. Несмотря на то, что у вас есть модуль Maven «внутри» внешнего модуля, они по-прежнему являются отдельными модулями.