??第一篇Maven的介紹中提到說,Maven是一款非常強(qiáng)大的項(xiàng)目管理工具。其實(shí)他的最主要的兩個(gè)功能就是項(xiàng)目管理和構(gòu)建項(xiàng)目。
??所以Maven也可以這樣介紹,Maven 是 Apache 軟件基金會(huì)組織維護(hù)的一款自動(dòng)化構(gòu)建工具,專注服務(wù)于 Java 平臺(tái)的項(xiàng)目構(gòu)建和依賴管理。
這里再次重點(diǎn)說一下Maven的項(xiàng)目構(gòu)建。
1、什么是構(gòu)建
??構(gòu)建并不是創(chuàng)建,創(chuàng)建一個(gè)項(xiàng)目并不等于構(gòu)建一個(gè)項(xiàng)目。要了解構(gòu)建的含義我們應(yīng)該從以下三個(gè)層面來看:
編譯
??大家都知道,我們 Java 是一門編譯型語言,.java 擴(kuò)展名的源文件需要編譯成.class 擴(kuò)展名的字節(jié)碼文件才能夠執(zhí)行。所以編寫任何 Java 代碼想要執(zhí)行的話就必須經(jīng)過編譯得到對(duì)應(yīng)的.class 文件。部署
??當(dāng)我們需要通過瀏覽器訪問 Java 程序時(shí)就必須將包含 Java 程序的 Web 工程編譯的結(jié)果“拿”到服務(wù)器上的指定目錄下,并啟動(dòng)服務(wù)器才行。這個(gè)“拿”的過程我們叫部署。
??我們可以將未編譯的 Web 工程比喻為一只生的雞,編譯好的 Web 工程是一只煮熟的雞,編譯部署的過程就是將雞燉熟。
????生的雞——>處理——>熟的雞
????動(dòng)態(tài)Web工程——>編譯、部署——>編譯結(jié)果
- 構(gòu)建過程
??在實(shí)際項(xiàng)目中整合第三方框架,Web 工程中除了 Java 程序和 JSP 頁面、圖片等靜態(tài)資源之外,還包括第三方框架的 jar 包以及各種各樣的配置文件。所有這些資源都必須按照正確的目錄結(jié)構(gòu)部署到服務(wù)器上,項(xiàng)目才可以運(yùn)行。
所以綜上所述:構(gòu)建就是以我們編寫的 Java 代碼、框架配置文件、國(guó)際化等其他資源文件、JSP 頁面和圖片等靜態(tài)資源作為“原材料”,去“生產(chǎn)”出一個(gè)可以運(yùn)行的項(xiàng)目的過程。
2、Web 工程和其構(gòu)建結(jié)果的目錄結(jié)構(gòu)對(duì)比
??見下圖:

說明:
編譯:在web項(xiàng)目還沒有編譯的時(shí)候,是沒有classes目錄里邊的內(nèi)容,在src目錄里邊的內(nèi)容編譯之后,生成的.class文件都在classes目錄里。
數(shù)字對(duì)應(yīng)圖中的數(shù)字
1:web工程的名稱,編譯之后就是訪問路徑的根目錄。
2:把web項(xiàng)目構(gòu)建后,編譯好的文件放入了構(gòu)建好項(xiàng)目的WEB-INF目錄里。
3:web項(xiàng)目中的WebContent目錄結(jié)構(gòu),就是構(gòu)建后項(xiàng)目的整體目錄。
??當(dāng)我們?cè)L問項(xiàng)目的時(shí)候,不是根據(jù)web工程的目錄結(jié)構(gòu)訪問,而是根據(jù)構(gòu)建好之后的工程目錄進(jìn)行訪問,和資源的獲取。
3、構(gòu)建過程的幾個(gè)主要環(huán)節(jié)
- 清理:將以前編譯得到的舊的class字節(jié)碼文件刪除,為重新編譯做好準(zhǔn)備。
- 編譯:將 Java 源程序編譯為class字節(jié)碼文件。
- 測(cè)試:針對(duì)項(xiàng)目中的關(guān)鍵點(diǎn)進(jìn)行測(cè)試,確保項(xiàng)目在迭代開發(fā)過程中關(guān)鍵點(diǎn)的正確性。(讓maven自動(dòng)的去調(diào)用測(cè)試的程序)
- 報(bào)告:在每一次測(cè)試后以標(biāo)準(zhǔn)的格式記錄和展示測(cè)試結(jié)果。(測(cè)試程序執(zhí)行的結(jié)果)
- 打包:將一個(gè)包含諸多文件的工程封裝為一個(gè)壓縮文件用于安裝或部署。Java 工程對(duì)應(yīng) jar 包,Web工程對(duì)應(yīng) war 包。
- 安裝:在 Maven 環(huán)境下特指將打包的結(jié)果(jar 包或 war 包)安裝(復(fù)制)到本地倉(cāng)庫中。
- 部署:將打包的結(jié)果部署到遠(yuǎn)程倉(cāng)庫或?qū)?war 包部署到服務(wù)器上運(yùn)行。(將動(dòng)態(tài)Web工程生成的war包復(fù)制到Servlet容器的指定目錄下,使其可以運(yùn)行)
4、舉個(gè)例子
??在很早的時(shí)候,我們修改一個(gè)bug,收到了QA的郵件,我們會(huì)打開IDE工具進(jìn)行編譯、打包、部署、測(cè)試,把項(xiàng)目運(yùn)行起來,定位bug,梳理原因,解決bug等一系列調(diào)試,期間不停的重復(fù)著編譯、打包、部署、測(cè)試這些流程,浪費(fèi)了大量的時(shí)間和精力。
??如下圖:

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

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

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

??想必大家看完這篇文章,對(duì)Maven的自動(dòng)化構(gòu)建有了更深一些的了解了。