1.引入依赖

可以引用任何你需要的依赖

C C

1.1依赖范围


maven有三套classpath,classpath,就是项目中用到的各种依赖的类,jvm在运行的时候需要去classpath下面加载对应的类

有如下参数:

compile 默认,对编译、测试和运行的classpath都有效。

test 仅仅对于运行测试代码的classpath有效,编译或者运行主代码的时候无效

provided:编译和测试的时候有效,运行时无效
场景:比如servlet-api,tomcat已经自带了,运行的时候不需要,但是编译的时候需要,由于jvm双亲委派机制,所以编译的时候需要引用

runtime 测试和运行classpath有效,但是编译代码时无效,
场景:比如mysql驱动包,开发都是基于javax.sql包下面开发,只有运行的时候会用到,编译不需要

1.2 传递性依赖

maven的传递性依赖,就是说会自动递归解析所有的依赖

传递性依赖机制对依赖范围也是有影响的,比如下面的表格,第一列是一级依赖,第一行是二级依赖,传递性依赖会导致多级依赖的依赖范围交叉在一起,会有影响:
比如我依赖A,A是compile范围 ,A依赖B,B是runtime,我和B的关系是 runtime
如图:

compile test provided runtime
compile compile

runtime
test test

test
provided provided
provided provided
runtime runtime

runtime

1.3 依赖调节

传递性依赖深入去讲解的,既然说maven会自动解析所有层级的依赖,给我们自动下载所有的依赖,但是可能会出现依赖冲突的问题

比如:A->B->C->X(1.0),
A->D->X(2.0),
A有两个传递性依赖X,不同的版本

就产生了依赖冲突的问题,maven如何解决呢?依赖调解的机制

1.此时就会依赖调解,就近原则,离A最近的选用,就是X的2.0版本

2.路径等长呢?那么会选择第一声明原则,哪个依赖在pom.xml里先声明,就用哪个

1.4 可选依赖

简单说我要依赖spring,spring依赖了log4j,间接的等于我也依赖了 log4j,但是我此时我本地也引入可log4j
但是我不想用spring依赖的log4j咋办?

在引入spring的时候加上可选依赖optional,默认传递false,需要改为true, 这样就不能传递了

40true

此时依赖传递失效,不会向上传递

1.5 类型

默认为jar 参数 ,jar,pom,war

pom:
场景:当我们需要引入很多jar包的时候会导致pom.xml过大,我们可以想到的一种解决方案是定义一个父项目,但是父项目只有一个,也有可能导致父项目的pom.xml文件过大。这个时候我们引进来一个type为pom,意味着我们可以将所有的jar包打包成一个pom,然后我们依赖了pom,即可以下载下来所有依赖的jar包

2.依赖冲突

2.1 产生依赖冲突的原因

我们时常看到整合一个包,结果 class not found 说某某方法找不到

这个问题怎么产生的呢 maven不是有依赖调节(1.3)吗,会自动给我们选择一个依赖,不会冲突呀?

如果maven选错了呢?

依赖图如下 A依赖B,B依赖C,C依赖X(2.0)
A依赖B,D依赖X(1.0)
此时:

根据maven依赖调节就近原则会选择X1.0版本,结果B项目需要2.0的版本 结果 class not found xxxxxxx

2.2 定位

2.2.1命令行:mvn dependency:tree

此命令行会显示出各个依赖关系

2.2.2 插件: maven helper(推荐)

IDEA安装 maven helper 插件很好用 会显示出各个依赖关系

2.3解决

2.3.1 可选依赖

0true

2.3.2 排除依赖

0

C C