基于maven中多個(gè)子模塊的構(gòu)建順序
maven多個(gè)子模塊的構(gòu)建順序
在實(shí)際的項(xiàng)目開(kāi)發(fā)中,為了更好的組織項(xiàng)目代碼,會(huì)采用分層架構(gòu)的方式,這就會(huì)使用到maven的多模塊特性。
假設(shè)項(xiàng)目分為A、B、C、D四層,在父模塊的pom.xml中,一般這樣來(lái)對(duì)子模塊進(jìn)行聚合
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
<module>D</module>
</modules>
假設(shè)各個(gè)子模塊間,配置的相互依賴(lài)關(guān)系如下:
A 依賴(lài) B
B 依賴(lài) C
D 依賴(lài) A
構(gòu)建父模塊,我們能夠看到以下輸出:
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] C
[INFO] B
[INFO] A
[INFO] D
[INFO]
[INFO] ------------------------------------------------------------------------
這是因?yàn)樽幽K的構(gòu)建順序受兩個(gè)因素影響
- 1、父模塊中各子模塊的聲明次序
- 2、子模塊間的依賴(lài)關(guān)系
實(shí)際的構(gòu)建順序是這樣形成的
maven按照次序讀取pom,如果該pom沒(méi)有依賴(lài)其他子模塊,就構(gòu)建該模塊,否則就構(gòu)建其依賴(lài)的模塊,如果該依賴(lài)模塊還依賴(lài)于其他的模塊,那么就進(jìn)一步構(gòu)建依賴(lài)的依賴(lài)。
在示例中,A模塊依賴(lài)B,而B(niǎo)模塊又依賴(lài)C,因此要先構(gòu)建C,再構(gòu)建B,然后才能構(gòu)建A。而D依賴(lài)的模塊A已經(jīng)構(gòu)建了,因此直接構(gòu)建它。
模塊間的依賴(lài)關(guān)系會(huì)將反應(yīng)堆(Reactor)構(gòu)成一個(gè)有向非循環(huán)圖,各個(gè)模塊是該圖的節(jié)點(diǎn),依賴(lài)關(guān)系構(gòu)成了有向邊。這個(gè)圖不允許出現(xiàn)循環(huán)。如果A依賴(lài)B,B又依賴(lài)A,這樣就產(chǎn)生了循環(huán)依賴(lài),Maven會(huì)報(bào)錯(cuò)。
maven中的構(gòu)建
1.什么是構(gòu)建
構(gòu)建并不是創(chuàng)建,創(chuàng)建一個(gè)工程并不等于構(gòu)建一個(gè)項(xiàng)目。要了解構(gòu)建的含義我們應(yīng)該由淺入深的從 以下三個(gè)層面來(lái)看:
(1)純 Java 代碼 (編譯)
大家都知道,我們 Java 是一門(mén)編譯型語(yǔ)言,.java 擴(kuò)展名的源文件需要編譯成.class 擴(kuò)展名的字節(jié)碼 文件才能夠執(zhí)行。所以編寫(xiě)任何 Java 代碼想要執(zhí)行的話(huà)就必須經(jīng)過(guò)編譯得到對(duì)應(yīng)的.class 文件。
(2)Web 工程 (部署)
當(dāng)我們需要通過(guò)瀏覽器訪(fǎng)問(wèn) Java 程序時(shí)就必須將包含 Java 程序的 Web 工程編譯的結(jié)果“拿”到服務(wù) 器上的指定目錄下,并啟動(dòng)服務(wù)器才行。這個(gè)“拿”的過(guò)程我們叫部署。我們可以將未編譯的 Web 工程比喻為一只生的雞,編譯好的 Web 工程是一只煮熟的雞,編譯部署 的過(guò)程就是將雞燉熟。

