开发者社区> 问答> 正文

Solr执行DataImportHandler时出现NoClassDefFoundError

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

我编写了自己的实体处理器类,在其中使用了json-path库。即使solr-dataimporthandler(必须在我的自定义类中导入)似乎已经对其本身具有json-path依赖性,但我还是想以一种安全的方式将所有必需的类编译到OparlEntityProccessor.jar中。

但是,当我通过Web界面执行dataimporter时,出现此错误:

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个lib添加到类加载器。我还查看了该jar,以确保它包含“缺失的” net.minidev.json.writer.JsonReaderI类,并且确实如此。所以..为什么在执行导入程序时无法找到它?

我发现了另一个奇怪的事情,尽管从技术上讲它并不重要:就像我之前说过的那样,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排除确实存在一些奇怪的事情。

问题来源:Stack Overflow

展开
收起
montos 2020-03-24 09:48:25 1072 0
1 条回答
写回答
取消 提交回答
  • 解决了!

    我从... \ solr-8.4.1 \ server \ solr-webapp \ webapp \ WEB-INF \ lib中删除了json-path-2.4.0.jar。这样,solr除了在我的jar中搜索缺少的类外别无选择。我仍然不太清楚那里发生了什么,但是它可以正常工作...

    回答来源:Stack Overflow

    2020-03-25 23:15:13
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载