一、依赖管理
1.1、依赖声明
dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
1.2、依赖管理原理
1.3、依赖范围
依赖范围scope | 主代码classpath有效性 | 测试代码classpath有效性 | 运行时classpath有效性 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | - | Y | jdbc driver |
- compile:编译范围,默认scope,在工程环境的classpath(编译环境)和打包(如果是war包,会包含在war包中)时候都有效
- provided:表示该jar包已由容器(tomcat)或jdk,只在编译的classpath中使用,打包时不包含在目标包中。常见的:servlet-api和jsp-api等由目标容器提供,无需打包到war包中。如果不配置为provided,在tomcat6+会出现包冲突。
- runtime:一般是运行和测试环境使用,编译时不加入classpath,打包时会打包到目标包中。一般是通过动态加载或反射加载。也就是说程序只使用了接口,具体的时候可能有多个,运行时通过配置文件或jar包扫描动态加载的情况。典型的包括:JDBC驱动等
- test:单元测试场景使用,编译时加入classpath,打包时不加入。如:junit
二、依赖传递
2.1、直接依赖和间接依赖
如果B中使用A,C中使用B,那么B是C的直接依赖,A是C的间接依赖。
2.2、依赖范围对传递依赖的影响
- (1) 当第二依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致。
- (2) 当第二直接依赖的范围是test的时候,依赖不会得以传递。
- (3) 当第二依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依
- 赖的范围同样为 provided;
- (4) 当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但
- compile例外,此时传递的依赖范围为runtime;
2.3、依赖冲突
- 如果直接依赖与间接依赖包含同一坐标不同版本的依赖资源,以直接依赖的版本为准(就近原则)
- 如果直接依赖中包含同一坐标的不同版本,以配置顺序下方的版本为准(就近原则)
2.4、可选依赖
optional:true、false用于设置是否可选,也可以理解为jar包是否向下传递。
true,不传递;false,传递;默认为false
2.5、排除依赖
在直接依赖的配置里面添加 exclusions→exclusion 元素,指定要排除依赖的 groupId 和 artifactId,不需要添加版本号
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>