有人認為Maven是一個依賴管理工具二跋,當然這種想法是錯誤的(確切的說Maven是一個項目管理工具战惊,貫穿了整個項目生命周期,編譯扎即,測試吞获,打 包,發(fā)布...)谚鄙,但Maven給人造成這種錯誤的印象也是有原因的各拷,因為Maven的依賴管理十分強大,用好了Maven闷营,你不再需要面對一大堆jar 感到頭大烤黍,依賴沖突,無用依賴等問題也能夠得到有效的防止和解決傻盟。
一速蕊、依賴
依賴是Maven 中最關鍵的部分,我們之所以在工程中使用Maven娘赴,就是因為它的依賴管理功能规哲。如果我們想要在工程中引入某個jar 包,只需要在pom.xml 中引入其jar 包的坐標即可诽表。比如引入log4j 的依賴:
log4j
log4j
1.2.17
compile
groupId,必選媳叨,實際隸屬項目
artifactId,必選,其中的模塊
version必選关顷,版本號
type可選糊秆,依賴類型,默認jar
scope可選议双,依賴范圍痘番,默認compile
optional可選,標記依賴是否可選,默認false
exclusion可選汞舱,排除傳遞依賴性伍纫,默認空
二.依賴范圍
Maven 提供了六種依賴的范圍:compile、test昂芜、provided莹规、runtime、system 和import泌神。其中compile 是默認的依賴范圍良漱。這里主要對比前三種常用的依賴范圍。
maven項目有三種classpath(編譯欢际,測試母市,運行)
scope用來表示與classpath的關系,總共有五種
compile:編譯损趋,測試串塑,運行
test:測試
provided:編譯侄柔,測試
runtime:運行
system:編譯湃密,測試领舰,同provided,但必須指定systemPath桐玻,慎用
三.傳遞性依賴
顧名思義高镐,你懂的,但是傳遞的范圍會發(fā)生改變畸冲,這個由maven自身處理嫉髓,只要理解下即可
第一列為第一依賴,第二列為第二依賴邑闲,單元格為傳遞范圍
compiletestprovidedruntime
compilecompile__runtime
testtest__test
providedprovided_providedprovided
runtimeruntime__runtime
四.依賴調(diào)解
傳遞路徑長度取最短原則算行,傳遞路徑長度相等時,采取最先申明原則
如果A 依賴于B苫耸,B 依賴于C州邢,在B 和C 中同時有l(wèi)og4j 的依賴,并且這兩個版本不一致褪子,那么A 會根據(jù)最短路徑原則量淌,在A 中會傳遞過來B 的log4j版本
如果在A 同時依賴于B 和C,B 和C 沒有依賴關系嫌褪,并且都有l(wèi)og4j 的依賴呀枢,且版本不一致,那么A 會引入在pom.xml 中先聲明依賴的log4j 版本
五.可選依賴
盡量少用笼痛,可選依賴不會被傳遞裙秋,需要顯式申明琅拌。例如下例,B有一個持久層工具包依賴摘刑,他依賴了兩種數(shù)據(jù)庫驅(qū)動进宝,這兩種特性只需要選擇一種,這種傳遞性依賴是不會給傳遞的枷恕,需要在A項目中另外依賴數(shù)據(jù)庫驅(qū)動依賴党晋。
mysql
mysql-connector-java
5.1.10
true
postgresql
postgresql
8.4.701.jdbc3
true
正常情況不應該使用可選依賴,可選依賴一般是項目有多個特性徐块,在面向?qū)ο笤O計中單一原則意指一個類應該只有一項職責未玻。
六.排除依賴
發(fā)現(xiàn)依賴包里有些包不穩(wěn)定,可以排除依賴蛹锰,顯式的申明文檔的包深胳。
javax.mail
1.4.1
javax.activation
activation
javax.activation
activation
1.1
七.分類依賴
當同一個模塊绰疤,所依賴的幾個模塊版本都相同時铜犬,可以使用maven里的屬性做分類依賴,依賴版本升級時改一處即可
2.5.6
org.springframework
spring-core
${springframework.version}
jar
compile
org.springframework
spring-beans
${springframework.version}
pom
compile
org.springframework
spring-context
${springframework.version}
jar
compile
org.springframework
spring-context-support
${springframework.version}
jar
compile
八.優(yōu)化依賴
可概括為三個命令
mvn dependency:list
表示依賴列表轻庆,maven eclipse插件已經(jīng)實現(xiàn)癣猾,有圖形化顯示,在pom.xml的dependencies頁
mvn dependency:tree
表示依賴樹余爆,maven eclipse插件已經(jīng)實現(xiàn)纷宇,有圖形化顯示,在pom.xml的dependency hierarchy頁
mvn dependency:analyze
表示依賴分析蛾方,命令可以分析當前依賴像捶,包括哪些依賴被import卻沒引入,哪些引來引入了但是沒加入編譯桩砰。有時候可以用來刪除一些沒用的依賴拓春,但是不能直接刪除,比如sprint-core是Spring的必須依賴亚隅,但是會提示沒加入編譯硼莽,但是他又是Spring框架必須的。