介紹
Maven多模塊項目,適用於一些比較大的項目,通過合理項目拆分,實現代碼的複用,便於維護的管理,尤其是一些開源的框架,也是採用多模塊的方式,提供插件集成,用戶可以根據配置指定的模塊。
拆分規則
業務模塊拆分
按層拆分
聚合、繼承
1>聚合
我們在開發過程中,創建了2個以上的模塊,每個模塊都是一個獨立的maven project,在開始的時候我們可以獨立的編譯和測試運行每個模塊,但是隨着項目的不斷變大和複雜化,我們期望能夠使用簡單的操作來完成編譯等工作,這時Maven給出了聚合的配置方式。
所謂聚合,顧名思義,就是把多個模塊或項目聚合到一起,我們可以建立一個專門負責聚合工作的Maven 工程。
建立該project的時候,我們要注意以下幾點:
- 聚合模塊本身也做爲一個Maven項目,它必須有自己的POM
- 它的打包方式必須爲: pom
- 引入了新的元素:modules—module
- 版本:聚合模塊的版本和被聚合模塊版本一致
- 相對目錄:每個module的值都是一個當前POM的相對目錄
- 目錄名稱:爲了方便的快速定位內容,模塊所處的目錄應當與其artifactId一致(Maven約定而不是硬性要求),總之,模塊所處的目錄必須和模塊所處的目錄相一致。
- 習慣約定:爲了方便構建,通常將聚合模塊放在項目目錄層的最頂層,其它聚合模塊作爲子目錄存在。這樣當我們打開項目的時候,第一個看到的就是聚合模塊的POM
- 聚合模塊減少的內容:聚合模塊的內容僅僅是一個pom.xml文件,它不包含src/main/Java、src/test/java等目錄,因爲它只是用來幫助其它模塊構建的工具,本身並沒有實質的內容。
- 聚合模塊和子模塊的目錄:他們可以是父子類,也可以是平行結構,當然如果使用平行結構,那麼聚合模塊的POM也需要做出相應的更改。
2>繼承
我們在項目開發的過程中,可能多個模塊獨立開發,但是多個模塊可能依賴相同的元素,比如說每個模塊都需要Junit,使用spring的時候,其核心jar也必須都被引入,在編譯的時候,maven-compiler-plugin插件也要被引入。這時我們採用繼承,就不用在每個子模塊分別定義了。
如何配置繼承
- 說到繼承肯定是一個父子結構,那麼我們在父工程中來創建一個parent project
- : 作爲父模塊的POM,其打包類型也必須爲POM
- 結構:父模塊只是爲了幫助我們消除重複,所以它也不需要src/main/java、src/test/java等目錄
- 新的元素: , 它是被用在子模塊中的
- parent>元素的屬性:: 表示父模塊POM的相對路徑,在構建的時候,Maven會先根據relativePath檢查父POM,如果找不到,再從本地倉庫查找
- relativePath的默認值: …/pom.xml
- 子模塊省略groupId和version: 使用了繼承的子模塊中可以不聲明groupId和version, 子模塊將隱式的繼承父模塊的這兩個元素
3>聚合與繼承的區別
聚合和繼承通常是結合使用的,但是其作用是不同的。聚合是將多個模塊的工程匯聚到一起,而繼承則是指明某個模塊工程要繼承另一個模塊功能。
pom、war、jar類型的使用
1. pom工程:用在父級工程或聚合工程中。用來做jar包的版本控制。
是整個項目的父工程,它是一個pom工程。用來做整個項目的版本控制,也就是項目中所有要使用到的jar包的版本都集中由父工程管理。這樣你在寫其他工程pom文件中maven依賴時就不需要寫版本號了。當然所有的項目都要先繼承它纔行。
2. war工程:將會打包成war,發佈在服務器上的工程。如網站或服務。
這些工程都是要部署在服務器上的,所以要打包成war形式。這些工程有的是用戶通過瀏覽器直接訪問,有的是通過發佈服務被別的工程調用。
3. jar工程:將會打包成jar用作jar包使用。
這個就是打包成jar的工程。它就是存放一些其他工程都會使用的類,工具類。我們可以在其他工程的pom文件中去引用它,和引用別的jar包沒什麼區別。
如何依賴
- DepencyManagement應用場景
當我們的項目模塊很多的時候,我們使用Maven管理項目非常方便,幫助我們管理構建、文檔、報告、依賴、scms、發佈、分發的方法。可以方便的編譯代碼、進行依賴管理、管理二進制庫等等。由於我們的模塊很多,所以我們又抽象了一層,抽出一個itoo-base-parent來管理子項目的公共的依賴。爲了項目的正確運行,必須讓所有的子項目使用依賴項的統一版本,必須確保應用的各個項目的依賴項和版本一致,才能保證測試的和發佈的是相同的結果。在我們項目頂層的POM文件中,我們會看到dependencyManagement元素。通過它元素來管理jar包的版本,讓子項目中引用一個依賴而不用顯示的列出版本號。Maven會沿着父子層次向上走,直到找到一個擁有dependencyManagement元素的項目,然後它就會使用在這個dependencyManagement元素中指定的版本號。 - Dependencies
相對於dependencyManagement,所有生命在dependencies裏的依賴都會自動引入,並默認被所有的子項目繼承
3、區別
dependencies即使在子項目中不寫該依賴項,那麼子項目仍然會從父項目中繼承該依賴項(全部繼承)dependencyManagement裏只是聲明依賴,並不實現引入,因此子項目需要顯示的聲明需要用的依賴。如果不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,並且沒有指定具體版本,纔會從父項目中繼承該項,並且version和scope都讀取自父pom;另外如果子項目中指定了版本號,那麼會使用子項目中指定的jar版本。