Solr java.lang.ClassNotFoundException: net.minidev.json.writer.JsonReaderI 执行DataImportHandler时
Solr java.lang.ClassNotFoundException: net.minidev.json.writer.JsonReaderI when executing DataImportHandler
我目前正在为 Solr 8.4.1.
开发自定义 DataImportHandler
我编写了自己的实体处理器 class,其中我使用了 json-path 库。即使 solr-dataimporthandler(我必须在我的自定义 class 中导入)似乎已经对自身具有 json-path 依赖性,我想走安全的路并编译所有必要的 class进入OparlEntityProccessor.jar.
但是,当我通过 Web 界面执行数据导入程序时,出现此错误:
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[=12=](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
jar 位于 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>
使用此自定义导入-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然后执行class,否则报错就不一样了。它甚至在日志文件中说 1 个库已添加到 classloader。
我还查看了 jar 以确保它包含 "missing" net.minidev.json.writer.JsonReaderI class,确实如此。那么.. 为什么在执行导入程序时 solr 找不到它?
我发现了另一件奇怪的事情,尽管从技术上讲这无关紧要:
就像我之前说的,solr 和 solr-dataimporthandler 已经有一个 com.jayway.jsonpath 依赖项,这让我想知道为什么我什至必须首先在我的 jar 中包含这些依赖项。
但后来我在 solr/core/build.gradle:
中找到了这个
implementation('com.jayway.jsonpath:json-path', {
exclude group: "net.minidev", module: "json-smart"
我对 gradle 了解不多,但他们似乎从他们的依赖项中排除了我需要的关键 classes。
再一次,我不确定这有什么关系,因为我明确地将所有需要的 classes 编译到我的 jar 中。
有人熟悉这种问题吗?
编辑:
我现在写了另一个小处理器 class 用于测试目的,我包含了另一个名为 ejml 的外部库中的一些东西。 Solr 本身对这个库没有任何依赖性,就像我将所有必需的 classes 编译到 jar 之前一样。
这次 solr 能够完美地执行处理器。
这让我觉得 json-path 依赖和上面提到的 json-smart.
的排除确实有一些奇怪的事情发生
解决了!
我从 ...\solr-8.4.1\server\solr-webapp\webapp\WEB-INF\lib 中删除了 json-path-2.4.0.jar。这样 solr 除了在我的 jar 中搜索丢失的 类 别无选择。我猜?
我仍然不太清楚那里发生了什么,但它确实有效...
我目前正在为 Solr 8.4.1.
开发自定义 DataImportHandler我编写了自己的实体处理器 class,其中我使用了 json-path 库。即使 solr-dataimporthandler(我必须在我的自定义 class 中导入)似乎已经对自身具有 json-path 依赖性,我想走安全的路并编译所有必要的 class进入OparlEntityProccessor.jar.
但是,当我通过 Web 界面执行数据导入程序时,出现此错误:
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[=12=](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
jar 位于 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>
使用此自定义导入-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然后执行class,否则报错就不一样了。它甚至在日志文件中说 1 个库已添加到 classloader。 我还查看了 jar 以确保它包含 "missing" net.minidev.json.writer.JsonReaderI class,确实如此。那么.. 为什么在执行导入程序时 solr 找不到它?
我发现了另一件奇怪的事情,尽管从技术上讲这无关紧要: 就像我之前说的,solr 和 solr-dataimporthandler 已经有一个 com.jayway.jsonpath 依赖项,这让我想知道为什么我什至必须首先在我的 jar 中包含这些依赖项。 但后来我在 solr/core/build.gradle:
中找到了这个implementation('com.jayway.jsonpath:json-path', {
exclude group: "net.minidev", module: "json-smart"
我对 gradle 了解不多,但他们似乎从他们的依赖项中排除了我需要的关键 classes。 再一次,我不确定这有什么关系,因为我明确地将所有需要的 classes 编译到我的 jar 中。
有人熟悉这种问题吗?
编辑:
我现在写了另一个小处理器 class 用于测试目的,我包含了另一个名为 ejml 的外部库中的一些东西。 Solr 本身对这个库没有任何依赖性,就像我将所有必需的 classes 编译到 jar 之前一样。
这次 solr 能够完美地执行处理器。
这让我觉得 json-path 依赖和上面提到的 json-smart.
的排除确实有一些奇怪的事情发生解决了!
我从 ...\solr-8.4.1\server\solr-webapp\webapp\WEB-INF\lib 中删除了 json-path-2.4.0.jar。这样 solr 除了在我的 jar 中搜索丢失的 类 别无选择。我猜? 我仍然不太清楚那里发生了什么,但它确实有效...