分享人:蒋新益
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
有人认为Maven是一个依赖管理工具,当然这种想法是错误的(确切的说Maven是一个项目管理工具,贯穿了整个项目生命周期,编译,测试,打 包,发布...),但Maven给人造成这种错误的印象也是有原因的,因为Maven的依赖管理十分强大,用好了Maven,你不再需要面对一大堆jar 感到头大,依赖冲突,无用依赖等问题也能够得到有效的防止和解决。
maven在依赖管理中有以下几个原则
依赖是使用Maven坐标来定位的,而Maven坐标主要由GAV(groupId, artifactId, version)构成。如果两个相同的依赖包,如果groupId, artifactId, version不同,那么maven也认为这两个是不同的。
依赖会传递,A依赖了B,B依赖了C,那么A的依赖中就会出现B和C。
Maven对同一个groupId, artifactId的冲突仲裁,不是以version越大越保留,而是依赖路径越短越优先,然后进行保留。
依赖的scope会影响依赖的影响范围。
怎么解决依赖冲突
以idea为例,在打开的pom.xml文件上右键Diagrams--Show Dependencies,就可以看到了。
随着项目的增大,你的依赖越来越多,比如说你依赖了一堆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
参考二:maven scope含义的说明
参考三:Maven依赖管理
参考四:如何快速的解决Maven依赖冲突
欢迎大家交流和讨论
感谢大家观看
BY : 蒋新益