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, 这样就不能传递了
40
1.5 类型
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 可选依赖
0
2.3.2 排除依赖
0
C C
