使用SolrJ管理索引库时,报错:java.lang.NoSuchMethodError: org.apache.http.impl.conn.PoolingHttpClie...
问题描述
今天碰到一个问题,那就是在使用SolrJ管理索引库时,报了一个如下这样一个错误,具体错误信息记录如下:
java.lang.NoSuchMethodError: org.apache.http.impl.conn.PoolingHttpClientConnectionManager.setValidateAfterInactivity(I)V
at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:279)
at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:330)
at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:268)
at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:255)
at org.apache.solr.client.solrj.impl.HttpSolrClient.<init>(HttpSolrClient.java:204)
at org.apache.solr.client.solrj.impl.HttpSolrClient$Builder.build(HttpSolrClient.java:952)
at com.taotao.search.test.SolrJTest.testSolrJAddDocument(SolrJTest.java:19)
下面我给出了我的测试代码,你能看懂我写的啥吗?
这里,我还得说明一点,我使用的Solr是Solr 8.4.0
这个版本。
报错原因
根据堆栈错误信息,咱们从下往上一直追踪,可以发现org.apache.solr.client.solrj.impl.HttpClientUtil类的createClient方法会调用org.apache.http.impl.conn.PoolingHttpClientConnectionManager类的setValidateAfterInactivity方法,但是在org.apache.http.impl.conn.PoolingHttpClientConnectionManager类中压根就没有setValidateAfterInactivity方法,所以就会报出java.lang.NoSuchMethodError这样的异常了。
解决方案
报错原因找到了,就是因为org.apache.http.impl.conn.PoolingHttpClientConnectionManager类中压根就没有setValidateAfterInactivity这个方法。
那么怎么解决这个错误呢?这个org.apache.http.impl.conn.PoolingHttpClientConnectionManager类在httpclient-4.3.5.jar(SolrJ的依赖包)中,该jar包中的org.apache.http.impl.conn.PoolingHttpClientConnectionManager类确实是没有setValidateAfterInactivity这个方法的。
这就很很明显了,就是因为httpclient的版本有问题。从上图可以看出,我使用的httpclient的版本是4.3.5
,版本太低了,就导致了该版本jar包中的org.apache.http.impl.conn.PoolingHttpClientConnectionManager类没有setValidateAfterInactivity这个方法。
分析至此,解决方案就呼之欲出了,就是将使用的httpclient的版本调高点,例如修改成4.5.6
。
注意,父工程的pom文件是用于统一管理依赖版本号的,新建的工程依赖父工程的时候,就会继承父工程的pom文件中定义的依赖版本号信息,所以,当我们修改了父工程的pom文件,尤其是修改了版本号之后,一定要记得先clean一下父工程再重新install一下,如果你不这样做的话,那么后续会碰到一些问题会搞死你!
本文地址:https://blog.csdn.net/yerenyuan_pku/article/details/107485467