В 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
.
Это, однако, может привести к другим проблемам, и «вещи, которые нужно иметь в виду» выше, остаются в силе.