谷粒学院(五)---Maven从入门到入魔
前言
我們在日常的javaee項目開發中,對于大量模塊的開發管理和jar包的管理,我們難免會設計到maven進行項目的管理,這里我總結Maven中比較重要的一些知識點,這也是我在最近學習的項目谷粒學院中所感覺到Maven的使用重要性,所以我就對maven中的一些比較重要的知識點記性總結,希望可以為正在學習的小伙伴提供一些幫助。
“最后希望小伙伴留下小小的愛心”
在我們的生產環境中,開發不再是一個項目一個工程,而是每一個模塊創建一個工程,而多個模塊整合在一起就需要使用Maven這樣的構建工具。
真的需要Maven嗎?相信小伙伴在學習Maven的時候可能會問自己這個問題,Maven是干什么用的?為什么這里我們需要用到Maven?不用Maven我們會有什么麻煩?之所以會提出這個問題是因為我們即使不使用Maven我們任然可以進行B/S結構項目的開發。只是比較麻煩而已,就像我們旅游?不一定非要坐飛機,我們坐火車也可以去,只是時間效率不同而已。
從表述層、業務邏輯層到持久層再到數據庫都有成熟的解決方案—不使用Maven我們一樣也可以進行項目的開發。
這里可能我們的思想會有一個誤區,Maven并不是直接用來輔助編碼的,他戰斗的崗位并不是以上各層。所以我們有必要通過企業開發中的實際需求來看看那些方面是我們現有技術的不足。
2.2 歸其原因,為什么要用Maven?
Maven能夠幫助我們提高開發效率,但是他能幫我們解決什么問題呢?
①:幫助我們添加第三方jar包
在我們今天企業的javaee開發領域中,有大量的第三方框架和工具可以供我們使用,要使用這些jar包最簡單的方法就是復制粘貼到我們web工程下的WEB-INF/lib目錄下。但是這會導致每次創建一個新的工程就需要將jar包重復復制到lib目錄下,從而會造成我們的工作區間存在大量的重復文件,讓我們的工程會顯得很臃腫。而使用Maven后每個jar包本身值在本地創庫中保存一份,需要jar包的工程只需要一坐標的方式簡單的引用一下就可以了。不僅極大的節約了存儲空間,讓項目更加輕巧,更加避免了重復文件太多而造成的混亂。②: jar包之間的依賴關系
我們在開發工程的時候需要用的別的jar包,簡而言之那別人在開發的時候也有可能需要使用到別的jar包,所以以此類推就會出現一種情況就是jar包依賴的情況。也及時我們的jar包不是孤立存在的,很多jar包都需要在其他jar包的支持下才能夠正常工作,我們稱之為jar包之間的依賴關系。其中比較典型的就是我們的文件上傳操作,我們在使用commons-fileupload-1.3.jar 就依賴于 commons-io-2.0.1.jar,如果沒有后面的包,我們的文件上傳功能也就無法實現。那么問題來了,你知道你所使用的所有jar包依賴哪些包嗎?當你拿到一個新的從未使用過jar包,你如何得知他需要那些jar包的支持?如果不了解情況的話,導入的jar包不夠,那么現有的程序還是不能夠正常運行。再進一步,當你的項目中需要用到上百的個jar包時,你還會人為的,手工的逐一確認他們一來的其他jar包嗎?這簡直就是一筆大工程。而引入Maven后,Maven就可以替我們自動的將當前jar包所依賴的其他所有jar包全部導入過來,無需人工參與,節約了我們大量的時間和精力。用實際的例子來說明就是:通過Maven導入commons-fileupload-1.3.jar 后,,commons-io-2.0.1.jar 會被自動導入,程序員不必了解這個依賴關系。下圖就是spring所需jar包的部分依賴關系③:獲取第三方jar包
在javaee的開發中需要使用jar包種類繁多,幾乎每個jar包在其本身的官網上獲取方式都不盡相同。為了查找一個jar包我們需要找遍互聯網,身心俱疲,沒有經歷過的人或許體會不到這種折磨。不僅如此,費勁心力找的jar包里有的時候并沒有你需要的那個類,又或許有你要的類又沒有你要的方法---以不規范的方式獲取的jar包往往也是不規范的。使用maven我們可以享受到一個完全同意規范的jar包管理體系。你只需要在你的項目已坐標的方式依賴一個jar包,Maven就會自動從中央倉庫進行下載,并同下載這個jar包所依賴的其他所有jar包------規范、完整、準確、一次性解決所有問題!PS:在這里我們順便說一下,統一的規范可以說成是程序員的最高信仰。如果沒有一個統一的規范,就會意味著每個具體的技術都各自為政,需要以諸多不同的特殊方式加入到我們的項目中;好不容易加入進來還會和其他技術格格不入,最終受苦的還是我們開發人員。而任何一個領域的統一規范都能夠極大的降低程序員的工作難度,減少工作量。例如:USB接口可以外接各種設備,如果每個設備都有自己獨特的接口,那么不僅制造商需要維護各個接口的設計方案,使用者也需要了解每個設備對應的接口,無疑是非常繁瑣的。
④:將項目拆分成多個工程模塊
隨著javaee項目的規模越來越大,開發團隊的規模也與日俱增,一個項目上千人的團隊持續開發很多對于javaee項目來說是再正常不過了。如果幾百人上千人的開發項目是同一個web工程。那么架構師、項目經理該如何劃分項目的模塊、如何進行分工呢?這么大的項目已經不可能通過package結構來劃分模塊,必須將項目拆分成多個工程協同開發。多個模塊工程中有的是java項目,有的是web項目。那么工程拆分后又該如何進行項目調和訪問呢?這就需要用到maven的依賴管理機制。大家可以看一下survey調查項目的拆分情況。3 . Maven核心講解
3.1 maven簡介
Maven是Apache軟件基金會組織維護的一款自動化構建工具,專注服務于java平臺的項目構建和項目依賴管理。Maven這個單詞的本意是:“專家,內行”。3.2 什么是構建
構建并不是創建,創建一個工程并不等于構建一個項目。要了解構建的含義我們應該由淺入深的從以下三個層面來看:①:純Java代碼
小伙伴都知道,我們Java是一門編譯型語言,純Java擴展名的源文件需要編譯成。class擴展名的字節碼文件才能夠執行。所以編寫任何Java代碼想要執行的話就必須編譯成對應的.class文件②:web工程
當我們需要通過瀏覽器訪問java程序時就必須將包含java程序的web工程編譯的結果“拿”到服務器上的指定目錄下,并啟動服務器才行。這個“拿”的工程我們叫部署。我們可以將未編譯的web工程比喻成一只生的雞,編譯好的web工程是一只煮熟的雞,編譯部署的過程就是將雞煮熟的過程。web工程和其編譯結果的目錄結構對比見下圖:③:實際項目
在實際項目中整合第三方框架,web工程中除了Java程序和jsp頁面、圖片等靜態資源之外,還包括第三方框架的jar包以及各種各樣的配置文件。所有這些資源都必須按照正確的目錄結構部署到服務器上,項目才可以運行。所以綜上所述:構建就是以我們編寫的java代碼、框架配置文件、國家化等其他資源文件、jsp頁面和圖片等靜態資源作為“原材料”,去“生產”一個可以運行的項目的過程。那么項目的構建過程包含哪些環節呢?3.3 構建過程的幾個主要環節
- 清理:刪除以前的編譯結果,為重新編譯做好準備
- 編譯:將Java源程序編譯成可執行的字節碼文件。
- 測試:針對項目中的關鍵點進行測試,確保項目在迭代開發過程中關鍵點的正確性。
- 報告:在每一次測試后以標準的格式記錄和展示測試結果
- 打包:將一個包含諸多文件的工程封裝為一個壓縮文件用于安裝或部署。java工程對應的jar包,web工程對應的war包
- 安裝:在Maven環境下特指將打包的結果—jar包或war包安裝到本地倉庫中
- 部署:將打包的結果部署到遠程倉庫或將war包部署到服務器上運行。
3.4 自動化構建
其實上述環節我們在eclipse中都可以找到對應的操作,只是不太標準。那么既然ide以及可以進行構建了,我們為什么還要使用Maven這樣的構建工具呢?我們來看一個小故事:
這是陽光明媚的一天,托馬斯像往常一樣早早的來到公司,沖好了一杯咖啡,進入自己的郵箱---很不幸,QA小姐發來了一封郵件,報告了他昨天提交的模塊測試結果--有bug?!昂冒?#xff0c;反正也不是第一次”,托馬斯搖搖頭,進入IDE,運行自己的程序,編譯打包。部署到服務器上,然后按照郵件中的操作路徑進行測試?!班?#xff0c;沒錯,這個地方確實有問題”,托馬斯說道。于是托馬斯開始嘗試修復這個bug,當他差不多有眉目的時候已經到了午飯的時間。下午繼續工作,bug很快就被修正了,接著托馬斯對模塊重新進行了編譯,打包、部署、測試之后確認沒有問題了,回復了QA小姐的郵件。一天就這樣過去了,明媚的陽光化作了美麗的晚霞,托馬斯卻覺得生活并不像晚霞那樣美好。讓我們來梳理一下托馬斯這一天中的工作內容
從中我們可以發現,托馬斯的很大一部分時間都發在“編譯、打包、部署、測試”,這些程式化的工作上面,而真正需要由“人”的智慧實現的分析問題和編碼卻只占了很少的一部分。
能否將這些程式化的工作直接交給機器自動完成呢?----當然可以!這就是自動化構建
此時Maven的意義就體現出來了,他可以自動的從構建過程的起點一直執行到終點:
3.5 Maven核心概念
Maven能夠實現自動化構建是和它的內部原理分不開的,這里我們從maven的九個核心概念入手,看看Maven是如何實現自動化構建的- POM
- 約定的目錄結構
- 坐標
- 依賴管理
- 倉庫管理
- 生命周期
- 插件和目標
- 繼承
- 聚合
4 HOW
Maven的核心程序中僅僅定義了抽象的生命周期,而具體的操作則是由Maven的插件來完成的,可是Maven的插件并不包含在Maven的核心程序中,在首次使用時需要聯網下載。5 Maven核心概念
5.1 POM
Project Object Model:項目對象模型。將Java工程的相關信息封裝為對象作為便于操作和管理的模型,Maven工程的核心配置,可以說是學習maven就是學習pom.xml文件中的配置。5.2 約定的目錄結構
約定的目錄結構對于maven實現自動化構建而言是必不可少的一環,就拿自動化編譯來說,maven必須能找到java源文件,下一步才能編譯,而編譯之后也必須有一個準確的位置保持編譯得到的字節碼文件。我們在開發中如果需要讓第三方工具或框架知道我們自己創建的資源在哪,那么基本上就是兩種方式:
①:通過配置的形式明確告訴它
②:基于第三方工具或框架的約定
maven對于工程目錄結構的要求就屬于后面的一種。
現在javaee開發領域普遍認同同一個觀點:約定>配置>編碼。意思就是能用配置解決的問題就不編碼,能基于約定的就不進行配置。而Maven正是因為指定了特定文件保存的目錄才能夠對我們的java工程進行自動化構建。5.3 坐標
①:幾何中的坐標
- 在一個平面中使用x,y兩個向量可以唯一的確定平面中的一個點。
- 在空間中使用x,y,z三個向量可以唯一的確定空間中的一個點
②:maven的坐標
使用如下三個向量在maven的倉庫中唯一的確定一個Maven工程
- groupid:公司或組織的域名倒序+當前項目名稱
- artifactld:當前項目的模塊名稱
- version:當前模塊的版本
③:如何通過坐標到倉庫中查找對應的jar包?
- 將gav三個向量連起來
- 已連起來的字符串作為目錄結構到倉庫中查找
5.4 依賴
maven中最關鍵的部分,我們使用Maven最重要的就是使用他的依賴管理功能。要理解和掌握Maven的依賴管理,我們只需要解決一個 ①:依賴的目的是什么?當A jar包用到了B jar包中的某些類時,A就對B產生了依賴,這是概念上的描述。那么如何在項目中一依賴的方式引入一個我們需要的jar包呢?
答案非常簡單,就是使用depenency標簽指定被依賴包的坐標就可以了。 ②:依賴的范圍大家注意到上面的依賴信息中除了目標jar包的坐標以外還有一個scope設置,這是依賴的范圍。依賴的范圍有幾個可選值,我們用得到的是:complie、test、provided三個。
結合具體的例子:對于helloFriend來說,hello 就是服務于主程序的,junit就是服務于測試程序的。helloFriend 主程序需要hello 是非常明顯的,測試程序由于要調用主程序所以也需要hello,所以complie范圍依賴對于主程序和測試程序都應該有效。
- 從開發和運行這兩個不同階段理解complie和provided的區別
A依賴B,B依賴C,A能否使用C呢?那么我們就要看B依賴C的范圍是不是complie,否則不可用。
依賴的排出如果我們在當前工程中引入了一個依賴是A,而A又依賴了B,那么Maven會自動將A依賴的B引入當前工程,但是個別情況下B有可能是一個不穩定版本,或對當前工程有不良影響。這是我么可以在引用A的時候將B排除。
- 情景舉例
- 配置方式
- 排除后的效果
5.5 統一管理所依賴jar包的版本
對同一個框架的一組jar包最好使用相同的版本。為了方便升級框架,可用將jar包的版本信息統一提取出來
- 統一聲明版本號
其中atguigu.spring.version不是是自定義標簽
- 引用前面聲明的版本號
- 其他用法
5.5 倉庫
①:分類
本地倉庫:為當前本機電腦上的所有Maven工程服務遠程倉庫:私服:架構在當前局域網環境下,為當前局域網范圍內的所有Maven工程服務。中央倉庫:架構在internet上,為全世界所有的Maven工程服務
中央倉庫的鏡像:架設在各大洲,為中央倉庫分擔流量。減輕中央倉庫的壓力,同時更快的響應用戶的請求。
②:倉庫中的文件
maven的插件我們自己開發的項目的模塊第三方框架或工具的jar包不管是什么樣的jar包,在倉庫中都是按照坐標生成目錄結構,所以可以通過統一的方式查詢依賴。
5.6 生命周期
①:什么是Maven的什么周期?
-
Maven生命周期定義了各個構建環節的執行順序,有了這個清單,Maven就可以自動化的執行構建命令了。
-
Maven有三套相互獨立的生命周期,分別是:
①:clean Lifecycle 在進行真正構建之前進行一些清理工作②:Default Lifecycle 構建的核心部分,編譯,測試,打包,安裝,部署等等③:site Lifecycle 生成報告,站點,發布站點
他們是相互獨立,你可以僅僅調用clean來清理工作目錄,僅僅調用site來生成站點。當然也可以直接運行mvn clean install site 運行所有這三套什么周期。
每套生命周期都由一組階段組成,我們平時在命令行輸入的命令總會對應一個特定的階段。比如,運行mvn clean,這個clean是clean生命周期,也有clean階段。
②:clean什么周期
clean生命周期一共包含三個階段:①:pre-clean 執行一些需要在clean之前完成的工作②:clean 移除所有上一次構建生成的文件③:post-clean執行一些需要在clean之后立刻生成的工作③:site生命周期
①:pre-site 執行一些需要在生成站點文檔之前完成的工作②:site 生成項目的站點文檔③:post-site 執行一些需要在生成站點文檔之后完成的工作,并且為部署做準備④:site-deploy將生成的站點文檔部署到特定的服務器上這里經常用到的是site階段和site-deploy階段,用以生成和發布Maven站點,這可是maven相當大的功能,manager比較喜歡,文檔及統計數據自動生成很好看。
④:Default生命周期
Default生命周期是maven生命周期中最重要的一個,絕大部分工作都發生在這個生命周期中,這里,只解釋一些比較重要和常用的階段:validate
generate-sources
process-sources
generate-resources
process-resources 復制并處理資源文件,至目標目錄,準備打包。
compile 編譯項目的源代碼
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 復制并處理資源文件,至目標測試目錄。
test-compile 編譯測試源代碼。
process-test-classes
test 使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。
prepare-package
package 接受編譯好的代碼,打包成可發布的格式,如 JAR
pre-integration-test
integration-test
post-integration-test
verify
install 將包安裝至本地倉庫,以讓其它項目依賴
deploy 將最終的包復制到遠程的倉庫,以讓其它開發人員與項目共享或部署到服務器上運行
⑤:生命周期與自動化構建
運行任何一個階段的時候,他前面的所有階段都會被運行,例如我們運行mvn install的時候,代碼會被編譯,測試,打包。這就是Maven為什么能夠自動執行構建過程的各個環節的原因。此外,Maven的插件機制是完全依賴Maven的生命周期的,因此理解生命周期是至關重要。5.7 插件和目標
- Maven的核心僅僅定義了抽象的生命周期,具體的任務都是交由插件完成的
- 每個插件都可以實現多個功能,每個功能就是一個插件
- Maven的生命周期與插件目標相互綁定以完成某個具體的構建任務
例如:compile就是插件maven-compli-plugin的一個目標:pre-clean是插件maven-clean-plugin的一個目標。
5.8 繼承
①:為什么需要繼承機制
由于非complie范圍的依賴信息是不能在“依賴鏈”中傳遞的,所以有需要的工程只能單獨配置。例如
此時如果項目需要將各個模塊的junit版本統一為5.9,那么到各個工程手動修改無疑是非常不可取的。使用繼承機制就可以將這樣的依賴信息統一提取到父工程模塊中進行統一管理。
②:創建父工程
創建父工程和創建一般的Java工程操作一樣,唯一需要注意的就是:打包方式初要設置為pom
③:在子工程中引用父工程
<parent> <!-- 父工程坐標 --><groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <relativePath>從當前目錄到父項目的 pom.xml 文件的相對路徑</relativePath> </parent>此時如果子工程的groupid和version如果和父工程重復則可以刪除。
④:在父工程中管理依賴
將parent項目中的dependencies標簽,用dependencyManagement 標簽括起來
在子項目中重新指定需要的依賴,刪除范圍和版本號
5.9 聚合
①:為什么要使用聚合?
將多個工程拆分為模塊后,需要手動逐個安裝到倉庫后依賴才能夠生效。修改源碼后也需要逐個手動進行clean操作。而使用了聚合之后就可以批量進行Maven工程的安裝、清理工作。
②:如何配置聚合?
在總的聚合工程中使用moudles/module標簽組合,指定模塊工程的相對路徑即可
6 總結
maven主要是對項目的管理和jar包的管理機制,小伙伴可以到 http://mvnrepository.com/搜索需要的 jar 包的依賴信息。
總結
以上是生活随笔為你收集整理的谷粒学院(五)---Maven从入门到入魔的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通达信版弘历软件指标_[转载]弘历软件指
- 下一篇: 微信文件夹下不可言说的秘密自动生成小视频