У меня есть несколько модулей Maven проект с родительского проекта P
и три суб-модулей A
, B
и C
. Оба B
и C
являются военными проектами и оба зависят от A
.
Я могу напечатать mvn compile
в P
и иметь все суб-модули правильно составленные. Проблема возникает, когда я хочу сделать операции для определенных модулей.
Я хотел бы иметь возможность упаковать войну для проекта B
, но когда я запускаю команду package из B
каталога, он жалуется, что не может найти зависимости для A
.
Я понимаю из этого вопроса: Maven и зависимые модули, которые, возможно, Maven на самом деле не предназначены для такого типа разрешения зависимостей, но возникает вопрос, как мне упаковать B
?
Должен ли я работать
mvn package
по всей иерархии проекта, когда я действительно хочуB
?Нужно ли устанавливать моментальные снимки A в мой локальный репозиторий каждый раз, когда я хочу упаковать пакет
B
?
Этот второй сценарий не очень веселый, когда A
все еще находится в стадии активной разработки.
Здесь есть лучшие практики?
источник
Ответы:
Используйте расширенные варианты реакторов Maven , а именно:
Так что просто
cd
в родительский каталог P и запустите:И это создаст B и модули, требуемые B.
Обратите внимание, что вам нужно использовать двоеточие, если вы ссылаетесь на имя,
artifactId
которое отличается от имени каталога:Как описано здесь: https://stackoverflow.com/a/26439938/480894
источник
mvn install -pl .,parent/child,parent/child/grandchild
запятую для разделения нескольких проектов и. для родителей помclean package
создать модуль таким способом, он не может разрешить зависимости реактора, которые еще не установлены. С-am
ним будут без необходимости перестраивать депы.Say Родитель pom.xml содержит 6 модулей , и вы хотите , чтобы запустить A , B и F .
1-CD в родительский проект
ИЛИ
ИЛИ
Примечание. Если вы укажете проект с параметром -am , Maven создаст все проекты, от которых зависит указанный проект (прямо или косвенно). Maven изучит список проектов и пройдет по дереву зависимостей, найдя все проекты, которые ему нужно построить.
В то время как команда -am делает все проекты, требуемые конкретным проектом, в многомодульной сборке, опция -amd или --also-make-dependents настраивает Maven для создания проекта и любого проекта, который зависит от этого проекта. При использовании --also-make-dependents Maven проверяет все проекты в нашем реакторе, чтобы найти проекты, которые зависят от конкретного проекта. Он будет автоматически строить эти проекты и ничего больше.
источник
Maven абсолютно был разработан для этого типа зависимости.
mvn package
не будет ничего устанавливать в вашем локальном репозитории, он просто упакует проект и оставит его в целевой папке.Выполните
mvn install
в родительском проекте (A), при этом все субмодули будут установлены в репозиторий Maven вашего компьютера, если нет никаких изменений, вам просто нужно скомпилировать / упаковать субмодуль (B), и Maven примет уже упакованный и установленные зависимости в самый раз.Вам просто нужно
mvn install
в родительском проекте, если вы обновили некоторую часть кода.источник
Если вы ранее запустили mvn install в проекте B, он будет установлен в вашем локальном хранилище, поэтому при сборке пакета A Maven может разрешить зависимость. Таким образом, до тех пор, пока вы устанавливаете проект B, каждый раз, когда вы меняете его, ваши сборки для проекта A будут обновляться.
Вы можете определить многомодульный проект с помощью агрегатора pom для создания набора проектов.
Также стоит упомянуть m2eclipse , он интегрирует Maven в Eclipse и позволяет (опционально) разрешать зависимости из рабочей области. Так что если вы взламываете несколько проектов, содержимое рабочей области будет использоваться для компиляции. Когда вы будете довольны своими изменениями, запустите mvn install (для каждого проекта по очереди или с помощью агрегатора), чтобы поместить их в локальный репозиторий.
источник
Взгляните на мой ответ Maven и зависимые модули .
Плагин Maven Реактор предназначен для решения строительной части проекта.
Конкретная цель, которую вы захотите использовать
reactor:make
.источник
Вы говорите, что «действительно просто хотите Б», но это неверно. Вы хотите B, но вы также хотите обновить A, если в него были внесены какие-либо изменения («активная разработка»).
Итак, иногда вы хотите работать с A, B и C. Для этого случая у вас есть проект-агрегатор P. Для случая, когда вы хотите работать с A и B (но не хотите C), вы должны создать проект-агрегатор Q ,
Edit 2016 : Вышеуказанная информация была бы уместной в 2009 году По состоянию на 2016 год , я настоятельно рекомендую игнорируя это в большинстве случаев, и просто с помощью
-am
или-pl
командной строки флагов , как описаны в общепринятом ответе. Если вы используете версию maven до v2.1, сначала измените ее :)источник