记一次java.lang.NoSuchMethodError: org.apache.http.conn.ssl.SSLConnectionSocketFactory报错解决


sprintboot项目,因为项目需要上传文件至阿里云。引入了阿里云oss的sdk。

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>            

项目中原来就用过阿里云oss的sdk,版本较老2.8的版本。因为种种原因,有两年没有用过相关功能了。所以这次升级了sdk版本。

本来以为是个简单的功能。老版本sdk也是我接入的么,没啥问题。

万万没想到!!!本地idea里面开发跑的好好的。通过jekins打包发版到测试环境上ossClient初始化报错了!!!

报错内容:

java.lang.NoSuchMethodError: org.apache.http.conn.ssl.SSLConnectionSocketFactory.<init>(Ljavax/net/ssl/SSLContext;Ljavax/net/ssl/HostnameVerifier;)V at com.aliyun.oss.common.comm.DefaultServiceClient.createHttpClientConnectionManager(DefaultServiceClient.java:244) at com.aliyun.oss.common.comm.DefaultServiceClient.<init>(DefaultServiceClient.java:85) at com.aliyun.oss.OSSClient.<init>(OSSClient.java:209) at com.aliyun.oss.OSSClient.<init>(OSSClient.java:129)

纳尼?本地是好的呀。这是什么情况?

 

百度后,大部分人说是jar冲突了。oss的sdk要求的httpclient的版本是4.4.1,把版本改成4.4.1及以上就好了。

我们项目的httpclient版本就是4.4.1。改成了4.5.2,放在服务器上还是报错。

 

继续百度如何查看项目的jar冲突。

1.使用idea自带的Maven工具查看项目依赖关系,具体地址如下

https://www.jianshu.com/p/a8a77d6262ed

https://blog.csdn.net/iechenyb/article/details/76945238

2.下载了一个maven tree插件,方便查看哪些jar有冲突。

我们项目历史悠久,添加了各种引用,很臃肿。所以冲突很多。好不容易通过exclusions把httpclient的各种冲突解决了。

     <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
            <exclusions>
                <exclusion>
                    <artifactId>httpclient</artifactId>
                    <groupId>org.apache.httpcomponents</groupId>
                </exclusion>
            </exclusions>
        </dependency>

到服务器上试了一下,还是报错。这就尴尬了。

 

继续百度,有人说虽然本地只有新版本的的httpclient的jar包,但是服务器上项目打包里面还是有旧版本的jar包,删掉就好了。

费了好大的劲,去测试服务器上把项目的jar包当了下来,解压查看发现里面只有一个httpclient的jar包,版本号是对的。

那么,问题在哪里呢?包没问题啊!

在本地通过java -jar  xxx.jar运行项目。ossClient初始化报错。

难道是jekins打包有问题?

于是通过idea本地打包mvn clean package -DskipTests

运行本地打的包,依然报错。

 

继续百度,看到了阿里云oss的常见问题:

https://help.aliyun.com/document_detail/32024.html?spm=a2c4g.11186623.6.993.7b63250beCij8A

难道不是httpclient的问题,会不会是oss引用的其他的包有问题?

把oss的所有引用都检查了一遍,没有冲突,没有问题。

 

怎么办?完全没有头绪了。使出绝招求助大佬,大佬说是jar包冲突了,也有可能是哪个jar包把httpclient里的方法复写掉了。

到底是哪里冲突了呢?

大佬太忙了,面试去了。

把External Libraries里的所有jar包都点开看了一遍,除了httpclient的jar包没有org.apache.http.conn.ssl.SSLConnectionSocketFactory文件。

不知道怎么办的时候,安卓问我们有没有引入过本地的包。回答安卓说有啊,比如说易观方舟的sdk就是本地包。

突然灵光一闪,易观方舟数据埋点也是需要http连接的么。

点开一看,果然是他!!!

他把httpclient的源码拉进去了,并且把SSLConnectionSocketFactory里的方法改了!!!

 

 

 

正规的httpclient里的方法

 

 

 气坏了!!!这也太没素质了吧!!!

 

至此找到了问题。

耗时一天半,被易观坑了。不正规的sdk害人啊。

 

感谢大佬。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM