使用Solr 9+的Http2SolrClient Builder时如何解决NoClassDefFoundError?
解决Http2SolrClient初始化时的NoClassDefFoundError问题
问题根源
Spring Boot 2.7.13默认依赖的Jetty版本(9.4.x)与SolrJ 9.2.0所需的Jetty版本(11.x)存在冲突,导致org.eclipse.jetty.http.HttpFields$Mutable类缺失——该类是Jetty 10及以上版本才新增的,而Spring Boot 2.7.x自带的Jetty版本过低,无法提供这个类。
可行解决方案
方案1:用Solr BOM统一依赖版本
在Maven的dependencyManagement中引入Solr的BOM,让它自动管理所有Solr相关依赖(包括其依赖的Jetty组件)的版本,避免冲突:
<dependencyManagement> <dependencies> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-bom</artifactId> <version>9.2.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
保持原有的solr-solrj依赖即可,无需额外添加Jetty相关依赖。
方案2:手动排除冲突依赖并引入兼容版本
如果不想使用BOM,可以在solr-solrj依赖中排除Spring Boot管理的Jetty组件,同时直接引入Solr 9.2.0兼容的Jetty版本:
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>9.2.0</version> <exclusions> <!-- 排除所有Spring Boot管理的Jetty依赖 --> <exclusion> <groupId>org.eclipse.jetty</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入Solr 9.2.0适配的Jetty核心依赖 --> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-http</artifactId> <version>11.0.15</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-client</artifactId> <version>11.0.15</version> </dependency> <dependency> <groupId>org.eclipse.jetty.http2</groupId> <artifactId>http2-client</artifactId> <version>11.0.15</version> </dependency>
注:可以通过mvn dependency:tree命令查看Solr 9.2.0实际依赖的Jetty版本,确保引入的版本与之完全一致。
方案3:升级Spring Boot版本
如果项目允许,升级到Spring Boot 3.x系列版本(如3.1.x),该版本默认依赖的Jetty版本为11.x,与Solr 9.2.0的依赖完全兼容,无需额外调整依赖配置。
验证步骤
修改依赖后,执行mvn clean install重新构建项目,启动应用后Http2SolrClient的初始化即可正常完成,不会再触发NoClassDefFoundError异常。
内容的提问来源于stack exchange,提问作者Marek Bernád
相关产品推荐
相关产品推荐

