maven的依赖管理和怎么解决依赖冲突

小课堂

分享人:蒋新益

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

有人认为Maven是一个依赖管理工具,当然这种想法是错误的(确切的说Maven是一个项目管理工具,贯穿了整个项目生命周期,编译,测试,打 包,发布...),但Maven给人造成这种错误的印象也是有原因的,因为Maven的依赖管理十分强大,用好了Maven,你不再需要面对一大堆jar 感到头大,依赖冲突,无用依赖等问题也能够得到有效的防止和解决。

2.知识剖析

maven在依赖管理中有以下几个原则

依赖是使用Maven坐标来定位的,而Maven坐标主要由GAV(groupId, artifactId, version)构成。如果两个相同的依赖包,如果groupId, artifactId, version不同,那么maven也认为这两个是不同的。

依赖会传递,A依赖了B,B依赖了C,那么A的依赖中就会出现B和C。

Maven对同一个groupId, artifactId的冲突仲裁,不是以version越大越保留,而是依赖路径越短越优先,然后进行保留。

依赖的scope会影响依赖的影响范围。

3.常见问题

怎么解决依赖冲突

4.解决方案

以idea为例,在打开的pom.xml文件上右键Diagrams--Show Dependencies,就可以看到了。

5.编码实战

6.扩展思考

随着项目的增大,你的依赖越来越多,比如说你依赖了一堆spring的jar,有 org.spring.framework:spring-core, org.spring.framework:beans, org.spring.framework:spring-web, org.spring.framework:spring-mock。它们的groupId是相同的,artifactId不同。为了管理其版本,你对它 们进行过统一的升级,逐个的将version改成了最新版。但是,显然,当POM很大的时候你说不定会犯错误,而当版本不一致的时候,一些诡异的兼容性问 题就可能出现。

我们可以定义一个Maven属性,其名称为spring.version,值为4.1.3。在这个POM中,我们就能 用${spring.version}的方式来引用该属性。我们看到,所有spring相关的依赖的version元素现在都成 了${spring.version},当Maven运行的时候,它会自动用值4.1.3来替换这个引用。

如果没有idea,我们怎么查看依赖关系

mvn dependency:tree

7.参考文献

参考一:maven 依赖调解 依赖冲突 排除

参考二:maven scope含义的说明

参考三:Maven依赖管理

参考四:如何快速的解决Maven依赖冲突

8.更多讨论

欢迎大家交流和讨论

鸣谢

感谢大家观看

BY : 蒋新益