jar包冲突那些事,编译器不报错,启动报错

来源:互联网 发布:矩阵分解 als 编辑:程序博客网 时间:2024/05/01 07:03

      上周启动项目遇到了错误一,这周启动遇到错误二。

      在分布式系统中,那么多复杂繁琐的jar依赖,遇到jar包冲突是常有的事。

      假如,你也经常遇到这样的情况——明明编译的时候是好好的,可就是启动的时候不成功,明明jar包是有的,可就是报找不到类,或找不到方法?

      为了解决这样的困扰,遂写下此文,顺便聊一聊。

错误一:java.lang.NoClassDefFoundError:redis/clients/jedis/GeoUnit

错误二:java.lang.NoSuchMethodError: org.springframework.http.HttpMethod.matches


问题再述:明明jar包还在,却报找不到方法or类 ?

上面就根据错误一和错误二,分析下这些天遇到这两个典型的由于jar包冲突导致启动报错的问题。

错误一:java.lang.NoClassDefFoundError:redis/clients/jedis/GeoUnit
启动时报如上错误,乍一看,看到NoClass,还以为是缺包呢,或者包内容更改了,但是maven打包时用了旧包。可是idea或者eclipse编译的时候又没报错,况且这是jedis的类,没人会闲得无聊去修改jedis的内容吧。

这时候就在idea或者eclipse编辑框,搜索报错的类,点击去,查看类所在的包,记录下包版本号,注意看左上角。


得知ide编辑器使用的类所在版本包之后,打开启动报错的war包,如果是用spring-boot打的则是jar包,把包解开,查看lib目录下,都有哪些jar包,找到jedis包,猛然发现,jedis包被打包的居然是2.7.3版本的。再把2.7.3用反编译工具查看,jedis包2.7.3版本里面确实没有该类,而2.8.0版本的jedis jar包中,该类是存在的。问题找到了,利用maven排出jar包功能,把低版本的jedis排出,同时显示制定jedis高版本jar包。问题解决。


错误二:java.lang.NoSuchMethodError: org.springframework.http.HttpMethod.matches
用同样的方法,发现启动报错的包里,lib目录下,其他spring 包都是4.2.3版本,唯独spring-webmvc这个包是4.2.4版本,查看源码,HttpMethod这个类在spring-web这个jar包下,从maven下载4.2.3版本和4.2.4版本的spring-web包,利用反编译查看源码,发现,4.2.3版本里的HttpMethod确实没有matches方法,而4.2.4版本包里却有。问题找到了,之所以报错是因为4.2.4版本的spring-webmvc这个jar包用到了matches方法。所以把版本更改一致就解决了。

ClassNotFoundException
0 0