注意: 開(kāi)發(fā)過(guò)程中使用路徑或配置文件中配置的類(lèi)路徑等都是以編譯結(jié)果的文件結(jié)構(gòu)為標(biāo)準(zhǔn)。
(3)實(shí)際項(xiàng)目
在實(shí)際項(xiàng)目中整合第三方框架,Web 工程中除了 Java 程序和 JSP 頁(yè)面、圖片等靜態(tài)資源之外,還 包括第三方框架的 jar 包以及各種各樣的配置文件。所有這些資源都必須按照正確的目錄結(jié)構(gòu)部署到服 務(wù)器上,項(xiàng)目才可以運(yùn)行。
所以綜上所述:構(gòu)建就是以我們編寫(xiě)的 Java 代碼、框架配置文件、國(guó)際化等其他資源文件、JSP 頁(yè) 面和圖片等靜態(tài)資源作為“原材料”,去“生產(chǎn)”出一個(gè)可以運(yùn)行的項(xiàng)目的過(guò)程。
2.構(gòu)建過(guò)程的幾個(gè)主要環(huán)節(jié)
- (1)清理:刪除以前的編譯結(jié)果,為重新編譯做好準(zhǔn)備。
- (2)編譯:將 Java 源程序編譯為字節(jié)碼文件。
- (3)測(cè)試:針對(duì)項(xiàng)目中的關(guān)鍵點(diǎn)進(jìn)行測(cè)試,確保項(xiàng)目在迭代開(kāi)發(fā)過(guò)程中關(guān)鍵點(diǎn)的正確性。
- (4)報(bào)告:在每一次測(cè)試后以標(biāo)準(zhǔn)的格式記錄和展示測(cè)試結(jié)果。
- (5)打包:將一個(gè)包含諸多文件的工程封裝為一個(gè)壓縮文件用于安裝或部署。Java 工程對(duì)應(yīng) jar 包,Web 工程對(duì)應(yīng) war 包。
- (6)安裝:在 Maven 環(huán)境下特指將打包的結(jié)果——jar 包或 war 包安裝到本地倉(cāng)庫(kù)中。
- (7)部署:將打包的結(jié)果部署到遠(yuǎn)程倉(cāng)庫(kù)或?qū)?war 包部署到服務(wù)器上運(yùn)行。
3.自動(dòng)化構(gòu)建
其實(shí)上述環(huán)節(jié)我們?cè)?Eclipse 中都可以找到對(duì)應(yīng)的操作,只是不太標(biāo)準(zhǔn)。那么既然 IDE 已經(jīng)可以進(jìn) 行構(gòu)建了我們?yōu)槭裁催€要使用 Maven 這樣的構(gòu)建工具呢?
我們來(lái)看一個(gè)小故事了解一下:
這是陽(yáng)光明媚的一天。托馬斯向往常一樣早早的來(lái)到了公司,沖好一杯咖啡,進(jìn)入了自己的郵箱——很 不幸,QA 小組發(fā)來(lái)了一封郵件,報(bào)告了他昨天提交的模塊的測(cè)試結(jié)果——有 BUG。“好吧,反正也不是第一 次”,托馬斯搖搖頭,進(jìn)入 IDE,運(yùn)行自己的程序,編譯、打包、部署到服務(wù)器上,然后按照郵件中的操作 路徑進(jìn)行測(cè)試?!班?,沒(méi)錯(cuò),這個(gè)地方確實(shí)有問(wèn)題”,托馬斯說(shuō)道。于是托馬斯開(kāi)始嘗試修復(fù)這個(gè) BUG,當(dāng)他 差不多有眉目的時(shí)候已經(jīng)到了午飯時(shí)間。 下午繼續(xù)工作。BUG 很快被修正了,接著托馬斯對(duì)模塊重新進(jìn)行了編譯、打包、部署,測(cè)試之后確認(rèn)沒(méi) 有問(wèn)題了,回復(fù)了 QA 小組的郵件。 一天就這樣過(guò)去了,明媚的陽(yáng)光化作了美麗的晚霞,托馬斯卻覺(jué)得生活并不像晚霞那樣美好啊。
讓我們來(lái)梳理一下托馬斯這一天中的工作內(nèi)容

從中我們發(fā)現(xiàn),托馬斯的很大一部分時(shí)間花在了“編譯、打包、部署、測(cè)試”這些程式化的工作上 面,而真正需要由“人”的智慧實(shí)現(xiàn)的分析問(wèn)題和編碼卻只占了很少一部分。

能否將這些程式化的工作交給機(jī)器自動(dòng)完成呢?——當(dāng)然可以!這就是自動(dòng)化構(gòu)建。

此時(shí) Maven 的意義就體現(xiàn)出來(lái)了,它可以自動(dòng)的從構(gòu)建過(guò)程的起點(diǎn)一直執(zhí)行到終點(diǎn):

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java如何用一個(gè)統(tǒng)一結(jié)構(gòu)接收成員名稱(chēng)不固定的數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Java如何用一個(gè)統(tǒng)一結(jié)構(gòu)接收成員名稱(chēng)不固定的數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
Java 中一個(gè)類(lèi)提供一個(gè)默認(rèn)對(duì)象的多種方法
這篇文章主要介紹了Java 中一個(gè)類(lèi)提供一個(gè)默認(rèn)對(duì)象的多種方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
java EasyExcel面向Excel文檔讀寫(xiě)邏輯示例詳解
這篇文章主要為大家介紹了java EasyExcel面向Excel文檔讀寫(xiě)邏輯示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
java.Net.UnknownHostException異常處理問(wèn)題解決
這篇文章主要介紹了java.Net.UnknownHostException異常處理方法,問(wèn)題原因是在系統(tǒng)的?/etc/Hostname中配置了主機(jī)名,而在/etc/hosts文件中沒(méi)有相應(yīng)的配置,本文給大家詳細(xì)講解,需要的朋友可以參考下2023-03-03
Java中WeakHashMap和HashMap的區(qū)別詳解
這篇文章主要介紹了Java中WeakHashMap和HashMap的區(qū)別詳解,WeakHashMap和HashMap一樣,WeakHashMap也是一個(gè)散列表,它存儲(chǔ)的內(nèi)容也是鍵值對(duì)(key-value)映射,而且鍵和值都可以為null,需要的朋友可以參考下2023-09-09
springboot自定義redis-starter的實(shí)現(xiàn)
這篇文章主要介紹了springboot自定義redis-starter的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java設(shè)計(jì)模式之動(dòng)態(tài)代理模式實(shí)例分析
這篇文章主要介紹了Java設(shè)計(jì)模式之動(dòng)態(tài)代理模式,結(jié)合實(shí)例形式分析了動(dòng)態(tài)代理模式的概念、功能、組成、定義與使用方法,需要的朋友可以參考下2018-04-04

