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害人啊。
感谢大佬。