[英]Build order of Maven multimodule project?
情況是,我有兩個結構相同的 Maven 多模塊項目:
Parent - Module 1 - Module 2
當我構建項目 1 時,我看到先構建父項(順序為parent->module1->module2 )。 但是對於項目 2,父級是最后構建的(順序是module1->module2->parent )。 為什么這兩個項目有不同的構建順序? 此外,如何手動控制構建順序?
更新 1:
兩個父項目都是沒有源代碼的簡單 POM 項目,所以我無法按照依賴關系圖解釋構建順序。
更新 2:
除了 GAV 和子模塊名稱外,父 POM 是相同的:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>parent-group-id</groupId> <artifactId>parent-artifact-id</artifactId> <version>parent-version</version> <packaging>pom</packaging> <name>parent-name</name> <modules> <module>module-1</module> <module>module-2</module> </modules> </project>
構建順序由 Maven 反應堆確定,這是一種通過對項目進行排序自動確保多模塊構建的正確構建順序的機制。
有關其工作原理,請參閱官方文檔。
它說:
對項目進行排序時,將遵循以下關系:
- 項目依賴於構建中的另一個模塊
- 插件聲明,其中插件是構建中的另一個模塊
- 插件依賴於構建中的另一個模塊
- 構建中另一個模塊的構建擴展聲明
- 元素中聲明的順序(如果沒有其他規則適用)
您無法手動控制構建順序。 如果要更改順序,則必須對影響反應器排序順序的項目進行更改。
在高層次上,構建順序基於模塊依賴圖的拓撲排序。
編輯:你的問題。 我知道項目 1 包含兩個模塊,項目 2 也包含兩個模塊。但是項目 2 中的模塊是否明確將“父”pom 聲明為父? 我在想,也許您的項目 1 模塊明確聲明了父 pom,而項目 2 模塊沒有。 這意味着項目 2“父”根本不是真正的父,因此不必在模塊之前構建。 無論如何,那是我的猜測。
我最近在使用 CentOS 7 時遇到了這個問題。我將 Maven 從 3.0.5 更新到 3.5.3,問題已經解決。 如果有人也有這個問題,您可以先嘗試這樣做。
概括
為什么?
Maven 使用<module>
聲明來確定要包含在當前運行中的模塊列表。 Maven 使用<parent>
聲明為每個包含的模塊生成有效的 POM,然后用於執行該模塊的構建。
在項目 1中, module1
和module2
中的每一個都在<parent>
部分中指定parent
模塊。 在項目 2中, module1
和module2
都沒有在<parent>
部分指定parent
模塊。
如何手動控制構建順序?
通過更改模塊之間的依賴關系,包括<parent>
、 <dependencies>
、插件依賴等,如官方文檔所述。
另請查看POM 簡介以了解有關聚合和繼承的討論。
細節
Maven 中模塊關系有聚合( <module>
聲明)和繼承( <parent>
聲明)4 種可能的場景。
假設一個模塊A
包裝了pom
和一個模塊B
(包裝無關緊要)。 模塊A
可以是父級或聚合器。 模塊B
可以將A
引用為父項,也可以不引用。
情況1:
A
和B
都不相互引用 - 模塊是獨立的。 Maven無法控制構建順序,每個模塊獨立構建,手動構建順序控制。
案例二:
模塊A
在<modules>
中包含模塊B
模塊B
沒有將A
聲明為父級。 在這種情況下,模塊A
是模塊B
的聚合器。
mvn -f A/pom.xml
將首先構建B
,然后A
。mvn -f B/pom.xml
將只構建B
案例三:
模塊A
在<modules>
中包含模塊B
模塊B
將A
聲明為父級。 在這種情況下,模塊A
既是模塊B
的父級又是聚合器(反應器)。
mvn -f A/pom.xml
將首先構建A
,然后構建B
。mvn -f B/pom.xml
將僅構建B
,但將使用A
的 POM 通過從本地存儲庫或遵循/project/parent/relativePath
解析它來生成B
的有效 POM。案例四:
模塊A
不包含<modules>
中的模塊B
模塊B
將A
聲明為父級。 在這種情況下,模塊A
是模塊B
的父級。
mvn -f A/pom.xml
將只構建A
mvn -f B/pom.xml
將僅構建B
,但將使用A
的 POM 通過從本地存儲庫或遵循/project/parent/relativePath
解析它來生成B
的有效 POM。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.