4

我正在尝试在 JBoss 5.1 上设置 Solr 3.5.0。一切都很好。我将war复制到deploy dir中,将dist和contrib目录中的所有依赖项复制到lib(或更早的deploy)目录中。

我可以启动服务器,一切正常,但是每当我想激活 DataImportHandler 以索引数据库中的数据时,都会出现错误。

基本上我所做的是我复制的是我从 example/example-DIH/solr/db 复制一个核心(或整个示例,没关系),我在 solr.xml 中注册核心,在启动时我收到一个错误:

15:17:10,707 SEVERE [RequestHandlers] org.apache.solr.common.SolrException: Error Instantiating Request Handler, org.apache.solr.handler.dataimport.DataImportHandler is not a org.apache.solr.request.SolrRequestHandler
at org.apache.solr.core.SolrCore.createInstance(SolrCore.java:427)
at org.apache.solr.core.SolrCore.createRequestHandler(SolrCore.java:461)
at org.apache.solr.core.RequestHandlers.initHandlersFromConfig(RequestHandlers.java:157)

我很确定我的请求处理程序定义是正确的,但只是为了确定:

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
  <str name="config">dataimport.xml</str>
</lst>

据我所知,这个错误可能是由 DataImportHandler 和 SolrRequestHandler 被认为是持有不同的类加载器引起的。

每当我从示例中的 start.jar 应用程序启动 Solr 时(我认为它启动了一个 Jetty 服务器),它都可以正常工作。

我的问题是:这真的是因为类加载器问题还是其他原因?而且,更重要的是:我该如何解决?

4

3 回答 3

8

这是一个类加载器问题,根据Lucene Developer Mailing List 上的这篇文章,您需要执行以下操作:

确保数据导入 jar 不在类路径中,也不是由其他类加载器加载,而是从 solrconfig.xml 中指定的路径加载。这将确保数据导入类由相同的类加载器加载。

请参阅线程以获取更多详细信息。

于 2012-01-04T14:53:58.580 回答
1

Paige Cook 的回答是正确的,但我想补充一些细节。我认为您将 dataimporthandler jar 放入应用程序服务器的公共 lib 目录中,而所有 solr jar 都WEB-INF/libsolr.war. 这意味着您正在从不同的类加载器加载 dataimporthandler jar。您可以通过将 solr 库放在不同的 lib(外部)目录中来解决它。然后在你的你应该通过属性solr.xml引用那个 lib 文件夹。sharedLib像这样的东西:

<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="false" sharedLib="lib">
    <cores adminPath="/admin/cores">
        <core name="core1" instanceDir="core1" />
    </cores>
</solr>

这样,Solr Web 应用程序将通过其特定的类加载器从该外部位置加载 jar。

于 2012-01-04T16:17:59.630 回答
0

正如 Paige Cook 所说,这是一个类加载器问题,您应该将 dataimport jar 添加到 Solr 类加载器使用的路径中。为了定义这样的库路径,有很多选项。Solr 的旧版本(4.x 和更早版本)接受sharedLib标签中的属性:

<solr persistent="false" sharedLib="lib"></solr>
  • sharedLib - 包含添加到每个核心的类路径中的 .jar 文件的目录的路径。路径是相对于solr.home(所在位置solr.xml)的。

较新版本的 Solr(5.x 和更新版本)用作元素sharedLib的子节点。solr

<?xml version='1.0' encoding='UTF-8'?>
<solr>
  <str name='sharedLib'>lib</str>
</solr>

即使在这种情况下,lib路径也是相对于solr.home(所在位置solr.xml)的。

另一种选择是将lib 指令直接定义到solrconfig.xml,

于 2019-02-25T17:28:00.367 回答