尝试 Solr 9.3 与 Spring Boot 3

问题描述 投票:0回答:1

我正在尝试 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 吗?或者知道(还)不兼容?

spring-boot solr solrj
1个回答
0
投票

您是对的,由于 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 客户端。

© www.soinside.com 2019 - 2024. All rights reserved.