Что мне нужно для сборки проекта JDK 9 с немодульными зависимостями с использованием Maven

У меня есть простой проект 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, где все это можно наблюдать.

Итак, мои вопросы:

  1. Могу ли я сказать Maven поместить некоторые артефакты в путь к классам, если я знаю, что они не модульные? Чтобы я мог избежать automatic module и необходимости их объявлять?
  2. Если я буду придерживаться automatic module, могу ли я сказать Maven каким-то образом транзитивно разрешить все, что нужно моей зависимости? Например. другие части Weld, CDI API и т. д.
  3. Какова настоящая причина, по которой мне нужно указать, что мой проект requires модули, которые я не использую напрямую? Например. weld.environment.common

person Siliarus    schedule 08.11.2016    source источник
comment
Эта страница немного устарела, плагин компилятора 3.6.0 сейчас отсутствует. Вы используете эту версию выпуска? Не могли бы вы опубликовать свой текущий проект и образец POM?   -  person Tunaki    schedule 08.11.2016
comment
Забыл добавить - я знаю, что он устарел, и использую выпущенные версии, где это возможно. Я создам более простую версию проекта и обновлю вопрос к завтрашнему дню. Но в основном я взял этот проект и попытался превратить его в JDK 9 знает один. (добавив информацию о модуле и обновив эти плагины maven)   -  person Siliarus    schedule 08.11.2016
comment
Проверяли ли вы также эту страницу? Вам необходимо определить 2 исполнительных блока для проектов, совместимых с Java 8.   -  person Tunaki    schedule 08.11.2016
comment
Не могу помочь вам с деталями Maven, но вы ошиблись в одном. Все зависимости вашего модуля должны быть объявлены в module-info.java, даже если они сами не являются модулями. Те, которые не являются модулями, должны быть помещены в путь к модулю, чтобы превратить их в автоматические модули.   -  person Nicolai Parlog    schedule 09.11.2016
comment
@Tunaki Хорошая ссылка, спасибо. Я проверил его, и хотя он кое-что прояснил, это не помогло.   -  person Siliarus    schedule 09.11.2016
comment
@NicolaiParlog С вашим комментарием мне действительно удалось заставить его работать. Но это только вызвало у меня больше вопросов. Я обновил вопрос. Я действительно не понимаю, почему Maven ведет себя таким образом, почему я получаю автоматический модуль вместо безымянного модуля. И почему мне нужно декларировать требования к модулям, которые я не использую напрямую: - /   -  person Siliarus    schedule 09.11.2016


Ответы (3)


Включая несколько последних обновлений, я бы попробовал и ответил на это.

ОБНОВИТЬ

Исходя из вопроса и комментариев, вы уже знаете об автоматических модулях и поместив все зависимости модуля в путь к модулю.

Могу ли я сказать Maven поместить некоторые артефакты в путь к классам, если я знаю, что они не модульные? Чтобы я мог избежать автоматического модуля и необходимости их объявлять?

Артефакты, указанные в maven pom <dependencies>, и те, которые также не включены в module-info.java текущего модуля, в конечном итоге остаются позади для доступа из пути к классам в форме безымянный модуль.

Если я буду придерживаться автоматического модуля, могу ли я сказать Maven каким-то образом транзитивно разрешить все, что нужно моей зависимости? Например. другие части Weld, CDI API и т. д.

Нет, поскольку автоматические модули не состоят из явно объявленного module-info.java, такого способа определения _ 6_ для любой транзитивной зависимости, которая может потребоваться текущему модулю.

Из одного из моих предыдущих опытов , любая транзитивная зависимость Maven, как подробно описано в dependency:tree, которая необходима модулю во время компиляции, должна быть явно определена с помощью requires в module-info текущего проекта.

Какова настоящая причина, по которой мне нужно заявить, что моему проекту требуются модули, которые я не использую напрямую? Например. weld.environment.common **

person Naman    schedule 04.10.2017
comment
Я в значительной степени понял все, что я спросил некоторое (давно?) Время назад, но я забыл, что я спросил это в первую очередь - позор мне. Ваш ответ хорошо резюмирует, я принимаю его. - person Siliarus; 05.10.2017
comment
Для версии maven-compiler 3.7.0 просто имейте в виду эту проблему - person Marinos An; 23.06.2020
comment
@MarinosAn Я вижу проблему совместимости, на которую вы указываете. Спасибо, что поделился. Думаю, я перешел на 3.8.0 и выше из-за связанной проблемы совместимости и обновил JDK для личных проектов. - person Naman; 23.06.2020

Я думаю, что это может помочь сказать 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>
person Jobanpreet Singh    schedule 01.11.2017

Если вы укажете module-info.java файл, вам нужно будет объявить все java-модули, кроме java.base, которые вам нужны, поскольку теперь вы используете jigsaw.

Использование mvn dependency:tree может помочь вам в заполнении этого поля, но вы не обязаны использовать module-info.java в Java 9.

person UserF40    schedule 31.07.2017