Что мне нужно для сборки проекта 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 и сборка завершается успешно. Я полагаю, что Мэйвен просто придерживается старых методов, пока вы оставляете этот файл.

Однако построение его С помощью module-info.java говорит мне,что классы из моей зависимости не могут быть найдены на пути к классу. Поэтому я запустил Maven в режиме отладки (с -X) и действительно - все банки находятся под модулем-path, а classpath пуст. Это фактически означает, что все мои зависимости переносятся в автоматические модули и мне нужно объявить их в module-info.java.

Как только я объявлю требования к автоматическому модулю (ссылка на проекты module-info), я умею построить его на JDK 9 . Но это своего рода беспорядок - моя единственная pom.xml зависимость от weld-se-core, но моя module-info требует, чтобы я объявил намного больше требований для прохождения компиляции.

Вот целый проектGitHub , где все это можно наблюдать.

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

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

3 ответа:

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

Обновление

  • Java 9 была выпущена публично 21.09.2017.
  • Минимальная совместимая версия maven-compiler-plugin в сегодняшней дате - 3.7.0.

    Как уже сообщал @Tunaki о том, как вы можете настроить его для сборки совместимых версий для обоих JDK 1.5-8 и JDK 9.

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

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

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

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

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

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

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

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