Модули Maven + Построение отдельного конкретного модуля


384

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

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

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

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

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

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

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

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


возможный дубликат Maven и зависимых модулей
oberlies

Ответы:


696

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

Используйте расширенные варианты реакторов 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


15
Для любого, кто посетит эту страницу в 2011 году, это лучший ответ. Теперь улучшена поддержка нескольких модулей внутри самого Maven (Maven 2.1 и выше), вам не нужно использовать плагин реактора.
Спедж

17
Другой очень полезный параметр - «-amd, --also-make-dependents», который собирает все модули в зависимости от проектов в списке реакторов.
Определить

1
Как насчет создания модуля внука?
Bax

12
@Bax, используйте mvn install -pl .,parent/child,parent/child/grandchild запятую для разделения нескольких проектов и. для родителей пом
Нео

1
Когда я пытаюсь clean packageсоздать модуль таким способом, он не может разрешить зависимости реактора, которые еще не установлены. С -amним будут без необходимости перестраивать депы.
таз

18

Say Родитель pom.xml содержит 6 модулей , и вы хотите , чтобы запустить A , B и F .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1-CD в родительский проект

 mvn --projects A,B,F --also-make clean install

ИЛИ

mvn -pl A,B,F -am clean install

ИЛИ

mvn -pl A,B,F -amd clean install

Примечание. Если вы укажете проект с параметром -am , Maven создаст все проекты, от которых зависит указанный проект (прямо или косвенно). Maven изучит список проектов и пройдет по дереву зависимостей, найдя все проекты, которые ему нужно построить.

В то время как команда -am делает все проекты, требуемые конкретным проектом, в многомодульной сборке, опция -amd или --also-make-dependents настраивает Maven для создания проекта и любого проекта, который зависит от этого проекта. При использовании --also-make-dependents Maven проверяет все проекты в нашем реакторе, чтобы найти проекты, которые зависят от конкретного проекта. Он будет автоматически строить эти проекты и ничего больше.


8

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

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

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

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


3
Во время разработки это будет кошмар, образ, который, как только вы сделаете исправление в подмодуле, вам придется установить его, а затем запустить контейнер сервлета. Жизнь коротка :(
hguser 25.11.15

7

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

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

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


1
Есть ли простой способ гарантировать, что все зависимые проекты для моего целевого проекта были установлены? Иерархия, которая у меня есть, на самом деле намного сложнее, чем описанная здесь, поэтому постарайтесь запомнить, запустил ли я mvn install для каждого зависимого проекта, так как я в последний раз вносил изменения в код, может быть сложно.
Брайан Феррис

Да, используя модули для создания набора проектов, смотрите ссылку, добавленную в исходный ответ.
Богатый продавец

5

Взгляните на мой ответ Maven и зависимые модули .

Плагин Maven Реактор предназначен для решения строительной части проекта.

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


3
Раньше это был правильный ответ, но с Maven 2.1 вам больше не нужно использовать плагин реактора. Посмотрите на ответ Паскаля в этой теме, касающийся «Дополнительные параметры реактора»
Spedge

3

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

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

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


Гммм ... тогда я получу столько же агрегаторных проектов, сколько и проектов.
Крис

@ Крис, я бы больше не рекомендовал это. Я оставлю это здесь на случай, если кто-то все еще хочет знать как, но теперь я всегда использую флаги -am и -pl. Я обновил свой ответ.
Зак Томпсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.