大家好,我是IT修真院上海分院第2期的学员蒋新益,一枚正直纯洁善良的JAVA程序员
今天给大家分享一下,修真院官网JAVA任务七,深度思考中的知识点——如何处理maven的依赖冲突?
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 scope含义的说明
参考三:Maven依赖管理
参考四:如何快速的解决Maven依赖冲突
8.更多讨论
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~
作者:蒋新益
链接:http://www.jnshu.com/login/1/15188308
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。