Подтвердить что ты не робот

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

У меня есть простой проект 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
4b9b3361

Ответ 1

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

UPDATE

Предполагая из вопроса и комментариев, вы уже знаете автоматические модули и размещая все зависимости модуля от пути к модулю.

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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