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