Maven 多模組管理
隨著專案的不斷髮展,需求的不斷細化與新增,程式碼越來越多,結構也越來越複雜,這時候就會遇到各種問題
-
不同方面的程式碼之間相互耦合,這時候一系統出現問題很難定位到問題的出現原因,即使定位到問題也很難修正問題,可能在修正問題的時候引入更多的問題。
-
多方面的程式碼集中在一個整體結構中,新入的開發者很難對整體專案有直觀的感受,增加了新手介入開發的成本,需要有一個熟悉整個專案的開發者維護整個專案的結構(通常在專案較大且開發時間較長時這是很難做到的)。
-
開發者對自己或者他人負責的程式碼邊界很模糊,這是複雜專案中最容易遇到的,導致的結果就是開發者很容易修改了他人負責的程式碼且程式碼負責人還不知道,責任追蹤很麻煩。
將一個複雜專案拆分成多個模組是解決上述問題的一個重要方法。 拆分的好處
- 多模組的劃分可以降低程式碼之間的耦合性(從類級別的耦合提升到jar包級別的耦合)
- 每個模組都可以是自解釋的(通過模組名或者模組檔案)
- 模組還規範了程式碼邊界的劃分,開發者很容易通過模組確定自己所負責的內容
- ...
模組拆分策略
推薦安照功能拆分,後期方便轉換成微服務架構
按職責劃分
- --module-test
- --module-test-service
- --module-test-po
- --module-test-controller
- --module-test-dao
- --module-test-common
- --module-test-util
按功能拆分
例如,在電商系統中如下module
- --module-test
- --module-test-common公共部分
- --module-test-order訂單
- --module-test-checkout購物車
- --module-test-pay支付
- --module-test-catory類目
- --module-test-product商品
- --module-test-price價格
- --module-test-account賬號
搭建多模組專案
搭建多模組專案,需要使用 maven 的繼承和聚合,其中聚合負責將多個模組集中在一起進行管理,繼承則負責各子模組中的公共配置
建立專案
我使用的是idea
刪掉src
pom檔案內容
建立子模組
在專案下建立子模組
套路與建立普通專案一致注意變化
module 的 pom 檔案發生了變化
新增了兩段配置
<packaging>pom</packaging>
<modules>
<module>module-util</module>
</modules>
複製程式碼
pom 是最簡單的打包型別。不像jar和war,它生成的構件只有它本身。將 packaging 申明為 pom 則意味著沒有程式碼需要測試或者編譯,也沒有資源需要處理。
由於我們使用了聚合,所以打包方式必須為pom,否則無法構建。
<modules>
<module>module-util</module>
</modules>
複製程式碼
module的值是子模組相對於當前 POM 的路徑。
再看子模組中的 pom
也是分成兩個部分
<parent>
<groupId>com.wqlm</groupId>
<artifactId>module</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>module-util</artifactId>
複製程式碼
<parent>
<groupId>com.wqlm</groupId>
<artifactId>module</artifactId>
<version>1.0-SNAPSHOT</version>
<!--<relativePath/>-->
</parent>
複製程式碼
宣告瞭該模組繼承自 com.wqlm:module:1.0-SNAPSHOT,其實這裡面還省略了
<relativePath></relativePath>
由於 relativePath 預設是 ../pom.xml
而我們的子專案確實在父專案的下一級目錄中,所以是可以不用填寫的
Maven首先在當前構建專案的環境中查詢父pom,然後專案所在的檔案系統查詢,然後是本地儲存庫,最後是遠端repo。
artifactId 是子模組的元件id,由於繼承了父pom,所以groupId、version 也可以不寫,不寫的話就預設繼承自父pom
使用多模組
如上所示,在建立多個模組之後,可以在父pom中新增公共配置,然後所有的子模組都會繼承這些配置。除此之外,還可以通用對子模組進行 編譯、打包、安裝... 操作
子模組間的依賴
如果子模組間相互依賴,需要在 dependency
中引入要依賴的子模組,如圖
上圖中子模組 module-common:1.0-SNAPSHOT 依賴了 module-util:1.0-SNAPSHOT。
子模組間的相互依賴,需要管理好依賴項的版本號,負責容易依賴版本衝突。
關於依賴項的版本管理,請參考 maven 依賴版本管理——depencyManagement
簡單來說就是把公共依賴及版本號在父 pom 中申明,子專案引入依賴時只需要指定 groupId、artifactId 不需要指定版本號
如下,先在父 pom 中申明依賴及版本號
再在子專案中引入依賴項,注意,不需要指定版本號,預設查詢父pom中定義的版本號