pom.xml文件中jar包版本冲突问题的查找与解决
在开发过程中,遇到几次jar包版本冲突问题,下面是我解决该问题的方式,这篇文章内容包含如何查找版本冲突的jar包和版本冲突的解决,下面以我在项目中遇到的实际情况为例子来讲述:
背景:
最近项目中需要集成阿里OSS进行资源的存储,需要在pom.xml文件中引入oss依赖,该依赖里面间接引入了httpclient依赖,而之前项目中已经引入了httpclient依赖,这时就引起了jar包版本冲突问题
报错信息:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/conn/HttpClientConnectionManager
at com.aliyun.oss.OSSClient.(OSSClient.java:223)
at com.aliyun.oss.OSSClientBuilder.build(OSSClientBuilder.java:33)
at com.example.demo.test2.INit.main(INit.java:15)
Caused by: java.lang.ClassNotFoundException: org.apache.http.conn.HttpClientConnectionManager
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
… 3 more
java.lang.ClassNotFoundException: org.apache.http.conn.ssl.DefaultHostnameVerifier
查找问题原因:根据报错信息可以知道是jar问题
1、下图是集成OSS时新添加的依赖,按住Ctrl键再点击鼠标进入aliyun-sdk-oss依赖里面
2、发现aliyun-sdk-oss依赖里面包含了httpclient依赖,这与项目之前添加的httpclient依赖有冲突
3、项目中添加httpclient依赖版本是4.2.1,而oss依赖中的httpclent版本是4.4.1
4、我们来看看项目中哪个httpclient依赖版本生效,从下图可以看到,生效的是pom.xml直接引用的4.2.1版本,而不是oss中的传递依赖4.4.1版本,因为maven有路径近者优先原则
报错原因:pom.xml中httpclient依赖冲突,OSS Java SDK使用了Apache httpclient 4.4.1,而我的工程使用了与Apache httpclient 4.4.1冲突的Apache httpclient或commons-httpclient jar包。要查看工程使用的jar包及版本,在工程目录下执行mvn dependency:tree命令或者如上图一样查看Maven。如下图所示,我的工程里使用了Apache httpclient 4.2.1版本,而OSS中的类不支持httpclient4.2.1版本,支持httpclient4.4.1版本
问题解决:
包冲突有以下两种解决方法:
1、使用统一版本。如果工程使用与Apache httpclient 4.4.1冲突的版本,就使用4.4.1版本,并在pom.xml删除其它版本的Apache httpclient依赖。如果工程使用了commons-httpclient,也可能存在冲突,请删除commons-httpclient。
2、解除依赖冲突。如果工程依赖多个第三方包,而第三方包又依赖不同版本的Apache httpclient,工程里会有依赖冲突,使用exclusion解除。
欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感谢。觉得本文章有帮助到的,点个赞呗
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)