Java 为什么可以';我不能在JBoss上的Solr中实例化DataImportHandler吗?

Java 为什么可以';我不能在JBoss上的Solr中实例化DataImportHandler吗?,java,jboss,solr,dih,Java,Jboss,Solr,Dih,我正试图在JBoss5.1上设置Solr3.5.0。一切都很好。我将war复制到deploydir中,将dist和contrib目录中的所有依赖项复制到lib(或更早的deploy)目录中 我可以启动一台服务器,一切正常,但每当我想激活DataImportHandler为数据库中的数据编制索引时,就会出现一个错误 基本上,我所做的是复制我从example/example DIH/solr/db(或整个示例,这无关紧要)复制一个core,我在solr.xml中注册core,在启动时我得到一个错误:

我正试图在JBoss5.1上设置Solr3.5.0。一切都很好。我将war复制到deploydir中,将dist和contrib目录中的所有依赖项复制到lib(或更早的deploy)目录中

我可以启动一台服务器,一切正常,但每当我想激活DataImportHandler为数据库中的数据编制索引时,就会出现一个错误

基本上,我所做的是复制我从example/example DIH/solr/db(或整个示例,这无关紧要)复制一个core,我在solr.xml中注册core,在启动时我得到一个错误:

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>

dataimport.xml

据我所知,这个错误可能是由于DataImportHandler和SolrRequestHandler可能持有不同的类装入器引起的

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


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

这是一个类加载器问题,根据这一点,您需要执行以下操作:


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


有关更多详细信息,请参阅帖子。

Paige Cook的回答是正确的,但我想补充一些细节。我认为您将dataimporthandler jar放入了应用服务器的公共lib目录中,而所有solr jar都在
solr.war的
WEB-INF/lib
中。这意味着您正在从另一个类加载器加载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类加载器使用的路径中。为了定义这样的库路径,有许多选项。 Solr的旧版本(4.x及更旧版本)接受标记中的属性:

<solr persistent="false" sharedLib="lib"></solr>
即使在这种情况下,
lib
路径也相对于
solr.home
(其中
solr.xml
所在)


另一种选择是直接在
solrconfig.xml
中定义,您解决了吗?我们的答案不是很有用吗?是的,是的,多亏了他们,我终于成功了,尽管当时我发现使用附带的jetty服务器更容易。可能是“在solrconfig.xml中指定的路径”的重复。。你能描述一下吗?我们需要在solr/conf文件夹中添加jar吗?
<?xml version='1.0' encoding='UTF-8'?>
<solr>
  <str name='sharedLib'>lib</str>
</solr>