为什么我不能在JBoss上的Solr中实例化DataImportHandler?

问题描述 投票:4回答:3

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

我可以启动服务器,一切正常,但每当我想激活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服务器)它运行正常。

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

java jboss solr dih
3个回答
8
投票

这是一个类加载器问题,根据这个post on the Lucene Developer Mailing List,您需要执行以下操作:

确保dataimport jar不在类路径中,而不是由其他类加载器加载,而是从solrconfig.xml中指定的路径加载。这将确保dataimport类由同一个类加载器加载。

有关详细信息,请参阅主题。


1
投票

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

<?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。


0
投票

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

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

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

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

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

另一种选择是将lib directive直接定义为solrconfig.xml

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