Maven工具系列(三)--詳解Maven原理,只要一篇就夠了!

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

相關文章
相關標籤/搜索