Почему я не могу создать экземпляр DataImportHandler в Solr на JBoss? - PullRequest
4 голосов
/ 04 января 2012

Я пытаюсь настроить Solr 3.5.0 на JBoss 5.1. Все работает вполне нормально. Я скопировал войну в каталог deploy, все зависимости из каталогов 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 предположительно содержат разные загрузчики классов.

Всякий раз, когда я запускаю Solr из приложения start.jar в примере (я думаю, он запускает сервер Jetty), он работает нормально.

Мой вопрос: действительно ли это связано с проблемой загрузчика классов или с чем-то другим? И, что более важно: как это исправить?

Ответы [ 3 ]

8 голосов
/ 04 января 2012

Это проблема загрузчика классов, и в соответствии с этим сообщением в списке рассылки Lucene Developer вам необходимо сделать следующее:

убедитесь, что файлы импорта данных НЕв пути к классам и не загружается другими загрузчиками классов, но по пути, указанному в solrconfig.xml.Это гарантирует, что классы dataimport загружаются одним и тем же загрузчиком классов.

Более подробную информацию см. В потоке.

1 голос
/ 04 января 2012

Пейдж Кук ответ правильный, но я хотел бы добавить некоторые детали.Я думаю, вы поместили jar dataimporthandler в общий каталог lib вашего сервера приложений, в то время как все solr jar находятся внутри WEB-INF/lib из solr.war.Это означает, что вы загружаете JAR-файл dataimporthandler из другого загрузчика классов.Вы можете решить эту проблему, поместив ваши библиотеки 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 будет загружать файлы jar из этого внешнего местоположения через специальный загрузчик классов.

0 голосов
/ 25 февраля 2019

Как сказала Пейдж Кук, это проблема загрузчика классов, вы должны добавить jar-файлы dataimport в путь, используемый загрузчиком классов Solr.Чтобы определить такой путь к библиотеке lib, существует много опций.Старые версии 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,

...