Модули Maven + Создание единого конкретного модуля

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

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

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

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

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

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

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

Какие-нибудь лучшие практики здесь?

Ответ 1

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

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

Как описано здесь: fooobar.com/questions/9179601/...

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 5

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

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

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

Ответ 6

Скажем, Parent 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 делает все проекты, требуемые конкретным проектом, в многомодульной сборке, опция -am d или --also-make-dependents настраивает Maven для создания проекта и любого проекта, который зависит от этого. проект. При использовании --also-make-dependents Maven проверяет все проекты в нашем реакторе, чтобы найти проекты, которые зависят от конкретного проекта. Он будет автоматически строить эти проекты и ничего больше.