讀古今文學網 > Maven實戰 > 8.6.1 反應堆的構建順序 >

8.6.1 反應堆的構建順序

本節仍然以賬戶註冊服務為例來解釋反應堆。首先,為了能更清楚地解釋反應堆的構建順序,將account-aggregator的聚合配置修改如下:

修改完畢之後構建account-aggregator會看到如下的輸出:

上述輸出告訴了我們反應堆的構建順序,它們依次為account-aggregator、account-parent、account-email和account-persist。我們知道,如果按順序讀取POM文件,首先應該讀到的是account-aggregator的POM,實際情況與預料的一致,可是接下來幾個模塊的構建次序顯然與它們在聚合模塊中的聲明順序不一致,account-parent跑到了account-email前面,這是為什麼呢?為了解釋這一現象,先看圖8-4。

圖8-4 賬戶註冊服務4模塊的反應堆

圖8-4中從上至下的箭頭表示POM的讀取次序,但這不足以決定反應堆的構建順序,Maven還需要考慮模塊之間的繼承和依賴關係,圖中的有向虛連接線表示模塊之間的繼承或者依賴(本章以下內容使用依賴泛指這種模塊間的依賴或繼承關係),該例中account-email和account-persist依賴於account-parent,那麼account-parent就必須先於另外兩個模塊構建。也就是說,這裡還有一個從右向左的箭頭。實際的構建順序是這樣形成的:Maven按序讀取POM,如果該POM沒有依賴模塊,那麼就構建該模塊,否則就先構建其依賴模塊,如果該依賴還依賴於其他模塊,則進一步先構建依賴的依賴。該例中,account-aggregator沒有依賴模塊,因此先構建它,接著到account-email,它依賴於account-parent模塊,必須先構建account-parent,然後再構建account-email,最後到account-persist的時候,由於其依賴模塊已經被構建,因此直接構建它。

模塊間的依賴關係會將反應堆構成一個有向非循環圖(Directed Acyclic Graph,DAG),各個模塊是該圖的節點,依賴關係構成了有向邊。這個圖不允許出現循環,因此,當出現模塊A依賴於B,而B又依賴於A的情況時,Maven就會報錯。