首页 > 解决方案 > Solr java.lang.ClassNotFoundException:执行 DataImportHandler 时的 net.minidev.json.writer.JsonReaderI

问题描述

我目前正在为Solr 8.4.1开发自定义DataImportHandler

我编写了自己的实体处理器类,其中使用了json-path库。即使 solr-dataimporthandler(我必须在我的自定义类中导入)似乎已经对自身具有 json-path 依赖项,但我想采用安全的方式并将所有必要的类编译到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$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

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>

使用这个 custom-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 个库已添加到类加载器中。我还查看了 jar 以确保它包含“丢失的”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 排除确实有一些奇怪的事情发生。

标签: javasolrclassnotfoundexceptionjsonpathdataimporthandler

解决方案


解决了!

我从 ...\solr-8.4.1\server\solr-webapp\webapp\WEB-INF\lib 中删除了 json-path-2.4.0.jar。这样 solr 除了在我的 jar 中搜索丢失的类之外别无选择。我猜?我仍然不知道那里发生了什么,但它确实有效......


推荐阅读