我正在尝试 Solr v9.3 来测试它们的功能。我使用 Spring Boot v3.1.1 创建了一个测试应用程序,并包含了一个使用
EmbeddedSolrServer
的小测试。
没有那么多代码,是基于我找到的一些例子:
EmbeddedSolrServer solrClient = new EmbeddedSolrServer(solrHome, coreName);
// create a test document
SolrInputDocument document1 = new SolrInputDocument();
document1.addField("id", "1");
SolrInputDocument document2 = new SolrInputDocument();
document2.addField("id", "2");
solrClient.add(Arrays.asList(document1, document2));
问题是执行时,我得到一个:
java.lang.NoClassDefFoundError: javax/ws/rs/core/Application
at org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.<init>(EmbeddedSolrServer.java:98)
...
通常,解决这个bug的方法是添加一些依赖,比如:
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
<version>2.1.6</version>
</dependency>
但是现在,我得到了:
java.lang.NoClassDefFoundError: jakarta/ws/rs/core/Configurable
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1013)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.<init>(EmbeddedSolrServer.java:98)
...
这可能意味着 Solr 尚未准备好使用
jakarta
软件包,因此与 Sprint Boot 3.X 不兼容。有人在 Spring Booty 3.X 中成功使用 Solr EmbeddedSolrServer 吗?或者知道(还)不兼容?
您是对的,由于 Jetty 版本不同,Spring Boot 将不兼容 Solr 9.x。
我们预计在 2024 年末发布基于 Jetty 12 的 Solr 10.0,这应该与两者的
jakarta
命名空间保持一致。
请注意,不建议使用 EmbeddedSolrServer,它是罕见用例的专家选项。这将导致整个
solr-core
应用程序及其所有依赖项在您的应用程序中运行,并有导致更多库冲突的风险。
更好的选择是将 Solr 作为服务器启动(例如通过 Docker 使用
docker run -p 8983:8983 solr:9
),然后使用 SolrJ 客户端连接到 Solr 服务器。然后,您可以通过从 Maven SolrJ 导入中排除所有 HttpSolrClient
依赖项来使用 SpringBoot 3 和 jetty
,以避免 javax/jakarta 冲突。排除 jetty 类是安全的,因为 HttpSolrClient
取决于不同的 http 客户端。