maven 依賴(依賴範圍,聚合,繼承等)

目錄:web

1.什麼是依賴?spring

2.依賴的管理:依賴的範圍與傳遞,依賴的排除,依賴的原則(maven對依賴衝突的處理原則)api

3.依賴的版本管理框架

 4.繼承與聚合jsp

 

1.什麼是依賴?maven

簡單的講,當jar包A須要jar包B的支持才能正常工做時,那麼B就是A的依賴,以spring-core爲例,它依賴commons-logging,再好比commons-fileupload,它依賴commons-ioide

對於軟件開發人員來講,手動拷貝jar包時常會碰到依賴關係的問題,特別是搭框架的時候,更是讓人頭大,不是缺這個就是少那個,所以咱們須要一個工具幫助咱們管理依賴工具

關係,最好是咱們導入一個jar包時,它能夠自動幫咱們處理相關的依賴包,maven就解決了這個問題,在maven中添加springcore的依賴,他會自動添加commons-logging測試

能夠看到添加依賴時須要提供依賴座標,即G(域名倒序+項目名).A(模塊名,也能夠理解爲工程名).V(版本),座標的查詢能夠到maven的倉庫:spa

http://mvnrepository.com/(固然,以程序運行的角度來說.依賴是對jar的引用)

 

 

2.依賴的管理

2.1依賴的範圍

依賴的範圍能夠理解爲依賴的做用域,即依賴何時對什麼有效

依賴的範圍有4種:compile,test.provided,runtime,重點關注我標紅的兩個,在<dependency>標籤內部有一個<scope>標籤

此標籤用於定義依賴的範圍,其值默認爲compile

compile:對主程序以及test程序均有效,參與項目打包(即scope爲complie的依賴所指向的jar包會在工程打包時(web工程)導入工程中)

provided:對主程序以及test均有效,不參與打包(如servlet-api.jar,jsp-api.jar這些jar包會在容器中提供)

test:僅對測試程序有效,也不參與打包(瞭解),

runtime:僅參與打包,提供運行時支持(瞭解)

 

2.2關於依賴傳遞

若是模塊A依賴了一些jar包,那麼當咱們建立模塊B時,他須要依賴A,也就是說咱們要在B的pom.xml中添加A的依賴(G.A.V)

當咱們添加A的依賴完畢後發現A依賴的jar也會被引入,這是對依賴最直接也是最簡潔的解釋,下面結合依賴範圍對依賴的傳遞

作個簡短的說明,能夠看到maven003工程依賴maven001工程

 

 在maven001工程中添加的jsp-api.jar的依賴scope爲provided,能夠看到maven003的依賴毫無變化

 

 

 修改scope爲compile

 

 

 顯然compile範圍的依賴會進行傳遞,而provided範圍的不會進行傳遞(test範圍也不進行傳遞,這裏不作演示了)可是當咱們實際操做的時候,對於咱們一些項目自帶的依賴咱們不想要或者不想使用

這個版本,這個時候就涉及到依賴的排除與依賴的原則

 

2.3依賴的排除

使用<exclusions>標籤對依賴進行排除(沒有V),接着2.2咱們把jsp-api.jar的依賴範圍設爲了compile可是做爲maven003來說,我不想要這個依賴,只需添加以下標籤

(ps:也能夠在maven001 pom中藉助optional標籤來進行排除)

 

2.4依賴的原則(maven對依賴衝突的處理)

依賴的衝突一般都是跨pom文件衝突,對於這種衝突maven有兩個原則.

第一個原則是就近原則,如今咱們讓maven003的直接依賴是maven002.maven002的直接依賴是maven001.換句話說maven003的間接依賴是maven001

以下所示,當log4j包出現衝突時,,maven003c採用了路徑最近的maven002的版本

第二個原則是先聲明者優先,因爲先聲明瞭maven001的依賴,此時能夠看到maven003採用了maven001中的log4j依賴版本

當你把順序調換後會發現,此時maven003採用了maven002的log4j依賴版本

還有一種狀況是同一個pom文件中,對同一個依賴使用了兩個不一樣的版本,此時下面的覆蓋上面的

 

3.依賴版本統一管理

jar包版本更迭速度快,如何對一個框架的相關jar進行統一的版本管理?

maven提供了<properties>屬性,在其內部自定義標籤對版本進行控制,具體使用時在version中使用${}進行取值便可

可是咱們看到這只是在一個工程(模塊)中實現了版本統一管理,如何在多個工程(模塊)下實現版本統一呢?這就須要maven中的繼承了

 

4.繼承與聚合

建立一個maven工程Parent,注意把packaging選擇爲pom,接下來讓已建立的的maven工程繼承此工程,使用parent標籤,添加父工程G.A.V便可

這樣就能夠實現統一管理多個子工程的通用jar包,上面的圖已經包含了聚合的信息

聚合每每伴隨着繼承一塊兒出現,爲了方便多個子工程的"install"操做,使用聚合時須要在<modules>標籤

中指定各個模塊或者子工程,這樣直接在此父工程(聚合工程)上執行install操做,那麼全部的子工程都會執行install

操做了,值得一說的是若是你建立的是maven module(maven模塊)那麼你不須要使用繼承就能夠直接使用聚合,由於你建立

mavenmodule時已經選擇了parent project,這也是爲何生成的module中會有parent標籤的緣由,

 

 

最後幾點說明:

1.因爲依賴的scope默認是compile,因此依賴默認是傳遞的

2.以上演示的jsp-api依賴實際開發時要注意把scope設爲provided,不然容易引發jar包衝突 

3.由上面的第四點能夠得出結論:maven module與maven project的區別就是maven module必須有parent工程(如今還不清楚maven是如何對一個工程判斷他是module仍是projec)

相關文章
相關標籤/搜索