Подтвердить что ты не робот

Maven - пропустить родительский проект

Я знаю его mauvais ton, чтобы спросить дважды за один день, но вот еще одна головоломка 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

4b9b3361

Ответ 1

Что не так, создав родителя?

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

  • Родительский POM
  • Агрегирование модулей

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

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

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

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

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


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

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

Ответ 2

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

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

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>

Ответ 3

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

Ответ 4

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

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

  • родительскими
  • Foo
  • бух

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

mvn install –rf foo

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

Ответ 5

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

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

<packaging>pom</packaging>