依賴範圍是用來控制依賴與3種classpath(編譯classpath,測試classpath,運行classpath)的關係。maven有如下幾種依賴範圍:java
一、compile 編譯、測試、運行,A在編譯時依賴B,而且在測試和運行時也依賴。mysql
strus-core、spring-beansspring
打到war包或jar包。sql
二、provided 編譯、和測試有效,A在編譯和測試時須要B。數據庫
好比:servlet-api就是編譯和測試有用,在運行時不用(tomcat容器已提供)。apache
不會打到war。api
三、runtime:測試、運行有效。tomcat
好比:jdbc驅動包 ,在開發代碼中針對java的jdbc接口開發,編譯不用。框架
在運行和測試時須要經過jdbc驅動包(mysql驅動)鏈接數據庫,須要的!!maven
會打到war。
四、test:只是測試有效,只在單元測試類中用。
好比:junit
不會打到war。
如何設置依賴範圍呢?
好比咱們要將mysql驅動的依賴設置爲runtime範圍,配置以下:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </dependency> |
將servlet依賴設置爲provided
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> |
若是是compile就不須要設置了,由於compile是scope的默認值。關於test範圍咱們在後邊講解單元測試時再作演示。
從新執行打包爲war , 會發現servlet-api.jar已經不存在。
什麼是依賴傳遞?
A->B(compile) 第一關係: a依賴b compile
B->C(compile) 第二關係: b依賴c compile
咱們看下圖:
一、縱座標:直接依賴
A依賴B,B是A的直接依賴。
在A的pom.xml中添加B的座標。
二、橫座標:傳遞依賴
B依賴C,C是A的傳遞依賴。
三、中間部分:傳遞依賴的範圍,A依賴C的範圍。
情景再現:
項目A依賴於項目B,項目B依賴於項目C(v1), 項目A依賴於項目D,項目D依賴於項目E,項目E依賴於C(v2),
一、A--->B---->C(v1) ,
二、A------>D---->E----->C(v2)
項目A隱形依賴了兩個版本的C,那到底採用哪一個版本呢?
分析:
依賴調解第一原則:路徑優先,很明顯,第一種路徑深度是3,第二種路徑深度是4,因此,maven會採用C(v1)
依賴調解第二原則:聲明優先,假設路徑深度相等,那麼聲明在前的會被引用。
在Maven中dependencyManagement的做用其實至關於一個對所依賴jar包進行版本管理的管理器。
pom.xml文件中,jar的版本判斷的兩種途徑
1.若是dependencies裏的dependency本身沒有聲明version元素,那麼maven就會倒dependencyManagement裏面去找有沒有對該artifactId和groupId進行過版本聲明,若是有,就繼承它,若是沒有就會報錯,告訴你必須爲dependency聲明一個version。
2.若是dependencies中的dependency聲明瞭version,那麼不管dependencyManagement中有無對該jar的version聲明,都以dependency裏的version爲準。
咱們仔細觀察Maven Dependencies 下的jar包,會發現存在了兩個javassist包,一個是 javassist-3.18.1-GA. ,另外一個是javassist-3.11.0-GA 。這是由於咱們引入三大框架的jar包,hibernate依賴javassist-3.18.1-GA ,而struts 依賴javassist-3.11.0-GA 。這就是咱們一般所說的jar包版本衝突,若是這兩個jar包同時存在,會致使後續某些操做會存在問題(好比openSessionInView失效),因此須要排除低版本的jar包。
如何來排除依賴呢?添加下面紅色字體的部分。做用是排除struts中依賴的javassist的jar
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.24</version> <exclusions> <exclusion> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency> |
添加後發現javassist-3.11.0-GA消失。