升级solr-solrj-8.11.3后出现KeeperException$NoNodeException类未找到异常
问题背景
原Java应用使用solr-solrj-6.6.1.jar与Apache Solr 8/9通信,因安全漏洞升级到solr-solrj-8.11.3.jar后编译成功,但运行时无法获取任何集合,抛出如下异常:
2024-05-15; 16:03:40.800 ***** exception: (hash:376089095) java.lang.NoClassDefFoundError: org/apache/zookeeper/KeeperException$NoNodeException
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:698)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:266)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:248)
at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:225)
at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:242)
原因分析
SolrJ 8.x版本的HttpSolrClient内部隐式依赖ZooKeeper相关类(即使仅使用HTTP连接方式),升级后项目缺失对应的ZooKeeper依赖包,导致运行时类加载失败。
解决方案
方案1:引入完整SolrJ依赖(推荐)
如果使用Maven管理依赖,直接引入solr-solrj即可自动拉取兼容的ZooKeeper依赖:
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>8.11.3</version> </dependency>
若手动管理jar包,需从Solr 8.11.3官方发布包中提取对应的zookeeper.jar(适配版本通常为3.4.14),添加到项目classpath中。
方案2:排除ZooKeeper依赖(仅确认无需ZooKeeper功能时使用)
若明确仅使用HTTP连接,无ZooKeeper相关需求,可在Maven中排除ZooKeeper依赖:
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>8.11.3</version> <exclusions> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency>
注意:此方式存在潜在风险,若SolrJ内部逻辑隐式依赖ZooKeeper类,仍可能触发报错,优先选择方案1。
内容的提问来源于stack exchange,提问作者crimson_joey

