MAVEN依赖
2016-03-14 22:54
197 查看
MAVEN依赖
本文内容摘自《Maven实战》
每个
dependencies都可以包含一个或多个
dependency元素,用来声明一个或多个项目依赖,每个依赖包含的元素有:
groupId,artifactId,version:基本坐标
type:依赖类型,默认为
jar
scope:依赖的范围
optional:标记依赖是否可选
exclusions:排除传递性依赖
依赖范围
MAVEN在编译,测试,运行的时候会使用不同的
classpath,这也就产生的所谓的
依赖范围,依赖范围就是用来控制和
依赖和
classpath的关系。
MAVEN的依赖范围包含以下几种:
compile编译时依赖,默认使用该依赖,此范围下对编译,测试,运行都有效。
test测试时依赖,例如Junit
provided已提供依赖范围,对于编译和测试有效,运行时无效,例如
servlet-api
runtime运行时依赖,测试和运行时有效,编译主代码时无效,例如
jdbc驱动
system系统依赖范围,范围与
provided一致,但是需要通过
systemPath显示的指定依赖文件的路径,MAVEN仓库无法解析,与系统绑定,构建时不可移植,谨慎使用!
import导入依赖范围,不会对三种
classpath产生实质影响
scope | 编译 | 测试 | 运行 |
---|---|---|---|
compile | Y | Y | Y |
test | — | Y | — |
provided | Y | Y | — |
runtime | — | Y | Y |
system | Y | Y | — |
传递性依赖
MAVEN的传递性依赖机制在帮我们解决依赖问题的同时也帮助我们解决了相关的传递依赖问题。
)
传递性依赖和依赖范围
假设:A依赖于B,B依赖于C,那么A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖,第一直接依赖的范围和第二直接依赖的范围直接决定了传递性依赖的范围。如下图所示:
最左边一列为
第一直接依赖范围,最上面一列表示
第二直接依赖范围
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | — | — | runtime |
test | test | — | — | test |
provided | provided | — | provided | provided |
runtime | runtime | — | — | runtime |
依赖调解
MAVEN的传递性依赖机制,简化和方便了依赖声明,使我们只需要关心直接依赖,但是当传递性依赖造成问题的时候,我们就需要知道该传递性依赖是由哪条依赖路径引起的。
例如:
项目A有如下依赖关系:
A-->B-->C--X(1.0)
A-->D-->X(2.0)
X作为A的传递性依赖,两条路径对应两个不同版本的X,MAVEN为了避免
依赖重复,
MAVEN会选择其中一个进行解析,那么此时就涉及到MAVEN的依赖调解。MAVEN的依赖调解原则如下:
第一原则:路径最近者有限。
第二原则:第一声明者优先。
MAVEN默认执行第一原则,当路径相同时执行第二原则。
博客园地址--夙笺
相关文章推荐
- numpy中的tile函数
- 浅谈Javaweb经典三层架构和MVC框架模式
- java 结构型模式
- GitHub简单使用
- Hessian——轻量级远程调用方案
- bzoj 1816: [Cqoi2010]扑克牌
- 生成格雷码
- Android Framework 记录之一
- Editplus最佳配色方案
- CLOSE_WAIT状态的原因与解决方法
- LeetCode总结
- 位图的简单处理
- mac下tomcat的安装与配置
- NOJ 1656 搬砖
- 小儿思想养成与细胞学 学习分享
- 判断指定进程是否为x64的方法(在ntdll判断某个x64函数是否存在)
- leetcode 226: Invert Binary Tree
- JAVA BIO NIO AIO 意思和区别
- MXIC旺宏替换Spansion飞索 NOR and NAND目录
- 扒扒数据库长长知识(下载资源组合看)之 02(基本SQL SELECT语句)