Что мне нужно для сборки проекта JDK 9 с немодульными зависимостями с помощью Maven
У меня есть простой проект Java 9 SE с одной зависимостью от немодуляризованного проекта (выбрал Weld SE для этого примера), и я пытаюсь построить его с Maven (clean install
).для того, чтобы Java 9 заработала, я добавил module-info.java
. Первоначально этот файл содержал только имя модуля и не имел формул requires
.
Пожалуйста, имейте в виду, что моя единственная зависимость не является модульным проектом, поэтому я предположил, что Maven поместит в classpath (а не в module-path) и, следовательно, он окажется в unnamed module
как описывается в состояние модульной системы.
Теперь моя версия Maven - 3.3.9, и я знаю, что мне нужно использовать плагин компилятора Maven в версии 3.6, как описано здесь конечно, я скачал JDK 9 EA build с jigsaw и установил Maven для использования этого.
Если я создаю свой проект без module-info.java
, все работает, материал добавляется в classpath и сборка завершается успешно. Я полагаю, что Мэйвен просто придерживается старых методов, пока вы оставляете этот файл.
Однако построение его С помощью module-info.java
говорит мне,что классы из моей зависимости не могут быть найдены на пути к классу. Поэтому я запустил Maven в режиме отладки (с -X) и действительно - все банки находятся под модулем-path, а classpath пуст. Это фактически означает, что все мои зависимости переносятся в автоматические модули и мне нужно объявить их в module-info.java
.
Как только я объявлю требования к автоматическому модулю (ссылка на проекты module-info
), я умею построить его на JDK 9 . Но это своего рода беспорядок - моя единственная pom.xml
зависимость от weld-se-core
, но моя module-info
требует, чтобы я объявил намного больше требований для прохождения компиляции.
Вот целый проектGitHub , где все это можно наблюдать.
Итак, мои вопросы таковы:
-
могу ли я попросить Maven поместить некоторые артефакты на classpath, если я знаю, что они не являются модульными? Так что я могу избежать
automatic module
и необходимости объявить они? -
Если я придерживаюсь
automatic module
, могу ли я сказать Maven, чтобы он каким-то образом транзитивно разрешил все, что моя зависимость должна принести? Например, другие части Weld, CDI API и т. д. - какова реальная причина, почему я должен заявить, что мой проект
requires
модули, которые я не использую напрямую? Например.weld.environment.common
3 ответа:
Включая несколько последних обновлений, я бы попробовал и ответил на это.
Обновление
- Java 9 была выпущена публично 21.09.2017.
Минимальная совместимая версия
maven-compiler-plugin
в сегодняшней дате -3.7.0
.Как уже сообщал @Tunaki о том, как вы можете настроить его для сборки совместимых версий для обоих JDK 1.5-8 и JDK 9.
Исходя из вопроса и комментариев, вы уже знаете о автоматических модулях и размещении всех зависимостей модуля на пути к модулю.
Могу ли я попросить Maven поместить некоторые артефакты на classpath, если я знаю, что они не являются модульными? Чтобы я мог избежать автоматического модуля и необходимости объявлять их?
Для артефактов, указанных в maven pom
<dependencies>
, и тех, которые также не включены вmodule-info.java
текущего модуля, в конечном счете остаются позади, чтобы быть доступ из пути к классу в виде безымянный модуль.Если я придерживаюсь автоматического модуля, могу ли я сказать Maven, чтобы он каким-то образом транзитивно разрешил все, что нужно моей зависимости? Например, другие части Weld, CDI API и т. д.
Нет , поскольку автоматические модули не состоят из явно объявленного
module-info.java
, нет такого способа определенияrequires transitive
для любого транзитивного зависимость, которая может потребоваться для данного модуля.Из одного из моих прошлых опытов, любая транзитивная зависимость Maven, описанная в
dependency:tree
, которая необходима во время компиляции модулем, должна быть явно определена с помощьюrequires
вmodule-info
текущего проекта.Какова реальная причина, почему я должен заявить, что мой проект требует модулей, которые я не использую напрямую? Например, сварка.окружающая среда.общий* *
Вам не нужно указывать
requires
для модулей, которые не требуются при компиляции или выполнении вашим модулем.Если существует зависимость, которая не требуется во время выполнения, но требуется во время компиляции вашим проектом, вам нужно будет убедиться, что вы определяете такой модуль с помощью
requires static
в ваших декларациях.Я бы предпочел практиковать подобный подход и в настоящее время, как указано в ответ на вопрос должен ли я сохранять или удалять объявленные зависимости, которые также являются транзитивными зависимостями?