Maven自動化構建工具
?
?
第一章?Why
Maven是干什么用的?這是很多同學(xué)在學(xué)完這個課程后最大的問題。之所以會提出這個問題,是因為即使不使用Maven我們?nèi)匀豢梢?/span>進行B/S結(jié)構(gòu)項目的開發(fā)。從表述層、業(yè)務(wù)邏輯層到持久化層再到數(shù)據(jù)庫都有成熟的解決方案——不使用Maven我們一樣可以開發(fā)項目啊?所以我們有必要通過企業(yè)開發(fā)中的實際需求來看一看哪些方面是我們現(xiàn)有技術(shù)的不足。
?
1.1 添加第三方jar包?
在今天的JavaEE開發(fā)領(lǐng)域,有大量的第三方框架和工具可以供我們使用。要使用這些jar包最簡單的方法就是復(fù)制粘貼到WEB-INF目錄下的lib目錄下。但是這會導(dǎo)致每次創(chuàng)建一個新的工程就需要將jar包重復(fù)復(fù)制到lib目錄下,從而造成工作區(qū)中存在大量重復(fù)的文件。
而使用Maven后每個jar包只在本地倉庫中保存一份,需要jar包的工程只需要維護一個文本形式的jar包的引用——我們稱之為“坐標(biāo)”。不僅極大的節(jié)約了存儲空間,讓項目更輕巧,更避免了重復(fù)文件太多而造成的混亂。
1.2 jar包之間的依賴關(guān)系
jar包往往不是孤立存在的,很多jar包都需要在其他jar包的支持下才能夠正常工作,我們稱之為jar包之間的依賴關(guān)系。最典型的例子是:commons-fileupload-1.3.jar依賴于commons-io-2.0.1.jar,如果沒有IO包,FileUpload包就不能正常工作。
那么問題來了,你知道你所使用的所有jar包的依賴關(guān)系嗎?當(dāng)你拿到一個新的從未使用過的jar包,你如何得知他需要哪些jar包的支持呢?如果不了解這個情況,導(dǎo)入的jar包不夠,那么現(xiàn)有的程序?qū)⒉荒苷9ぷ?/span>。再進一步,當(dāng)你的項目中需要用到上百個jar包時,你還會人為的,手工的逐一確認它們依賴的其他jar包嗎?這簡直是不可想象的。
而引入Maven后,Maven就可以替我們自動的將當(dāng)前jar包所依賴的其他所有jar包全部導(dǎo)入進來,無需人工參與,節(jié)約了我們大量的時間和精力。用實際例子來說明就是:通過Maven導(dǎo)入commons-fileupload-1.3.jar后,commons-io-2.0.1.jar會被自動導(dǎo)入,程序員不必了解這個依賴關(guān)系。
1.3 處理jar包之間的沖突
上一點說的是jar包不足項目無法正常工作,但其實有的時候jar包多了項目仍然無法正常工作,這就是jar包之間的沖突。
舉個例子:我們現(xiàn)在有三個工程MakeFriend、HelloFriend、和Hello。MakeFriend依賴HelloFriend,HelloFriend依賴Hello。而Hello依賴log4j.1.2.17.jar,HelloFriend依賴log4j.1.2.14.jar。如下圖所示:
那么MakeFriend工程的運行時環(huán)境中該導(dǎo)入log4j.1.2.14.jar呢還是log4j.1.2.17.jar呢?
這樣的問題一個兩個還可以手工解決,但如果系統(tǒng)中存在幾十上百的jar包,他們之間的依賴關(guān)系會非常復(fù)雜,幾乎不可能手工實現(xiàn)依賴關(guān)系的梳理。
使用Maven就可以自動的處理jar包之間的沖突問題。因為Maven中內(nèi)置了兩條依賴原則:最短路徑者優(yōu)先和先聲明者優(yōu)先,上述問題MakeFriend工程會自動使用log4j.1.2.14.jar。
?
1.4 獲取第三方jar包
JavaEE開發(fā)中需要使用到的jar包種類繁多,幾乎每個jar包在其本身的官網(wǎng)上的獲取方式都不盡相同。為了查找一個jar包找遍互聯(lián)網(wǎng),身心俱疲,沒有經(jīng)歷過的人或許體會不到這種折磨。不僅如此,費勁心血找的jar包里有的時候并沒有你需要的那個類,又或者又同名的類沒有你要的方法——以不規(guī)范的方式獲取的jar包也往往是不規(guī)范的。
使用Maven我們可以享受到一個完全統(tǒng)一規(guī)范的jar包管理體系。你只需要在你的項目中以坐標(biāo)的方式依賴一個jar包,Maven就會自動從中央倉庫進行下載,并同時下載這個jar包所依賴的其他jar包——規(guī)范、完整、準(zhǔn)確!一次性解決所有問題!
Tips:在這里我們順便說一下,統(tǒng)一的規(guī)范幾乎可以說成是程序員的最高信仰。如果沒有統(tǒng)一的規(guī)范,就意味著每個具體的技術(shù)都各自為政,需要以諸多不同的特殊的方式加入到項目中;好不容易加入進來還會和其他技術(shù)格格不入,最終受苦的是我們。而任何一個領(lǐng)域的統(tǒng)一規(guī)范都能夠極大的降低程序員的工作難度,減少工作量。例如:USB接口可以外接各種設(shè)備,如果每個設(shè)備都有自己獨特的接口,那么不僅制造商需要維護各個接口的設(shè)計方案,使用者也需要詳細了解每個設(shè)備對應(yīng)的接口,無疑是非常繁瑣的。
1.5 將項目拆分成多個工程模塊
隨著JavaEE項目的規(guī)模越來越龐大,開發(fā)團隊的規(guī)模也與日俱增。一個項目上千人的團隊持續(xù)開發(fā)很多年對于JavaEE項目來說再正常不過。那么我們想象一下:幾百上千的人開發(fā)的項目是同一個Web工程。那么架構(gòu)師、項目經(jīng)理該如何劃分項目的模塊、如何分工呢?這么大的項目已經(jīng)不可能通過package結(jié)構(gòu)來劃分模塊,必須將項目拆分成多個工程協(xié)同開發(fā)。多個模塊工程中有的是Java工程,有的是Web工程。
那么工程拆分后又如何進行互相調(diào)用和訪問呢?這就需要用到Maven的依賴管理機制。大家請看我們的Survey調(diào)查項目拆分的情況:
上層模塊依賴下層,所以下層模塊中定義的API都可以為上層所調(diào)用和訪問。
1.6 實現(xiàn)項目的分布式部署
在實際生產(chǎn)環(huán)境中,項目規(guī)模增加到一定程度后,可能每個模塊都需要運行在獨立的服務(wù)器上,我們稱之為分布式部署,這里同樣需要用到Maven。
第二章?What
如果上面的描述能夠使你認識到使用Maven是多么的重要,我們下面就來介紹一下Maven是什么。
2.1 自動化構(gòu)建工具
Maven這個單詞的本意是:專家,內(nèi)行。讀音是['me?v(?)n]或['mevn],不要讀作“媽文”。
Maven是一款自動化構(gòu)建工具,專注服務(wù)于Java平臺的項目構(gòu)建和依賴管理。在JavaEE開發(fā)的歷史上構(gòu)建工具的發(fā)展也經(jīng)歷了一系列的演化和變遷:
Make→Ant→Maven→Gradle→其他……
那么什么是構(gòu)建呢?
2.2 構(gòu)建的概念
構(gòu)建并不是創(chuàng)建,創(chuàng)建一個工程并不等于構(gòu)建一個項目。要了解構(gòu)建的含義我們應(yīng)該由淺入深的從以下三個層面來看:
①純Java代碼
大家都知道,我們Java是一門編譯型語言,.java擴展名的源文件需要編譯成.class擴展名的字節(jié)碼文件才能夠執(zhí)行。所以編寫任何Java代碼想要執(zhí)行的話就必須經(jīng)過編譯得到對應(yīng)的.class文件。
②Web工程
當(dāng)我們需要通過瀏覽器訪問Java程序時就必須將包含Java程序的Web工程編譯的結(jié)果“拿”到服務(wù)器上的指定目錄下,并啟動服務(wù)器才行。這個“拿”的過程我們叫部署。
我們可以將未編譯的Web工程比喻為一只生的雞,編譯好的Web工程是一只煮熟的雞,編譯部署的過程就是將雞燉熟。
Web工程和其編譯結(jié)果的目錄結(jié)構(gòu)對比見下圖:
?
?
③實際項目
在實際項目中整合第三方框架,Web工程中除了Java程序和JSP頁面、圖片等靜態(tài)資源之外,還包括第三方框架的jar包以及各種各樣的配置文件。所有這些資源都必須按照正確的目錄結(jié)構(gòu)部署到服務(wù)器上,項目才可以運行。
所以綜上所述:構(gòu)建就是以我們編寫的Java代碼、框架配置文件、國際化等其他資源文件、JSP頁面和圖片等靜態(tài)資源作為“原材料”,去“生產(chǎn)”出一個可以運行的項目的過程。
那么項目構(gòu)建的全過程中都包含哪些環(huán)節(jié)呢?
2.3 構(gòu)建環(huán)節(jié)
①清理:刪除以前的編譯結(jié)果,為重新編譯做好準(zhǔn)備。
②編譯:將Java源程序編譯為字節(jié)碼文件。
③測試:針對項目中的關(guān)鍵點進行測試,確保項目在迭代開發(fā)過程中關(guān)鍵點的正確性。
④報告:在每一次測試后以標(biāo)準(zhǔn)的格式記錄和展示測試結(jié)果。
⑤打包:將一個包含諸多文件的工程封裝為一個壓縮文件用于安裝或部署。Java工程對應(yīng)jar包,Web工程對應(yīng)war包。
⑥安裝:在Maven環(huán)境下特指將打包的結(jié)果——jar包或war包安裝到本地倉庫中。
⑦部署:將打包的結(jié)果部署到遠程倉庫或?qū)?/span>war包部署到服務(wù)器上運行。
2.4 自動化構(gòu)建
其實上述環(huán)節(jié)我們在Eclipse中都可以找到對應(yīng)的操作,只是不太標(biāo)準(zhǔn)。那么既然IDE已經(jīng)可以進行構(gòu)建了我們?yōu)槭裁催€要使用Maven這樣的構(gòu)建工具呢?我們來看一個小故事:
| 這是陽光明媚的一天。托馬斯向往常一樣早早的來到了公司,沖好一杯咖啡,進入了自己的郵箱——很不幸,QA小組發(fā)來了一封郵件,報告了他昨天提交的模塊的測試結(jié)果——有BUG。“好吧,反正也不是第一次”,托馬斯搖搖頭,進入IDE,運行自己的程序,編譯、打包、部署到服務(wù)器上,然后按照郵件中的操作路徑進行測試。“嗯,沒錯,這個地方確實有問題”,托馬斯說道。于是托馬斯開始嘗試修復(fù)這個BUG,當(dāng)他差不多有眉目的時候已經(jīng)到了午飯時間。 下午繼續(xù)工作。BUG很快被修正了,接著托馬斯對模塊重新進行了編譯、打包、部署,測試之后確認沒有問題了,回復(fù)了QA小組的郵件。 一天就這樣過去了,明媚的陽光化作了美麗的晚霞,托馬斯卻覺得生活并不像晚霞那樣美好啊。 |
讓我們來梳理一下托馬斯這一天中的工作內(nèi)容
從中我們發(fā)現(xiàn),托馬斯的很大一部分時間花在了“編譯、打包、部署、測試”這些程式化的工作上面,而真正需要由“人”的智慧實現(xiàn)的分析問題和編碼卻只占了很少一部分。
能否將這些程式化的工作交給機器自動完成呢?——當(dāng)然可以!這就是自動化構(gòu)建。
?
?
那么Maven又是如何實現(xiàn)自動化構(gòu)建的呢?簡單的說來就是它可以自動的從構(gòu)建過程的起點一直執(zhí)行到終點:
2.5 Maven核心概念
Maven之所以能夠?qū)崿F(xiàn)自動化的構(gòu)建,和它的設(shè)計是緊密相關(guān)的。我們對Maven的學(xué)習(xí)就圍繞它的九個核心概念展開:
①POM
②約定的目錄結(jié)構(gòu)
③坐標(biāo)
④依賴管理
⑤倉庫管理
⑥生命周期
⑦插件和目標(biāo)
⑧繼承
⑨聚合
轉(zhuǎn)載于:https://www.cnblogs.com/highpointengineer/p/10899292.html
總結(jié)
以上是生活随笔為你收集整理的Maven自動化構建工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓客户端与服务器交互Json数据
- 下一篇: C# static的用法详解