在實際的項目開發中,為了更好的組織項目代碼,會采用分層架構的方式,這就會使用到maven的多模塊特性。
假設項目分為A、B、C、D四層,在父模塊的pom.xml中,一般這樣來對子模塊進行聚合
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
<module>D</module>
</modules>
假設各個子模塊間,配置的相互依賴關系如下:
A 依賴 B
B 依賴 C
D 依賴 A
構建父模塊,我們能夠看到以下輸出:
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] C
[INFO] B
[INFO] A
[INFO] D
[INFO]
[INFO] ------------------------------------------------------------------------
這是因為子模塊的構建順序受兩個因素影響:
1、父模塊中各子模塊的聲明次序
2、子模塊間的依賴關系
實際的構建順序是這樣形成的:
maven按照次序讀取pom,如果該pom沒有依賴其他子模塊,就構建該模塊,否則就構建其依賴的模塊,如果該依賴模塊還依賴於其他的模塊,那么就進一步構建依賴的依賴。
在示例中,A模塊依賴B,而B模塊又依賴C,因此要先構建C,再構建B,然后才能構建A。而D依賴的模塊A已經構建了,因此直接構建它。
模塊間的依賴關系會將反應堆(Reactor)構成一個有向非循環圖,各個模塊是該圖的節點,依賴關系構成了有向邊。這個圖不允許出現循環。如果A依賴B,B又依賴A,這樣就產生了循環依賴,Maven會報錯。