簡體   English   中英

Maven 在其他模塊之前構建父級

[英]Maven build parent before other modules

我有一個具有以下結構的 maven 項目

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

在父級中,我有一個帶有插件的配置文件,可以為所有子模塊遞歸執行。 但是當我構建項目時,我發現首先構建子模塊,最后構建父模塊。 但我希望相反的事情發生。 我希望插件首先為父模塊執行,然后為子模塊執行。 因為只有在父模塊中執行插件時,才會生成一個供子模塊使用的文件。 因此,如果子模塊首先構建,則由於文件丟失而跳過插件執行。

Maven 中一個經常被誤解的概念是parentaggregator之間的區別。 這篇文章對它有更多的了解。 實際上,通常同一個項目同時扮演parent級和aggregator的角色,我認為這也是你的情況。

如果是這樣,您不能指望aggregator “首先執行”,因為它的整個“執行”基本上都歸結為執行子模塊。

在您的情況下可能有幫助的是將parentaggregator分開。 所以你會有這樣的結構:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM