我正在尝试在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服务器)它运行正常。
我的问题是:这真的是因为类加载器问题还是其他一些问题?而且,更重要的是:我该如何解决?
这是一个类加载器问题,根据这个post on the Lucene Developer Mailing List,您需要执行以下操作:
确保dataimport jar不在类路径中,而不是由其他类加载器加载,而是从solrconfig.xml中指定的路径加载。这将确保dataimport类由同一个类加载器加载。
有关详细信息,请参阅主题。
Paige Cook的回答是正确的,但我想补充一些细节。我认为你将dataimporthandler jar放入应用程序服务器的公共lib目录中,而所有solr jar都在WEB-INF/lib
的solr.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。
正如Paige Cook所说,这是一个类加载器问题,你应该将dataimport jar添加到Solr类加载器使用的路径中。为了定义这样的lib路径,有很多选择。旧版本的Solr(4.x及更早版本)在标记中接受属性sharedLib
:
<solr persistent="false" sharedLib="lib"></solr>
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 directive直接定义为solrconfig.xml
,