Maven сборка родительского перед другими модулями - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть проект maven со следующей структурой

parent
  -pom.xml
  -module1
     -pom.xml
  -module2
     -pom.xml

В родительском у меня есть профиль с плагином, который будет выполняться рекурсивно для всех дочерних модулей.Но когда я строил проект, я обнаружил, что сначала создаются дочерние модули и, наконец, родительские.Но я хочу, чтобы произошло обратное.Я хочу, чтобы плагин выполнялся сначала для родительских, а затем для дочерних модулей.Потому что только когда плагин выполняется в родительском, будет создан файл, который должен использоваться дочерними модулями.Так что, если дочерние модули собираются сначала, то выполнение плагина пропускается, так как файл отсутствует.

1 Ответ

1 голос
/ 26 сентября 2019

В Maven часто ошибочно понимают концепцию, которая заключается в разнице между parent и aggregator. Эта статья проливает свет на это.В действительности часто один и тот же проект играет роль parent и aggregator, что, как я полагаю, также является вашим случаем.

Если это так, вы не можете ожидать, что aggregator "будет выполнен первым", поскольку его "выполнение" в основном сводится к выполнению субмодулей.

Что может помочь в вашем случае, это отделить parent от aggregator.Таким образом, у вас будет такая структура:

aggregator
  - pom.xml (where you have <modules>...<modules>)
  - parent
     -pom.xml (no parent)
  - module1
     -pom.xml (parent is `parent` and not `aggregator`)
  - module2
     -pom.xml (parent is `parent` and not `aggregator`)

Таким образом, вы можете поместить parent в качестве первого модуля в вашем <modules>...<modules>, и он может сгенерировать файл до сборки других модулей.

Имейте в виду:

  • Это будет работать только при выполнении сборки реактора (агрегатора).Это не будет работать, если вы создадите отдельные модули, так как это не вызовет родительскую сборку.
  • Родительско-дочерние отношения, вероятно, не лучший способ решить эту проблему.Рассмотрите возможность преобразования родительского объекта в обычный проект, который создает артефакт, и поместите в него сгенерированный файл.Затем добавьте этот проект в качестве зависимости в модули и заставьте плагин использовать файл из зависимого артефакта.Таким образом, вы также решите ранее упомянутую проблему.

ОБНОВЛЕНИЕ:

Похоже, что что-то изменилось в Maven или, возможно, я помню это неправильно.Я сделал быструю проверку (Maven 3.5.0) со следующей структурой

- project A 
 - pom.xml (type pom, has <modules><module>B</module><module>C</module></modules>)
 - project B
   - pom.xml (has parent A)
 - project C
   - pom.xml (no parent)

, когда я запускаю mvn на A:

[INFO] Reactor Build Order:
[INFO]
[INFO] C
[INFO] A
[INFO] B

если модуль указывает родителя (даже если родитель является реактором), родитель будет обработан перед модулем.Учитывая пояснение в комментарии (что ваши модули в настоящее время не имеют родителя), вероятно, самое простое решение - добавить reactor как parent.

Это, однако, может привести к другим проблемам, и «вещи, которые нужно иметь в виду» выше, остаются в силе.

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