Spring Boot 3.1.1集成Solr 9.3 EmbeddedSolrServer遇类缺失问题求助
核心结论
Solr 9.x 版本的 EmbeddedSolrServer 目前确实未完全适配 Spring Boot 3.x 基于的 Jakarta EE 规范,二者存在兼容性冲突,这也是你遇到一系列 NoClassDefFoundError 的根本原因。
问题原因分析
第一个错误(缺失
javax.ws.rs.core.Application)
Spring Boot 3.x 彻底移除了对javax.*命名空间 API 的依赖,全面切换到 Jakarta EE 的jakarta.*包。但 Solr 9.3 的EmbeddedSolrServer在初始化时,内部仍依赖旧的javax.ws.rs相关类,导致类加载失败。添加 Jakarta 依赖后的错误(缺失
jakarta.ws.rs.core.Configurable)
你引入的jakarta.ws.rs-api是 Jakarta EE 规范的实现,但 Solr 内部代码是针对javax.ws.rs编写的,类路径中实际存在的是jakarta.ws.rs.core.Configurable,而 Solr 期望加载的是javax.ws.rs.core.Configurable,类名完全不匹配,因此报错依旧。
可行解决方案
1. 替代方案:使用 HttpSolrClient 连接独立 Solr 服务
放弃嵌入式的 EmbeddedSolrServer,改用 HTTP 方式连接独立部署的 Solr 服务器,这是目前最稳妥的方案,Spring Boot 3.x 与 Solr 9.x 的 HTTP 客户端兼容性良好。示例代码:
String solrServerUrl = "http://localhost:8983/solr/" + coreName; HttpSolrClient solrClient = new HttpSolrClient.Builder(solrServerUrl).build(); // 文档添加逻辑不变 SolrInputDocument document1 = new SolrInputDocument(); document1.addField("id", "1"); SolrInputDocument document2 = new SolrInputDocument(); document2.addField("id", "2"); solrClient.add(Arrays.asList(document1, document2)); solrClient.commit();
2. 临时 workaround(不推荐生产环境)
如果必须使用嵌入式服务器,可以尝试引入旧版的 javax.ws.rs API 依赖,但这会与 Spring Boot 3.x 的 Jakarta 依赖产生冲突,可能引发其他潜在问题:
<dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.1.1</version> </dependency>
3. 等待官方适配
Solr 社区正在推进 Jakarta EE 的迁移工作,后续版本可能会完成对 jakarta.* 包的全面支持,建议关注 Solr 官方版本更新日志。
内容的提问来源于stack exchange,提问作者King Midas

