Maven 多模塊構(gòu)建
在之前的章節(jié)中,我們已經(jīng)學(xué)習(xí)了關(guān)于 Maven 的大部分知識。從本節(jié)開始,我們會通過開發(fā)一個小型項(xiàng)目來更好的理解之前的概念。在這一節(jié)中,我們首先要做的就是用 Maven 來構(gòu)建一個包含多個模塊的項(xiàng)目。
1. Project 和 Module
提到多模塊項(xiàng)目構(gòu)建,我們首先要弄明白 project 和 module 這兩個概念。
a. 相同點(diǎn):
- project 和 module 都是 Maven 工程,有屬于自己的 pom.xml。
b. 不同點(diǎn):
- module 工程必須要有父項(xiàng)目,一般情況下,project 工程在多模塊項(xiàng)目中都是作為父項(xiàng)目存在的;
- project 工程可以放到類似 tomcat 的容器中運(yùn)行,而 module 工程則不能;
簡單總結(jié)一下,project 工程包含的范圍更廣,單模塊項(xiàng)目中作為項(xiàng)目整體,多模塊項(xiàng)目中作為父模塊存在。module 工程在多模塊項(xiàng)目中作為子工程存在。
2. 開始創(chuàng)建項(xiàng)目
2.1 創(chuàng)建 project 工程
這里,我們結(jié)合市面上比較常用的開發(fā)工具 idea 來進(jìn)行演示,當(dāng)然,其他的開發(fā)工具也能夠得到相同的效果。
剛剛,我們也了解到多模塊項(xiàng)目必須要有 project 工程作為父項(xiàng)目存在,那么首先,我們就需要創(chuàng)建一個 project 工程。
打開 idea,選擇 File -> New -> Project
,在彈出的窗口左側(cè)選擇 Maven 并點(diǎn)擊 Next 按鈕。
在這里,需要填寫 project 的信息,包括 groupId,artifactId,version 信息,并點(diǎn)擊 Next 按鈕。
最后一步,只需要填寫項(xiàng)目名稱,然后點(diǎn)擊Finish按鈕即可。
由于是父項(xiàng)目,所以并不需要代碼,因此可以將 src 目錄直接刪掉。
至此,project 項(xiàng)目創(chuàng)建完成。
2.2 創(chuàng)建 module 工程
在創(chuàng)建好父工程之后,我們開始創(chuàng)建 module 工程。在父工程上點(diǎn)擊右鍵,選擇New -> Module
。
我們會發(fā)現(xiàn)跟剛剛創(chuàng)建 project 工程的步驟是一樣的,只不過其中有些已經(jīng)不需要我們來填寫了,例如 groupId,version 等,這里是因?yàn)榇嬖诟腹こ?,而子工程的這些元素節(jié)點(diǎn)都是繼承父工程的。所以我們只需要填寫子工程的 artifactId 即可。
這里我們分別創(chuàng)建 mall-account 工程,mall-commodity 工程,mall-order 工程,mall-delivery 工程,分別對應(yīng)商城系統(tǒng)的用戶模塊,商品模塊,訂單模塊以及物流模塊。
另外我們在單獨(dú)創(chuàng)建一個 mall-web 工程,主要的功能是作為各個模塊的整合并與前端頁面進(jìn)行對接。
在創(chuàng)建 mall-web 工程的時候,需要注意的是,我們要選擇一個maven-archetype-webapp
的模塊。然后點(diǎn)擊 Next 按鈕,進(jìn)入下一步。
后續(xù)操作和其他模塊沒有太大區(qū)別,按照實(shí)際情況選擇和填寫即可。
現(xiàn)在,整個項(xiàng)目已經(jīng)初具雛形了,我們來看一下現(xiàn)在項(xiàng)目的結(jié)構(gòu)。
2.3 添加依賴
注意:mall 項(xiàng)目為一個實(shí)例項(xiàng)目,中間可能會存在某些不太合理的地方,我們這里更多的關(guān)注項(xiàng)目構(gòu)建過程。
- mall-account 項(xiàng)目為用戶項(xiàng)目,需要被 mall-order 項(xiàng)目、mall-delivery 項(xiàng)目和 mall-web 項(xiàng)目依賴;
- mall-order 項(xiàng)目為訂單項(xiàng)目,需要被 mall-delivery 項(xiàng)目和 mall-web 項(xiàng)目依賴;
- mall-commodity 項(xiàng)目為商品項(xiàng)目,需要被 mall-web 模塊依賴;
- mall-delivery 項(xiàng)目為物流項(xiàng)目,需要被 mall-web 項(xiàng)目依賴。
我們首先在父工程 mall-aggregate 的 pom.xml 文件中,添加 dependencyManagement 節(jié)點(diǎn)元素。
<properties>
<junit.version>4.11</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.mic.tech</groupId>
<artifactId>mall-account</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mic.tech</groupId>
<artifactId>mall-commodity</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mic.tech</groupId>
<artifactId>mall-order</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mic.tech</groupId>
<artifactId>mall-delivery</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后,依次在各個子工程中,根據(jù)子項(xiàng)目之間的依賴關(guān)系,添加對應(yīng)的依賴。在添加完依賴之后,我們可以使用之前安裝過的 Maven Helper 插件來生成整個工程的依賴關(guān)系圖。
生成之后的依賴關(guān)系圖如下:
從這個圖中,我們可以清楚看到目前 mall 工程各個模塊直接的依賴關(guān)系。在實(shí)際的開發(fā)過程中,可以根據(jù)生成的依賴關(guān)系圖來判斷是否存在某些沒必要引入的依賴,進(jìn)行依賴優(yōu)化。
2.4 運(yùn)行這個項(xiàng)目
在項(xiàng)目創(chuàng)建好之后,我們就來運(yùn)行這個項(xiàng)目。在 idea 中點(diǎn)擊Add Configuration
按鈕。
在彈出的界面點(diǎn)擊小+號,然后選擇 Tomcat Server -> Local
。
在 Tomcat Server 界面的 Deployment 頁簽,點(diǎn)擊小+號,選擇Artifact… ,并在彈出的窗口中,選擇mallweb:war exploded
,并在Application context中輸入/index
,最后點(diǎn)擊OK按鈕。
點(diǎn)擊Add Configuration
旁邊的三角形按鈕,啟動項(xiàng)目,項(xiàng)目啟動后控制臺會輸出如下日志產(chǎn)生。
項(xiàng)目啟動成功后,我們在瀏覽器中輸入地址http://localhost:8080/index/
,可以看到項(xiàng)目的歡迎頁面。
至此,我們的項(xiàng)目已經(jīng)創(chuàng)建并啟動完成。
3. 構(gòu)建這個項(xiàng)目
有了之前章節(jié)的鋪墊,項(xiàng)目構(gòu)建就變得非常容易了。
我們將目錄切換到 mall-aggregate 目錄下,執(zhí)行 mvn clean install
命令,就可以得到如下執(zhí)行結(jié)果。
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.mic.tech:mall-web:war:1.0.0-SNAPSHOT
[WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: junit:junit:jar -> duplicate declaration of version (?) @ line 46, column 17
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] mall-aggregate [pom]
[INFO] mall-account [jar]
[INFO] mall-commodity [jar]
[INFO] mall-order [jar]
[INFO] mall-delivery [jar]
[INFO] mall-web Maven Webapp [war]
[INFO]
[INFO] --------------------< com.mic.tech:mall-aggregate >---------------------
[INFO] Building mall-aggregate 1.0.0-SNAPSHOT [1/6]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] ...
[INFO] ---------------------< com.mic.tech:mall-account >----------------------
[INFO] Building mall-account 1.0.0-SNAPSHOT [2/6]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ...
[INFO] --------------------< com.mic.tech:mall-commodity >---------------------
[INFO] Building mall-commodity 1.0.0-SNAPSHOT [3/6]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ...
[INFO] ----------------------< com.mic.tech:mall-order >-----------------------
[INFO] Building mall-order 1.0.0-SNAPSHOT [4/6]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ...
[INFO] ---------------------< com.mic.tech:mall-delivery >---------------------
[INFO] Building mall-delivery 1.0.0-SNAPSHOT [5/6]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ...
[INFO] -----------------------< com.mic.tech:mall-web >------------------------
[INFO] Building mall-web Maven Webapp 1.0.0-SNAPSHOT [6/6]
[INFO] --------------------------------[ war ]---------------------------------
[INFO] ...
[INFO] Building war: D:\code\mall-aggregate\mall-web\target\mall-web.war
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for mall-aggregate 1.0.0-SNAPSHOT:
[INFO]
[INFO] mall-aggregate ..................................... SUCCESS [ 0.897 s]
[INFO] mall-account ....................................... SUCCESS [ 2.173 s]
[INFO] mall-commodity ..................................... SUCCESS [ 0.191 s]
[INFO] mall-order ......................................... SUCCESS [ 0.192 s]
[INFO] mall-delivery ...................................... SUCCESS [ 0.148 s]
[INFO] mall-web Maven Webapp .............................. SUCCESS [ 3.331 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.154 s
[INFO] Finished at: 2020-05-09T22:55:42+08:00
[INFO] ------------------------------------------------------------------------
4. 小結(jié)
在本章節(jié)中,我們完成了 mall 工程的搭建,運(yùn)行,構(gòu)建的整個過程,本節(jié)中并沒有太多新的內(nèi)容,都是基于之前章節(jié)的內(nèi)容,進(jìn)行整合,后續(xù)的章節(jié)也會使用這個示例項(xiàng)目來進(jìn)行講解。