В настоящее время я работаю над пользовательским 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.