以前在日常工作中,使用Maven只是機械的執行Maven clean、Maven install,對其中的原理與過程並無瞭解,近期閱讀了《Maven實戰》,對Maven有了更深入的理解。 本篇就針對讀書後的理解,對Maven的日常使用相關的知識進行總結與歸納。 如果想要了解更多內容參考:《Maven實戰》
1 什麼是Maven?
如果沒有Maven,你可能不得不經歷下面的過程:
1 如果使用了spring,去spring的官網下載jar包;如果使用hibernate,去hibernate的官網下載Jar包;如果使用Log4j,去log4j的官網下載jar包…..
2 當某些jar包有依賴的時候,還要去下載對應的依賴jar包
3 當jar包依賴有衝突時,不得不一個一個的排查
4 執行構建時,需要使用ant寫出很多重複的任務代碼
5 當新人加入開發時,需要拷貝大量的jar包,然後重複進行構建
6 當進行測試時,需要一個一個的運行….檢查
有了Maven,它提供了三種功能:
1 依賴的管理:僅僅通過jar包的幾個屬性,就能確定唯一的jar包,在指定的文件pom.xml中,只要寫入這些依賴屬性,就會自動下載並管理jar包。
2 項目的構建:內置很多的插件與生命週期,支持多種任務,比如校驗、編譯、測試、打包、部署、發佈…
3 項目的知識管理:管理項目相關的其他內容,比如開發者信息,版本等等
2 Maven如何管理jar包
關於jar包的座標,有過使用經驗的都應該有所瞭解,maven是通過groupId,artifactId,以及version確定一個唯一的jar包。
這部分的內容可以參考前一篇:構建過程
例如,最常使用的Junit的聲明就是如下:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> 這是聲明的範圍,不同的生命週期所要求的範圍是不一樣的,詳情參考《Maven實戰》 </dependency>
首先先來說說Maven下載jar包的過程:
在Maven中會涉及到幾種倉庫:
1 工作空間,即我們的項目工程,這裏面可能會放着pom.xml文件,這個pom.xml就是maven的配置文件
2 本地倉庫,本地倉庫用於存放jar包,其實Jar包並不是直接放入工作空間的,它是存放在本地倉庫,然後在執行發佈打包的時候,添加依賴路徑
3 私庫:私庫是使用者自己搭建的maven倉庫,用於緩解頻繁從外網下載jar包資源的壓力。而且使用私庫作爲緩存層,也相對安全一些。
4 共享倉庫:書中所說的中央倉庫或者一些常用的鏡像網站都屬於這種,國內比較著名的oschina以及163都是不錯的maven倉庫。
當我們在pom中聲明瞭依賴關係後,參考上面的圖:
1 Maven在執行相關的任務時,會先去本地倉庫查看是否有該資源,如果有的話,判斷版本是否正確,如果一切都沒問題則直接使用;否則,執行下一步
2 Maven會去配置的共享倉庫中查找,如果找到就拷貝到本地倉庫中;找不到則會給出相關的提示
3 Maven在本地如果搭建了私庫,則會去私庫中查找,找到就拷貝到本地倉庫;找不到就會去共享倉庫中查找,然後放入私庫和本地庫。有了私庫,局域網內的開發者可以共享依賴,就不用每個人都去外網下載jar包,浪費帶寬了。
關於本地倉庫和共享倉庫的配置都在settings.xml中,這個文件位於conf中,如果沒有則拷貝一份即可。
View Code
其中本地倉庫的配置爲:
<localRepository>F:\apache-maven-3.3.9\repo</localRepository>
默認是在 用戶的本地目錄/.m2/repository中。
共享倉庫的地址配置爲:
<mirrors> <mirror> <id>CN</id> <name>OSChina Central</name> <url>http://maven.oschina.net/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
3 Maven的生命週期與階段
Maven中有三大生命週期,他們相互獨立,分別是:
1 clean 清理
2 default 構建
3 site 建站
一般來說,clean和default比較常用。
每個生命週期又有不同的階段,階段按順序執行,並且可以指定執行結束的階段。構建的時候,會依次從最上面的階段執行到指定的那個階段。
比如,clean有3個階段:
1 pre-clean 執行清理前要完成的工作 2 clean 清理上一次構建生成的文件 3 post-clean 執行清理後需要完成的工作
當我們輸入mvn clean的時候,執行的是pre-clean和clean兩個階段。
default的階段比較多:
1 validate 2 initialize 3 generate-sources 4 process-sources 5 generate-resources 6 process-resources 7 compile 8 process-classes 9 generate-test-sources 10 process-test-sources 11 generate-test-resources 12 process-test-resources 13 test-compile 14 process-test-classes 15 tet 16 prepare-package 17 package 18 pre-integration-test 19 integration-test 20 post-integration-test 21 verify 22 install 23 deploy
看名字大概就能理解,當執行mvn install的時候,實際會執行validate–>initialize–>…–>verify–>install等二十幾個階段。
爲了操作方便,不同的聲明週期可以在一起執行,比如mvn clean install,會先執行clean的階段,在執行install的階段。
在IDE開發環境中,當我們Run as的時候,就可以執行maven clean進行清理,或者執行maven install進行構建,也可以執行maven build同時執行clean和install兩個任務。
基本上了解上面兩個知識點,就足夠日常工作使用了。當然Maven可不止這麼一點點的東西,比如它還涉及到自定義構建任務、間接依賴的管理、插件的使用、私庫的搭建等等,如果需要的話,讀者可以參考《Maven實戰》,這本書講述的很全面了。