У меня есть простой проект Java 9 SE с одной зависимостью от немодульного проекта (для этого примера выберите Weld SE), и я пытаюсь создать его с помощью Maven (_1 _). Чтобы Java 9 заработала, я добавил module-info.java
. Первоначально этот файл содержал только имя модуля и не содержал requires
формул.
Имейте в виду, что моя единственная зависимость НЕ является модульным проектом, поэтому я предположил, что Maven добавит путь к классам (а не путь к модулю) и, следовательно, он окажется в unnamed module
, как описано в Состояние модульной системы.
Теперь моя версия Maven - 3.3.9, и я знаю, что мне нужно использовать плагин компилятора Maven в версии 3.6, так как описано здесь Конечно, я загрузил сборку JDK 9 EA с jigsaw и настроил Maven на ее использование.
Если я построю свой проект без module-info.java
, все будет работать, все будет добавлено в путь к классам и сборка завершится успешно. Я полагаю, Maven просто придерживается старых методов, пока вы не учитываете этот файл.
Однако его построение с module-info.java
говорит мне, что классы из моей зависимости не могут быть найдены в пути к классам. Итак, я запустил Maven в режиме отладки (с -X) и действительно - все банки находятся в пути к модулю, а путь к классам пуст. Это фактически означает, что все мои зависимости переносятся в автоматические модули, и мне нужно объявить их в module-info.java
.
Как только я объявлю требования к автоматическим модулям (ссылка на module-info
проектов), Я могу построить его на JDK 9. Но это немного беспорядочно - моя единственная pom.xml
зависимость - от weld-se-core
, но моя module-info
требует, чтобы я объявил гораздо больше требований для прохождения компиляции.
Вот целый проект GitHub, где все это можно наблюдать.
Итак, мои вопросы:
- Могу ли я сказать Maven поместить некоторые артефакты в путь к классам, если я знаю, что они не модульные? Чтобы я мог избежать
automatic module
и необходимости их объявлять? - Если я буду придерживаться
automatic module
, могу ли я сказать Maven каким-то образом транзитивно разрешить все, что нужно моей зависимости? Например. другие части Weld, CDI API и т. д. - Какова настоящая причина, по которой мне нужно указать, что мой проект
requires
модули, которые я не использую напрямую? Например.weld.environment.common
module-info.java
, даже если они сами не являются модулями. Те, которые не являются модулями, должны быть помещены в путь к модулю, чтобы превратить их в автоматические модули. - person Nicolai Parlog   schedule 09.11.2016