Что нужно, чтобы построить проект с 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.