隨着項目的不斷髮展,需求的不斷細化與添加,代碼愈來愈多,結構也愈來愈複雜,這時候就會遇到各類問題bash
不一樣方面的代碼之間相互耦合,這時候一系統出現問題很難定位到問題的出現緣由,即便定位到問題也很難修正問題,可能在修正問題的時候引入更多的問題。架構
多方面的代碼集中在一個總體結構中,新入的開發者很難對總體項目有直觀的感覺,增長了新手介入開發的成本,須要有一個熟悉整個項目的開發者維護整個項目的結構(一般在項目較大且開發時間較長時這是很難作到的)。maven
開發者對本身或者他人負責的代碼邊界很模糊,這是複雜項目中最容易遇到的,致使的結果就是開發者很容易修改了他人負責的代碼且代碼負責人還不知道,責任追蹤很麻煩。ide
將一個複雜項目拆分紅多個模塊是解決上述問題的一個重要方法。 拆分的好處微服務
推薦安照功能拆分,後期方便轉換成微服務架構post
例如,在電商系統中以下module測試
搭建多模塊項目,須要使用 maven 的繼承和聚合,其中聚合負責將多個模塊集中在一塊兒進行管理,繼承則負責各子模塊中的公共配置idea
我使用的是ideaspa
刪掉srccode
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 dependencyManagement**。 在父pom中加入 dependencyManagement
而後子模塊中引用時,就能夠不帶版本號了 只要因此子模塊都經過這種方式來引用其餘子模塊,那麼在子模塊的版本就都是父項目中定義都版本關於 maven dependencyManagement 詳情請參考 maven 依賴版本管理——depencyManagement