Solr java .lang.ClassNotFoundException: net .minidev. json .writer.JsonReaderI при выполнении DataImportHandler - PullRequest
0 голосов
/ 15 марта 2020

В настоящее время я работаю над пользовательским DataImportHandler для Solr 8.4.1 .

Я написал свой собственный класс процессора сущностей, в котором я использовал json -path библиотека. И хотя solr-dataimporthandler (который я должен импортировать в свой пользовательский класс), похоже, уже имеет зависимость json -path от себя, я хотел go безопасным способом и скомпилировал все необходимые классы в OparlEntityProccessor.jar .

Однако, когда я выполняю импорт данных через веб-интерфейс, я получаю эту ошибку:

Exception in thread "Thread-16" java.lang.NoClassDefFoundError: net/minidev/json/writer/JsonReaderI
            at com.jayway.jsonpath.internal.DefaultsImpl.<init>(DefaultsImpl.java:17)
            at com.jayway.jsonpath.internal.DefaultsImpl.<clinit>(DefaultsImpl.java:15)
            at com.jayway.jsonpath.Configuration.getEffectiveDefaults(Configuration.java:48)
            at com.jayway.jsonpath.Configuration.defaultConfiguration(Configuration.java:173)
            at com.jayway.jsonpath.internal.ParseContextImpl.<init>(ParseContextImpl.java:21)
            at com.jayway.jsonpath.JsonPath.parse(JsonPath.java:599)
            at com.github.fbecker97.OparlEntityProcessor.initOparlObjects(OparlEntityProcessor.java:55)
            at com.github.fbecker97.OparlEntityProcessor.init(OparlEntityProcessor.java:33)
            at org.apache.solr.handler.dataimport.EntityProcessorWrapper.init(EntityProcessorWrapper.java:77)
            at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:434)
            at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:415)
            at org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:330)
            at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:233)
            at org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:424)
            at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:483)
            at org.apache.solr.handler.dataimport.DataImporter.lambda$runAsync$0(DataImporter.java:466)
            at java.base/java.lang.Thread.run(Thread.java:830)
    Caused by: java.lang.ClassNotFoundException: net.minidev.json.writer.JsonReaderI
            at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:436)
            at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
            at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
            at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:555)
            at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
            ... 17 more

Банк находится в C: ... \ solr-8.4.1 \ server \ solr \ maincore \ lib и важная часть моего solrconfig. xml выглядит следующим образом:

  <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />

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

с этим пользовательским import-config. xml:

<dataConfig>
    <dataSource type="URLDataSource"
            connectionTimeout="3000"
            readTimeout="5000"
            baseUrl="..."/>

    <document>
        <entity name="oparl"
            processor="com.github.fbecker97.OparlEntityProcessor"
            transformer="LogTransformer"
            logTemplate="TEST: ${oparl.id}" logLevel="error" >


        </entity>
    </document>
</dataConfig>

То, что я знаю до сих пор ...

... заключается в том, что solr определенно находит jar и выполняет класс, в противном случае ошибка будет будь другим. В файле журнала даже говорится, что в загрузчик классов была добавлена ​​1 библиотека. Я также заглянул в банку, чтобы убедиться, что в нее входит «отсутствующий» класс net .minidev. json .writer.JsonReaderI. Итак ... почему Solr не находит его при выполнении импортера?

Есть еще одна странная вещь, которую я обнаружил, хотя технически это не должно иметь значения: как я уже говорил, solr и solr-dataimporthandler уже имеют зависимость com.jayway.jsonpath, что заставило меня задуматься, почему я даже пришлось включить эти зависимости в мою банку в первую очередь. Но потом я нашел это в solr / core / build.gradle:

implementation('com.jayway.jsonpath:json-path', {
    exclude group: "net.minidev", module: "json-smart"

Я не знаю много о gradle, но они, похоже, исключают важные классы, которые мне нужны, из их зависимостей. С другой стороны, я не уверен, как это будет иметь значение, поскольку я явно скомпилировал все необходимые классы в свой jar.

Кто-нибудь знаком с такой проблемой?

РЕДАКТИРОВАТЬ:

Теперь я написал еще один небольшой класс-обработчик для целей тестирования, и я включил некоторые вещи из другой внешней библиотеки под названием ejml. Сам Solr не имеет каких-либо зависимостей от этой библиотеки, как и прежде, чем я собрал все необходимые классы в jar.

На этот раз solr смог безупречно выполнить обработчик.

Это заставляет меня думать, что на самом деле происходят странные вещи с зависимостью json -path и вышеупомянутым исключением json -smart.

1 Ответ

0 голосов
/ 16 марта 2020

Решено!

Я удалил json -path-2.4.0.jar из ... \ solr-8.4.1 \ server \ solr-webapp \ webapp \ WEB-INF \ Lib. Таким образом, у solr нет другого выбора, кроме как поиск пропущенных классов в моей банке ... я думаю? Я до сих пор не знаю, что там происходит, но это работает так ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...