1. 程式人生 > >Java中httpclient.jar和httpcore.jar版本差異帶來的異常

Java中httpclient.jar和httpcore.jar版本差異帶來的異常

前言說明:當前我的工程中使用的httpclient-4.3.6.jar和httpcore-4.3.3.jar版本的包。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.3.3</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.3
.6</version> </dependency>

今天執行阿里雲的OSS相關操作時,首先提示以下異常:

java.lang.ClassNotFoundException: org.apache.http.ssl.TrustStrategy

詳細如下:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy
    at com.aliyun.oss.OSSClient.<init>(OSSClient.java:246
) at com.aliyun.oss.OSSClient.<init>(OSSClient.java:206) at com.autonavi.oss.client.DefaultOSSClient.<clinit>(DefaultOSSClient.java:12) at com.autonavi.oss.put.Upload.put(Upload.java:20) at com.autonavi.oss.put.Upload.main(Upload.java:58) Caused by: java.lang.ClassNotFoundException: org.apache.http.ssl.TrustStrategy at java.net.URLClassLoader$1.
run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 5 more

從上面報錯提示可以看出,是org/apache/http/ssl/TrustStrategy下面找不到TrustStrategy這個類,我查了下依賴中的httpclient-4.3.6.jar和httpcore-4.3.3.jar兩個包,均沒有這個類。
這裡寫圖片描述

而4.4版本中有ssl路徑:
這裡寫圖片描述
及對應org/apache/http/ssl/TrustStrategy方法。
這裡寫圖片描述
很明顯是版本不對,應該換成新版本。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4</version>
</dependency> 

重新執行程式碼,上面異常已經消失,不過出現新異常:

java.lang.NoClassDefFoundError: org/apache/http/conn/ssl/NoopHostnameVerifier

異常詳細:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/conn/ssl/NoopHostnameVerifier
    at com.aliyun.oss.common.comm.DefaultServiceClient.createHttpClientConnectionManager(DefaultServiceClient.java:230)
    at com.aliyun.oss.common.comm.DefaultServiceClient.<init>(DefaultServiceClient.java:78)
    at com.aliyun.oss.OSSClient.<init>(OSSClient.java:246)
    at com.aliyun.oss.OSSClient.<init>(OSSClient.java:206)
    at com.autonavi.oss.client.DefaultOSSClient.<clinit>(DefaultOSSClient.java:12)
    at com.autonavi.oss.put.Upload.put(Upload.java:20)
    at com.autonavi.oss.put.Upload.main(Upload.java:58)
Caused by: java.lang.ClassNotFoundException: org.apache.http.conn.ssl.NoopHostnameVerifier
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 7 more

很明顯是版本不對,是由於httpclient-4.3.6.jar缺少NoopHostnameVerifier方法:
這裡寫圖片描述

而4.4版本中有這個方法:
這裡寫圖片描述
應該換成新版本,即換成httpclient-4.4.jar

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.4</version>
</dependency>   

檢視下jar包中相應路徑存在上面那個類。

最後再次執行,執行成功,無異常!

所以,下次碰到以下兩個異常時:
1、

java.lang.ClassNotFoundException: org.apache.http.ssl.TrustStrategy

2、

java.lang.NoClassDefFoundError: org/apache/http/conn/ssl/NoopHostnameVerifier

需要升級httpclient.jar和httpcore.jar兩個包的版本,4.3的版本中不含有上述兩個類,需要同時升級到4.4版本。

即替換為httpclient-4.4.jar和httpcore-4.4.jar