Часто неправильно понимаемая концепция 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
.
Однако это может привести к другим проблемам, и приведенные выше «о чем следует помнить» остаются в силе.
person
Milen Dyankov
schedule
26.09.2019