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