maven依赖范围及依赖传递
一、maven依赖范围
maven依赖范围就是用来控制依赖与三种classpath(编译,测试,运行)的关系,maven有以下几种依赖范围:
compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的maven依赖,对于编译,测试,运行三种classpath都有效。典型的例子是spring-core,在编译,测试,运行的时候都需要使用该依赖。
test:测试依赖范围。使用此依赖范围的maven依赖,只对于测试classpath有效,在编译主代码或运行项目的时候无法使用此类依赖。典型的例子就是junit,它只有在编译测试代码及运行测试的时候才需要。
provided:已提供依赖范围。使用此依赖范围的maven依赖对于编译和测试classpath有效,在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行的时候容器已经提供,就不需要重复引入了。
runtime:运行时依赖范围。使用此依赖范围的maven依赖对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC的驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
system:系统依赖范围。该范围与三种classpath的关系和provider依赖范围完全一致。但是使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径。由于此依赖不是通过maven仓库解析而且与本机系统绑定,可能造成构建的不可移植因此应该谨慎使用。systemPath元素可以引用环境变量。
1 <dependency>
2 <groupId>dm.jdbc</groupId>
3 <artifactId>DmDialect</artifactId>
4 <version>5.3</version>
5 <scope>system</scope>
6 <systemPath>${pom.basedir}/src/main/resources/lib/DmDialect-for-hibernate5.3.jar</systemPath>
7 </dependency>
import: 导入依赖范围。该依赖范围不会对三种classpath产生实际的影响
1 <dependency>
2 <groupId>org.springframework.cloud</groupId>
3 <artifactId>spring-cloud-dependencies</artifactId>
4 <version>${spring-cloud.version}</version>
5 <type>pom</type>
6 <scope>import</scope>
7 </dependency>
依赖范围与classpath的关系如下:
依赖范围(scope) | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 |
compile | Y | Y | Y | spring-core |
test | - | Y | - | JUnit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC实现 |
system | Y | Y | - | 本地的,maven仓库之外的类库文件 |
二、maven依赖传递
maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖。但有时候,当传递性依赖造成问题的时候,我们就需要清楚地知道该传递性依赖是从哪条依赖路径引入的。
例如,项目A有这样的依赖关系 : A-->B-->C-->X(1.0)、A-->D-->X(2.0),X是A的传递性依赖,但是两条依赖路径上有两个版 本的X,那么哪个X会被maven解析使用呢?两个版本都被解析显然是不对的,因为那会造成依赖重复,因此必须选择一个。maven依赖调解的第一原则:路径最近者优先。该例中X(1.0)的路径长度为3,而X(2.0)的路径长度为2,因此X(2.0)会被解析使用。
依赖调解第一原则不能解决所有问题,比如这样的依赖关系:A-->B-->Y(1.0),A-->C-->Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。那么到底谁会被解析使用呢?在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2020-09-08 索引优先队列
2020-09-08 二叉树解决折纸方向问题