Maven - пропустить сборку родительского проекта - PullRequest
18 голосов
/ 01 октября 2009

Я знаю, что тонна mauvais дважды спросить за один день, но вот еще одна загадка Maven:

У меня есть родительский POM, который определяет 5 модулей (5 подпроектов). Поскольку каждый модуль выполняется точно так же, я извлекаю секцию <profile><build> в родительский POM, чтобы избавиться от дубликата кода. Теперь - если я выполняю сборку отдельно из каждого модуля, это работает, однако, если я хочу собрать все модули сразу и перейти в родительский каталог, я получаю сообщение об ошибке, поскольку первое, что Maven пытается выполнить, - это сам родительский проект:

mvn package -P release
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   DWD Parent project
[INFO]   Projects

После этого сборка завершается неудачно, потому что плагин exec пытается выполнить то, чего там нет. Глядя на вывод, довольно очевидно, что плагин реактора управляет сборкой, но как я могу настроить реактор, чтобы пропустить родительский модуль?

P.S. Чтобы избежать путаницы - я пытаюсь подавить выполнение профиля на родительском и включить его на дочернем при same build

Ответы [ 5 ]

14 голосов
/ 01 октября 2009

Вы не можете пропустить родительскую сборку, но вы можете настроить профиль так, чтобы он не активировался с небольшим взломом. Этот ответ показывает, как управлять активацией профиля по наличию или отсутствию элемента <activation> на основе файла. Таким образом, вы можете определить профиль в родительском элементе, но деактивировать его в этом проекте из-за наличия файла маркера в родительском элементе. Дочерние проекты не будут иметь файл маркера в своем источнике, поэтому профиль будет активирован для этих проектов.

Обновление, чтобы уточнить: В моем тестовом проекте эта конфигурация означает, что профиль деактивирован в родительском проекте (у которого есть файл в src / main / resources), но активирован во всех дочерних проектах, у которых нет файла в их ресурсах. каталоги.

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>
10 голосов
/ 01 октября 2009

Что плохого в построении родителя?

На самом деле, в Maven есть два разных понятия (которые обычно используются одновременно):

  • родитель POM
  • Модули агрегации

Первый - это определение всего, что является общим для всех детей. Вы определяете родителя как упакованный в pom проект и можете установить его в своем хранилище.

Когда вы создаете дочерний элемент этого родителя, Maven2 извлекает этот родительский элемент для объединения родительского pom с дочерним pom. Вы можете просмотреть весь файл pom.xml, выполнив команду mvn help:effective-pom.

В этом случае родительский pom не будет построен, он будет просто извлечен из хранилища.

Второй случай - это проект, который содержит modules список подпроектов. Принцип заключается в том, что каждая команда, которую вы запускаете в этом проекте, будет также выполняться на всех подмодулях. Порядок модулей будет определяться Reactor, который будет проверять зависимости между модулями, чтобы определить, какой модуль должен быть построен раньше других. Если нет никаких зависимостей, тогда он возьмет список модулей, как они определены в родительском pom.xml.

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

<Ч />

Редактировать, благодаря комментарию RichSeller

Полное объяснение различий между несколькими модулями (проект агрегации) и наследованием (родительский проект) можно найти в книге Maven, здесь .

4 голосов
/ 02 октября 2009

Я хочу документально подтвердить, что в моей ситуации есть частичный компромисс (спасибо парням из списка рассылки пользователей maven за предложение). В основном вам нужно нарезать профиль на две части. Повторно используемая часть плагина configuration отправляется в родительский POM, а executions остается в дочернем POM. Тогда плагин профиля в дочернем файле помечается как inherited и вуаля - во время выполнения родительский профиль не выполняется, так как отсутствует раздел executions. Это далеко от идеала, но это работает. См. по этой ссылке , например

2 голосов
/ 06 октября 2009

Мне не удалось реализовать «отсутствующее» решение для файлов, как предоставлено Риком Продавцом выше. Кажется, что однажды установленное активное / неактивное состояние профиля не будет изменено, даже если файл маркера отсутствует в модуле (ах). Однако вот точное решение моей проблемы. Предупреждение: это доступно только начиная с Maven 2.1 +

Если у меня есть родительский POM с двумя определенными модулями: foo и boo, то в обычных условиях порядок выполнения будет:

  1. родитель
  2. Foo
  3. бух

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

mvn install –rf foo

В качестве альтернативы вы можете использовать --resume-from Что он будет делать, это пропустить родительский и перейти от модуля foo вниз. Сейчас - я выясняю, можно ли это сделать, настроив плагин Reactor (P.S. - нет, не может) , но даже с переключателем приведенный выше сценарий отлично работает для меня

1 голос
/ 25 июля 2011

Это подразумевается ответом @ romaintaz на тот же вопрос, Maven - пропустить сборку родительского проекта

, но чтобы сделать это явно, в родительском pom необходимо указать элемент упаковки как pom (а не jar или war).
Пример:

<packaging>pom</packaging>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...