Что нужно, чтобы построить проект с 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 где все это можно наблюдать.

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

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

3 ответов


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

обновление

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

могу ли я сказать 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.