Java中httpclient.jar和httpcore.jar版本差異帶來的異常
阿新 • • 發佈:2018-12-29
前言說明:當前我的工程中使用的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