01Maven核心概念html
1.項目對象模型java
說明:git
maven根據pom.xml文件,把它轉化成項目對象模型(POM),這個時候要解析依賴關係,而後去相對應的maven庫中查找到依賴的jar包。github
在clean,compile,test,package等階段都有相應的Plug-in來作這些事情。而這些plug-in會產生一些中間產物。web
2.插件的位置redis
在maven解壓後的位置E:\apache-maven-3.5.0\bin(安裝目錄)有一個bin文件夾,裏面有一個文件m2.conf文件:spring
set maven.home default ${user.home}/m2,其中該路徑指明瞭倉庫的存儲位置。在本地倉庫下面全部的plugins都在:apache
3.maven的內置插件api
咱們在執行maven命令的時候 mvn clean compile package,maven會經過本身內置插件幫咱們執行 項目的清理 編譯 打包工做,這些也是經過maven的內置插件實現的。jsp
4.插件的配置
<build><plugins><plugin><!-- 配置插件座標--></plugin></plugins></build>
02.Maven生命週期和座標相關概念
1.生命週期
先來一張圖表示maven的生命週期:
一個完整的項目構建過程一般包括清理、編譯、測試、打包、集成測試、驗證、部署等步驟,Maven從中抽取了一套完善的、易擴展的生命週期。Maven的生命週期是抽象的,其中的具體任務都交由插件來完成。Maven爲大多數構建任務編寫並綁定了默認的插件,如針對編譯的插件:maven-compiler-plugin。用戶也可自行配置或編寫插件。
Maven 擁有三套相互獨立的生命週期: clean、default 和 site, 而每一個生命週期包含一些phase階段, 階段是有順序的, 而且後面的階段依賴於前面的階段. 而三套生命週期相互之間卻並無先後依賴關係, 即調用site週期內的某個phase階段並不會對clean產生任何影響.
clean
clean生命週期的目的是清理項目:
mvn clean;
default
default生命週期定義了真正構建時所須要執行的全部步驟:
mvn clean install;
site
site生命週期的目的是創建和發佈項目站點: Maven可以基於POM所包含的信息,自動生成一個友好的站點,方便團隊交流和發佈項目信息
mvn clean deploy site-deploy;
2.Maven座標
相似在平面幾何中座標(x,y)能夠標識平面中惟一的一點, Maven世界擁有大量構建,咱們須要找一個用來惟一標識一個構建的統一規範
擁有了統一規範,就能夠把查找工做交給機器:
groupId:定義當前Maven項目隸屬項目 (實際對應JAVA的包的結構, 是main目錄裏java的目錄結構)。
artifactId:定義實際項目中的一個模塊(項目的惟一的標識符,實際對應項目的名稱,就是項目根目錄的名稱)。
version:定義當前項目的當前版本。
如何發佈項目到倉庫:
mvn install :發佈到本地倉庫,通常開始使用mvn deploy : 發佈到遠程倉庫,test,生產,uat環境等使用
03.Maven依賴
1.maven依賴的幾個特性
1.1. 依賴範圍 -scope標籤
maven在構建過程有3套classpath,咱們會根據配置依賴的範圍 依賴不一樣的classpath,以下圖:
compile:默認是compile,對 編譯 測試 運行 都有效。
provided:對編譯和測試classpath有效,運行的時候不須要加入,例如 jsp 依賴 searvlet api ,好比咱們在編譯和測試的時候有效可是在運行的時候 容器已經提供servletapi,若是加入會形成衝突。
runtime:只在測試和運行時 有效,比較典型的例子 jdbc api,只有在啓動代碼測試或者運行的時候纔會啓用。
test:只會在測試時有效,比較典型例子 就是junit ,只有再測試的時候 纔會啓用。
1.2 依賴傳遞
好比咱們引入某一個依賴spring-test,依賴傳遞特性會很方便幫助咱們下來它相關的依賴,而沒必要有時會由於引入jar有問題而煩惱,可是也有弊端,存在一些沒必要要的依賴,可能會形成衝突。
1.3 依賴排除 -exclusion標籤
依賴排除的特性 也是爲了解決依賴衝突的一個方法,很方便去除依賴傳遞過程當中沒必要要的依賴。在下面依賴沖沖突會用到 該標籤。
1.4 依賴衝突產生緣由
使用maven久了會發現存在依賴衝突的問題,因爲依賴的傳遞特性會引入不少隱式的依賴和現有顯示jar版本 所衝突,從而形成版本衝突的問題。要解決這個問題,首先就是要查看pom.xml顯式和隱式的依賴類包, 而後經過這個類包樹找出咱們不想要的依賴類包,手工將其排除在外就能夠了。
2.依賴衝突的解決
2.1兩個基本原則:
1).短路優先原則
A->B->logback-1.0.jar A->logback-1.1.jar
2).先聲明先優先原則(先解析先引用)
與項目A pom中配置 引用座標的順序有關,若是依賴B在C前的話 就優先B,反之...
A->B->logback-1.0.jar A->C->logback-1.1.jar
2.2 實戰
建立三個maven工程
maven-01,maven-02,maven-03
1).三個工程依賴結構:
maven-01依賴 spring-test,maven-02,maven-03 (maven-02/03須要首先提交本地倉庫,maven-01才能找到 ,能夠參考尋找構件過程:1.3 倉庫尋找構件過程) ;
maven-02依賴commons-logging-1.1.1;
maven-03工程依賴 commons-logging-1.1.3。
2.2.1 衝突解決辦法:
短路優先原則:
maven-01->spring-test->spring-core->commons-loggings-1.2(依賴深度3);
maven-01->maven-02->commons-loggings-1.1.1(依賴深度2);
因此maven01工程依賴的commons-loggings-1.1.1;
先引用先優先的原則:
maven-01->spring-test->spring-core。
maven-01->maven-02->commons-logging-1.1.1。
maven-01->maven-03->commons-logging-1.1.3。
若是pom先依賴maven-02則 依賴commons-logging-1.1.1 依賴;反之,若是pom先依賴maven-03則 依賴commons-logging-1.1.3 依賴;
<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.2.2.RELEASE</version><!-- 依賴排除 --><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency><!-- 添加對maven-03依賴 --><dependency><groupId>com.sohu.train</groupId><artifactId>maven-03</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- 添加對maven-02依賴 --><dependency><groupId>com.sohu.train</groupId><artifactId>maven-02</artifactId><version>1.0-SNAPSHORT</version></dependency>
04.聚合與繼承
1.聚合
Maven的聚合特性(aggregation)可以使項目的多個模塊聚合在一塊兒構建, 而繼承特性(inheritance)可以幫助抽取各模塊相同的依賴、插件等配置,在簡化模塊配置的同時, 保持各模塊一致.
隨着項目愈來愈複雜(須要解決的問題愈來愈多、功能愈來愈重), 咱們更傾向於將一個項目劃分幾個模塊並行開發, 如: 將code_project項目劃分爲redis、kafka和web三個模塊(按照功能進行劃分), 而咱們又想一次構建全部模塊, 而不是針對各模塊分別執行$ mvn命令. 因而就有了Maven的模塊聚合 -> 將code_project做爲聚合模塊將其餘模塊彙集到一塊兒構建:
2.繼承
在面向對象中, 能夠經過類繼承實現複用. 在Maven中一樣也能夠建立POM的父子結構, 經過在父POM中聲明一些配置供子POM繼承來實現複用與消除重複。(實際項目運用 的)
父工程:
<!-- 子模塊 --><modules><module>../maven-01</module><module>../maven-02</module><module>../maven-03</module></modules>
子工程:
<parent><groupId>com.zfr.aaron</groupId><artifactId>maven-test</artifactId><version>0.0.1-SNAPSHOT</version><relativePath>../maven-aggregate/pom.xml</relativePath> </parent>
05.pom文件配置詳解和settings文件配置詳解
詳解文件,地址信息:
https://github.com/zfrHJ/aaron_architecture_road/tree/master/environmental_construction/maven
maven全局配置文件settings.xml詳解:https://www.cnblogs.com/jingmoxukong/p/6050172.html
06.Maven Plugin 開發
幾乎100%的場景都不用咱們本身開發Maven插件, 但理解插件開發可使咱們更加深刻的理解Maven. 下面咱們實際開發一個用於統計代碼行數的插件 lc-maven-plugin.須要的參考以下資料:
(https://www.cnblogs.com/yulonglyw/p/8550603.html)
補充知識點:
maven私庫操做:
(https://www.cnblogs.com/hujiapeng/p/7127213.html)
歡迎關注GitHub地址:https://github.com/zfrHJ/aaron_architecture_road