Что нужно, чтобы построить проект с 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 и build успешно. Я полагаю, что Maven просто придерживается старых способов, пока ты оставляешь этот файл.
module-info.java
говорит мне, что классы из моей зависимости не могут быть найдены на пути к классам. Поэтому я запустил Maven в режиме отладки (с -X) и действительно - все банки находятся под module-path, а classpath пуст. Это фактически означает, что все мои зависимости переведен в автоматические модули и мне нужно объявить их в module-info.java
.
как только я объявляю the требования к автоматическому модулю(ссылка на проекты module-info
),я могу построить его на JDK 9. Но это своего рода беспорядок - мой единственный pom.xml
dependecy на weld-se-core
, но module-info
требует, чтобы я объявил гораздо больше требований для компиляции для передачи.
вот целый проект GitHub где все это можно наблюдать.
Итак, мои вопросы:
- я могу сказать Maven, чтобы поместить некоторые артефакты на classpath, если я знаю, что они не модульны? Чтобы я мог избежать
automatic module
и нужно их декларировать? - если я буду придерживаться
automatic module
, могу ли я сказать Maven как-то транзитивно разрешить все, что нужно моей зависимости? Например. другие части сварки, API etc. CDI - какова фактическая причина, почему мне нужно заявить, что мой проект
requires
модули, которые я не использовать напрямую? Например.weld.environment.common
3 ответов
включая несколько последних обновлений, я бы попробовать и ответьте на это.
обновление
- Java 9 был выпущен публично 21.09.2017.
-
на минимальная совместимая версия of
maven-compiler-plugin
на сегодня3.7.0
.как уже поделился @Tunaki о том, как вы можете настроить его для создания совместимых версий для обоих JDK 1.5-8 и JDK 9.
предполагая из вопроса и комментариев, вы уже знаете о автоматические модули и размещение всех зависимостей модуля на пути к модулю.
могу ли я сказать Maven поместить некоторые артефакты на classpath, если я знаю, что они не модульны? Чтобы я мог избежать автоматического модуля и необходимости их объявлять?
для артефактов, указанных в Maven pom <dependencies>
и те, которые также не включены в module-info.java
текущего модуля, в конечном счете, оставленных в classpath в виде безымянный модуль.
если я придерживаюсь автоматического модуля, могу ли я сказать Maven как-то транзитивно разрешить что-либо, что моя зависимость должна принести? Например. другие части сварки, API etc. CDI
нет, так как автоматический модули не состоят из явно объявленного module-info.java
нет такого способа определения requires transitive
для любой транзитивной зависимости, которая может потребоваться настоящему модулю.
один из моих прошлого опыта, любая транзитивная зависимость Maven, как подробно описано в dependency:tree
который необходим во время компиляции модулем, должен быть явно определен с помощью requires
на module-info
текущего проект.
какова фактическая причина, почему мне нужно заявить, что мой проект требует модулей, которые я не использую напрямую? Е. Г. сварки.окружающая среда.common**
вам не нужно указывать
requires
для модулей, которые не требуются при компиляции или выполнении вашим модулем.-
если есть зависимость, которая не требуется во время выполнения, но требуется во время компиляции ваш проект, вам нужно будет убедиться, что вы определяете такой модуль, используя
requires static
в ваших объявлениях.Я бы предпочел практиковать аналогичный подход и в настоящее время, как указано в ответе на я должен сохранить или удалить объявили зависимости и транзитивные зависимости?
Я думаю, что это может помочь сказать maven использовать java 9:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
</plugins>
</build>
если указать module-info.java
файл, вам нужно будет объявить все модули java, кроме java.base
вам нужно, как вы сейчас используете jigsaw.
используя mvn dependency:tree
может помочь вам в заполнении этого, но вы не обязаны использовать module-info.java
в Java 9.