Модули Maven + Построение отдельного конкретного модуля - PullRequest
307 голосов
/ 11 июля 2009

У меня есть многомодульный проект Maven с родительским проектом P и тремя подмодулями A, B и C. И B, и C - военные проекты, и оба зависят от A.

Я могу набрать mvn compile в P и правильно скомпилировать все подмодули. Проблема возникает, когда я хочу выполнить операции для определенных модулей.

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

Я понимаю из этого вопроса: Maven и зависимые модули , что, возможно, Maven на самом деле не предназначен для такого типа разрешения зависимостей, но возникает вопрос, как мне упаковать B?

  1. Должен ли я запускать mvn package для всей иерархии проекта, когда я действительно просто хочу B?

  2. Нужно ли устанавливать моментальные снимки A в мой локальный репозиторий каждый раз, когда я хочу упаковать B?

Этот второй сценарий не очень веселый, когда A все еще находится в активной разработке.

Есть ли здесь лучшие практики?

Ответы [ 5 ]

584 голосов
/ 10 октября 2010

Есть ли здесь лучшие практики?

Используйте расширенные опции реактора Maven , более конкретно:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

Так что просто cd в родительский каталог P и запустите:

mvn install -pl B -am

И это создаст B и модули, требуемые B.

Обратите внимание, что вам нужно использовать двоеточие, если вы ссылаетесь на artifactId, который отличается от имени каталога:

mvn install -pl :B -am

Как описано здесь: https://stackoverflow.com/a/26439938/480894

8 голосов
/ 11 июля 2009

Maven абсолютно был разработан для этого типа зависимости.

mvn package не будет ничего устанавливать в вашем локальном репозитории, он просто упакует проект и оставит его в целевой папке.

Выполните mvn install в родительском проекте (A), при этом все субмодули будут установлены в репозиторий Maven вашего компьютера, если нет изменений, вам просто нужно скомпилировать / упаковать субмодуль (B) и Maven точно примет уже упакованные и установленные зависимости.

Вам просто нужно mvn install в родительском проекте, если вы обновили некоторую часть кода.

7 голосов
/ 11 июля 2009

Если вы ранее запускали mvn install в проекте B, он будет установлен в вашем локальном хранилище, поэтому при сборке пакета A Maven может разрешить зависимость. Таким образом, до тех пор, пока вы устанавливаете проект B каждый раз, когда вы меняете его, ваши сборки для проекта A будут обновляться.

Вы можете определить многомодульный проект с модулем агрегации для создания набора проектов.

Также стоит упомянуть m2eclipse , он интегрирует Maven в Eclipse и позволяет (опционально) разрешать зависимости из рабочей области. Поэтому, если вы взламываете несколько проектов, содержимое рабочей области будет использоваться для компиляции. Когда вы будете довольны своими изменениями, запустите mvn install (для каждого проекта по очереди или с помощью агрегатора), чтобы поместить их в локальный репозиторий.

5 голосов
/ 14 июля 2009

Посмотрите на мой ответ Maven и зависимые модули .

Плагин Maven Reactor предназначен для построения части проекта.

Конкретная цель, которую вы захотите использовать reactor:make.

3 голосов
/ 12 июля 2009

Вы говорите, что "действительно просто хотите B", но это неверно. Вы хотите B, но вы также хотите обновить A, если в него были внесены какие-либо изменения («активная разработка»).

Итак, иногда вы хотите работать с A, B и C. Для этого случая у вас есть проект-агрегатор P. Для случая, когда вы хотите работать с A и B (но не хотите В) вам следует создать агрегаторный проект Q.

Изменить 2016 : Приведенная выше информация, возможно, была актуальна в 2009 году. С 2016 года я настоятельно рекомендую игнорировать это в большинстве случаев и просто использовать флаги командной строки -am или -pl как описано в принятом ответе. Если вы используете версию maven, предшествующую v2.1, сначала измените ее:)

...