解決maven工程下java.lang.ClassNotFoundException: org.apache.http.ssl.SSLContexts問題
阿新 • • 發佈:2019-01-02
maven座標:
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>4.10.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.1</version> </dependency>
maven工程中,發現使用tomcat外掛啟動web工程時,控制檯報如下錯誤:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.http.impl.conn.PoolingHttpClientConnectionManager]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/apache/http/ssl/SSLContexts at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1086) ... 22 more Caused by: java.lang.NoClassDefFoundError: org/apache/http/ssl/SSLContexts at org.apache.http.conn.ssl.SSLConnectionSocketFactory.getSocketFactory(SSLConnectionSocketFactory.java:172) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.getDefaultRegistry(PoolingHttpClientConnectionManager.java:109) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:116) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) ... 24 more Caused by: java.lang.ClassNotFoundException: org.apache.http.ssl.SSLContexts at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) ... 32 more
一開始,以為自己沒有加入httpclient的maven座標,但是pom檔案所依賴的paraent工程,含有該座標,而且工程中Maven Dependencies開啟裡面也有該jar包,然後自己clean工程,maven update,發現各種跟工程和maven的清理都無關係,到了第二天,發現pom檔案中solrJ這個座標,覺得solrJ應該會依賴httpclientjar包,因為該jar包裡面有對solr伺服器發起請求的api,於是自己看了下依賴,果然solrJ會對httpclient產生依賴,但本工程在開發過程中去掉了關於solr的功能,於是把solrJ座標註釋掉,重新啟動工程,發現問題解決。下面是加了solrJ座標和不加solrJ座標的Maven Dependencies差異。
或者使用6.1.0版本的solrJ,這個版本的SolrJ依賴的是4.4.1的httpcore。與maven中httpclient的4.5.1版本不產生依賴衝突,但是這個solrJ最低支援JAVA8,低版本的java會報,這個錯誤“Unsupported major.minor version XXXX”。
官網上對Solr6的要求是這麼說的:The minimum supported version of Java for Solr 6 (and the SolrJ client libraries) is now Java 8.。
或者httpclient使用4.3的版本,這樣會相容4.10.2的solrJ