开发者学堂课程【项目管理工具Maven学习:依赖冲突解决】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/23
依赖冲突与解决
什么是依赖冲突
依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成类包版本冲突
依赖冲突的原因
依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,从而造成类包冲突
如何解决依赖冲突
首先查看产生依赖冲突的类jar,其次找出我们不想要的依赖类jar,手工将其排除在外就可以了。具体执行步骤如下:
1、查看依赖冲突
2、解决冲突
3、锁定版本
1、初始化失败是由于反射生成这个Javassist引起的,想要解决这个问题首先需要去改变user-dao下的build path
需要先把1.5的包删掉,再把它改成1.7在进行测试
发现在运行系统中没有javassist这个包,那现在就需要把javassit配置到运行系统当中去,需要去找一下版本
把这个javassit配置到运行系统当中去,此刻显示运行成功了。
综上就是maven如何排查依赖冲突以及解决方法,对于排查依赖个人比较推荐使用maven helper插件,至于解决依赖冲突个人推荐使用版本锁定的方法,此外dependencyManagement只是声明依赖,并不自动实现引入,因此子项目需要显示的声明需要用的依赖。
二、依赖范围
首先需要知道,Maven在编译项目主代码的时候需要使用一套classpath。比如:编译项目代码的时候需要用到spring-core,该文件以依赖的方式被引入到classpath 中。其次,Maven 在执行测试的时候会使用另外一套classpath。如:junito
最后在实际运行项目时,又会使用一套classpath,spring-core需要在该classpath中,而junit不需要。
所以依赖范围就是用来控制依赖与这三种classpath(编译classpath,测试classpath,运行时classpath)的关系,Maven有以下几种依赖范围:
1.Compile编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译,测试,运行都有效。
2.Test:测试依赖范围。只在测试的时候需要。比如junit
3.Provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试有效,但在运行时无效。典型的例子是servet-API,编译和测试项目的需要,但在运行项目时,由于容器已经提供,就不需要Maven重复地引入一遍。
4.Runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行有效,但在编译代码时无效。典型的例子是:jdbe驱动程序,项目主代码的编译只需要jdk提供的idbe接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体jdbc驱动。
5.System:系统依赖范围。一般不使用。
三、传递性依赖
传递依赖机制,让我们在使用某个a的时候就不用去考虚它依赖了什么。也不用担心引入多余的依赖。Maven 会解析各个直接依赖的POM,将那些心要的间接依赖,以传递性依赖的形式引)到当前项目中。
注意:传递依赖有可能产生冲突!!
冲突场景1:A--》B---》C(1.0)
A--》E--》C(2.0)
如果A下同时存在两个不同version的c,冲突!!
解决方法:第一声明者优先
四、排除依赖
在想排除一个范围的时候需要写groupID和artifactID就可以了。