讀古今文學網 > Maven實戰 > 8.4 聚合與繼承的關係 >

8.4 聚合與繼承的關係

基於前面三節的內容,讀者可以瞭解到,多模塊Maven項目中的聚合與繼承其實是兩個概念,其目的完全是不同的。前者主要是為了方便快速構建項目,後者主要是為了消除重複配置。

對於聚合模塊來說,它知道有哪些被聚合的模塊,但那些被聚合的模塊不知道這個聚合模塊的存在。

對於繼承關係的父POM來說,它不知道有哪些子模塊繼承於它,但那些子模塊都必須知道自己的父POM是什麼。

如果非要說這兩個特性的共同點,那麼可以看到,聚合POM與繼承關係中的父POM的packaging都必須是pom,同時,聚合模塊與繼承關係中的父模塊除了POM之外都沒有實際的內容,如圖8-3所示。

圖8-3 聚合關係與繼承關係的比較

在現有的實際項目中,讀者往往會發現一個POM既是聚合POM,又是父POM,這麼做主要是為了方便。一般來說,融合使用聚合與繼承也沒有什麼問題,例如可以將account-aggregator和account-parent合併成一個新的account-parent,其POM見代碼清單8-21。

代碼清單8-21 合併聚合和繼承功能後的account-parent

在代碼清單8-21中可以看到,該POM的打包方式為pom,它包含了一個modules元素,表示用來聚合account-persist和account-email兩個模塊,它還包含了properties、dependencyManagement和pluginManagement元素供子模塊繼承。

相應地,account-email和account-persist的POM配置也要做微小的修改。本來account-parent和它們位於同級目錄,因此需要使用值為../account-parent/pom.xml的relativePath元素。現在新的account-parent在上一層目錄,這是Maven默認能識別的父模塊位置,因此不再需要配置relativePath,見代碼清單8-22。

代碼清單8-22 當父模塊在上級目錄時不再需要relativePath