記一次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