您的位置:首页 > 其它

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编译测试运行
compileYYY
testY
providedYY
runtimeYY
systemYY

传递性依赖

MAVEN
的传递性依赖机制在帮我们解决依赖问题的同时也帮助我们解决了相关的传递依赖问题。



)

传递性依赖和依赖范围

假设:A依赖于B,B依赖于C,那么A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖,第一直接依赖的范围和第二直接依赖的范围直接决定了传递性依赖的范围。

如下图所示:

最左边一列为
第一直接依赖范围
,最上面一列表示
第二直接依赖范围


compiletestprovidedruntime
compilecompileruntime
testtesttest
providedprovidedprovidedprovided
runtimeruntimeruntime

依赖调解

MAVEN
的传递性依赖机制,简化和方便了依赖声明,使我们只需要关心直接依赖,但是当传递性依赖造成问题的时候,我们就需要知道该传递性依赖是由哪条依赖路径引起的。

例如:

项目A有如下依赖关系:

A-->B-->C--X(1.0)


A-->D-->X(2.0)


X作为A的传递性依赖,两条路径对应两个不同版本的X,MAVEN为了避免
依赖重复
,
MAVEN
会选择其中一个进行解析,那么此时就涉及到MAVEN的依赖调解。MAVEN的依赖调解原则如下:


第一原则:路径最近者有限。

第二原则:第一声明者优先。


MAVEN默认执行第一原则,当路径相同时执行第二原则。

博客园地址--夙笺

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: