1. 程式人生 > >解決maven工程下java.lang.ClassNotFoundException: org.apache.http.ssl.SSLContexts問題

解決maven工程下java.lang.ClassNotFoundException: org.apache.http.ssl.SSLContexts問題

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