Maven依赖和冲突
- 2019 年 11 月 3 日
- 筆記
maven的核心就是依赖管理,在模块过多,之间的依赖关系也很复杂,maven提高了一个高效的管理方法。
<dependency> <groupId>工程组唯一标识</groupId> <artifactId>工程唯一标识</artifactId> <version>版本</version> <scope>依赖范围</scope> <optional>依赖可选</optional> <exclusions> <exclusion> <!-- 排除jar --> <groupId>com.alibaba</groupId> <artifactId>jconsole</artifactId> <!--注意这里没有写版本--> </exclusion> </exclusions> </dependency>
当A 依赖 B ,B 依赖C。 其中C是通过依赖传递给A,A中是有C的。 其中A不想依赖C 可以使用<exclusion>(不指定版本)或者<optional>(默认值false)
- scope取值: compile、provided、test、runtime、system、import
取值 |
范围 |
描述 |
---|---|---|
compile |
默认值,编译时、测试、运行 |
当前项目的类路径下有效 |
provided |
编译、测试 |
由运行时JDK或者容器(Idea)提供 |
test |
测试,运行 |
只在测试编译执行阶段 |
runtime |
运行时 |
在编译时不是必须的,执行时必须。类似JDBC |
system |
编译测试 |
从本地系统指定路径获取systemPath |
import |
导入阶段 |
只用在dependencyManagement中,和<type>pom</type>配合使用 |
- 依赖冲突
依赖冲突产生的原因:就像A引入了B和C,但是在B和C中都依赖了D,B依赖的D的1.0版本,C依赖了D的1.1版本。这是两个版本的D就有可能出现冲突,为什么是有可能? 因为依赖管理是根据两个版本的深度和谁先声明,来决定选谁。 比如: A->B->D(1.0)
A->C->E->D(1.1)
这时A就会选择D(1.0); 如果路径相同谁先声明使用谁。
依赖冲突大多场景:NoSuchMethod、NotFoundClass,方法类不一致。 解决方式:mvn denpendency:treee -->tree.tex
在当前目录打印出maven 依赖树生成tree.txt 文件,找出冲突的jar。
如何避免依赖冲突:项目中依赖的jar都有父POM < dependencyManagement>管理,其他模块使用import。