[英]Maven build parent before other modules
我有一個具有以下結構的 maven 項目
parent
-pom.xml
-module1
-pom.xml
-module2
-pom.xml
在父級中,我有一個帶有插件的配置文件,可以為所有子模塊遞歸執行。 但是當我構建項目時,我發現首先構建子模塊,最后構建父模塊。 但我希望相反的事情發生。 我希望插件首先為父模塊執行,然后為子模塊執行。 因為只有在父模塊中執行插件時,才會生成一個供子模塊使用的文件。 因此,如果子模塊首先構建,則由於文件丟失而跳過插件執行。
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)
我在A
上運行mvn
時的結果是:
[INFO] Reactor Build Order:
[INFO]
[INFO] C
[INFO] A
[INFO] B
如果一個模塊指定了一個父級(即使父級是反應器),父級將在模塊之前被處理。 鑒於評論中的澄清(您的模塊當前沒有父級),最簡單的解決方法可能是將reactor
添加為parent
。
然而,這可能會導致其他問題,並且上面的“注意事項”仍然有效。
我發現執行序列在 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)
在 Windows 中作為序列 C、A、B 執行,但在 ZEDC9310A5A5D474E87377 中作為序列 B、C、A 執行。 確實我不關心C什么時候打包,但問題是A和B的順序不同。當我使用插件“flatten-maven-plugin”時,在Linux中,它不會替換屬性${revision}項目 B,因為它是在項目 A 中定義的,但 A 是最后構建的。 因此 B 在嘗試解析 output "a-${revision}.pom" 的父級時將失敗。
當父模塊未首先構建時,我發布了可能的原因。
確保所有模塊都具有相同的父版本。
可能這可以幫助某人,因為似乎沒有簡單的方法來檢測這種情況。 唯一可見的效果是父模塊不是Reactor Build Order中的第一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.