Java :: Модуль (ы) внутри модуля?

Поддерживается ли модуль (модули) внутри модуля в системе Java Platform Module System (JPMS)? Это хорошая практика?

В качестве примера возьмем следующую структуру. Я не включил дескрипторы модуля (module-info.java) для outermodule1 и корневого модуля (?), который называется modulewithinmodule.

Java :: Модуль (ы) внутри модуля?

Я считаю, что эта вложенная структура полезна для управления моими зависимостями с помощью модулей Maven. Конфигурация и инкапсуляция всех модулей (JPMS) с дескриптором модуля также работают должным образом.

Чтобы мой проект был, согласно JPMS, полностью модульным, должен ли я включать дескриптор модуля для модулей, у которых его сейчас нет? Если да, то какую директиву (команду) я должен использовать (если есть) для внутренних модулей? Если нет, то они считаются безымянный модуль и, следовательно, будут зависеть от всех модулей java-base (и, возможно, других), нужны они или нет и утяжеляют приложение; верный?

Нет, JPMS не поддерживает модули внутри модулей. Однако то, что вы делаете с модулями Maven, должно быть в порядке. Несмотря на то, что у вас есть модуль Maven «внутри» внешнего модуля, они по-прежнему являются отдельными модулями.

Slaw 21.03.2022 04:26

@Slaw Спасибо за ответ. Так моя последняя фраза верна? Обратите внимание, что outermodule1 содержит только модули (и один pom файл). Зависит ли это приложение от всех java-модулей (независимо от того, нужны они или нет)?

Aria 21.03.2022 05:07

@Slaw В качестве альтернативы, есть ли способ запросить команду, чтобы сообщить мне, какие модули названный, какие безымянный (и, возможно, какие автоматический)?

Aria 21.03.2022 05:11

Модули Maven либо выводят артефакты, либо служат общей конфигурацией для подмодулей, либо и то, и другое (по крайней мере, я почти уверен; я больше знаком с Gradle). Вам нужны только дескрипторы информации модуля JPMS для тех модулей Maven, которые фактически компилируют код Java. В вашей настройке ни корневой модуль Maven, ни модуль outermodule1 Maven не создают никакого кода Java, не говоря уже о модуле JPMS. Обратите внимание, что Maven — это только инструмент сборки. Как только вы упаковываете и развертываете свое приложение, Maven больше не присутствует на картинке.

Slaw 21.03.2022 05:25

Что касается вашего второго комментария, то безымянный модуль особенный. Это модуль, в котором заканчивается весь код, размещенный на пути к классам. По определению, если код помещается в путь к модулю, он не может находиться в безымянный модуль. Именованные модули могут быть автоматическими или нет. Автоматический модуль не имеет дескриптора module-info. Я считаю, что вы можете увидеть, является ли файл JAR автоматическим модулем или нет, используя jar с опцией --describe-module. Также может быть что-то, что вы можете сделать с jdeps или, может быть, даже java, но не уверен.

Slaw 21.03.2022 05:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря ответам @Slaw и дополнительным исследованиям я собрал следующее. Поправьте меня, если я ошибаюсь.

  1. Вложенные модули JPMS не поддерживаются.

  2. Приведенная выше файловая структура не привела бы к какой-либо вложенной структуре JPMS, а модуль безымянный JPMS не существует. Компилятор должен иметь доступ к путям модулей, и Maven позаботится об этом. Обратите внимание, однако, что модули Maven являются вложенными.

  3. Согласно здесь, хотя модуль безымянный автоматически требует все другие именованные модули, они загружаются только по требованию.

Другие вопросы по теме