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