Maven создает родителя перед другими модулями

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

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

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


person Devika Sudheer    schedule 26.09.2019    source источник
comment
Пожалуйста, покажите файл журнала, потому что родитель является первым, который создается в начале... кстати: вы тестируете в простой командной строке? Какую версию Maven вы используете? JDK-версия?   -  person khmarbaise    schedule 26.09.2019
comment
jdk 1.8 и mvn 3.6.1   -  person Devika Sudheer    schedule 26.09.2019


Ответы (2)


Часто неправильно понимаемая концепция 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
comment
Согласно тому, что вы сказали, родительский модуль, на который я ссылался, является всего лишь агрегатором. У него нет собственного кода src. Поэтому я не могу использовать вышеуказанное решение. Я хочу сначала построить агрегатор, а затем детей. aggregator - pom.xml (where you have <modules>...<modules>) - module1 -pom.xml (no parent and not aggregator) - module2 -pom.xml (no parent and not aggregator) - person Devika Sudheer; 26.09.2019
comment
@DevikaSudheer Я обновил ответ. Надеюсь, это поможет. - person Milen Dyankov; 26.09.2019

Я обнаружил, что последовательность exec отличается в среде Windows или в среде Linux. Следующая структура

- 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)

выполняется как последовательность C, A, B в Windows, но как последовательность B, C, A в Linux. На самом деле мне все равно, когда C упакован, но проблема заключается в разнице в последовательности A и B. Когда я использую плагин «flatten-maven-plugin» в Linux, он не заменит свойство ${revision} в проект B, потому что он определен в проекте A, но A строится последним. Таким образом, B потерпит неудачу, поскольку он попытается разрешить своего родителя вывода "a-${revision}.pom".

person Joinow    schedule 18.06.2020