依赖范围是用来控制依赖与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消失。