名称为“Lucene54”的 org.apache.lucene.codecs.Codec 类型的 SPI 类不存在

Posted

技术标签:

【中文标题】名称为“Lucene54”的 org.apache.lucene.codecs.Codec 类型的 SPI 类不存在【英文标题】:An SPI class of type org.apache.lucene.codecs.Codec with name 'Lucene54' does not exist 【发布时间】:2016-11-16 14:57:06 【问题描述】:

使用 lucene-core-5.5.2 我在 weblogic 服务器中遇到了问题。独立的搜索应用程序可以工作,但是当我部署为 WEB APP 时,它失败并出现以下错误

Exception type is 'java.lang.ExceptionInInitializerError'. Runtime error: java.lang.IllegalArgumentException: An SPI class of type org.apache.lucene.codecs.Codec with name 'Lucene54' does not exist. You need to add the corresponding JAR file supporting this SPI to your classpath. The current classpath supports the following names: []

我尝试在classes/ 下创建文件夹结构,因为META-INF/services/ 添加了来自lucene-core-5.5.2.jar META-INF\services\ 目录的所有文件,还为META-INF\services\ 创建了jar 文件并添加到类路径中,但它无法识别META-INF/services 来加载SPI

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

请确保您在项目中包含的 lucene jar 与错误中提到的 lucene 编解码器的版本相同。例如。如果错误状态为 LuceneCodec62,那么您的项目中应该包含 lucene-6.x.x jar。

【讨论】:

【参考方案2】:

我将以下代码添加到配置标签中

        <transformers>
    <transformer  implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>META-INF/services/org.apache.lucene.codecs.Codec</resource>
                  <resource>META-INF/services/org.apache.lucene.codecs.PostingsFormat</resource>
     /transformer>
         </transformers>

我还在依赖标签的顶部添加了 lucene-core 依赖

                    <dependency>
                        <groupId>org.apache.lucene</groupId>
                        <artifactId>lucene-core</artifactId>
                        <version>5.5.0</version>
                     </dependency>

【讨论】:

【参考方案3】:

我用 gradle 构建了这个建筑,使用了一个建议的解决方案来构建一个“胖 jar”(包含所有依赖 jar 的可执行 jar)here。

但它不起作用:我遇到了这个与 Lucene 有关的模糊错误,但不是在测试或构建或正常运行时,只有在构建胖 jar 时。

我的解决方案是使用 shadow jar: 来自 gradle.build 的代码:

buildscript 
    repositories  jcenter() 
    dependencies  // fatjar
        classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.4' 

apply plugin: 'com.github.johnrengelman.shadow'
shadowJar 
    baseName = project.name
    classifier = null
    version = project.version

【讨论】:

我也在使用 shadow 插件,并且需要这个设置来使它工作:``` shadowJar mergeServiceFiles() ``` 基于这个 github 评论:github.com/johnrengelman/shadow/issues/… shadowJar mergeServiceFiles() 它有帮助,也许答案可以用这个更新【参考方案4】:

请在

中添加以下文件

文件夹:META-INF/services/

文件:org.apache.lucene.codecs.Codec

文字:org.apache.lucene.codecs.lucene54.Lucene54Codec

请在https://anwaarlabs.wordpress.com/2017/02/25/lucene-an-spi-class-of-type-org-apache-lucene-codecs-codec-with-name-does-not-exist/查看详细说明的解决方案

【讨论】:

谢谢!这节省了我的时间。 对我不起作用。使用 Lucene 6.2 但令人困惑地得到一个错误堆栈跟踪,其中提到了 6.2 和 5.0:“无法实例化 SPI 类:org.apache.lucene.codecs.lucene62.Lucene62Codec”......然后是“org.apache.lucene 类型的 SPI 类。名称为“Lucene50”的 codecs.PostingsFormat 不存在”...我尝试了许多排列的解决方案,但没有任何效果。请参阅我的“解决方法”答案。 @mikerodent 我没有收到提到 6.2 和 5.0 的错误堆栈跟踪【参考方案5】:

它已修复,我在 weblogic 应用服务器类路径中添加了 lucene jar,它按预期工作。我不知道为什么它没有从我的应用程序 lib 文件夹中检测到它也在类路径上,但看起来 SPI 在应用服务器类路径上需要 jars 和 META-INF

【讨论】:

以上是关于名称为“Lucene54”的 org.apache.lucene.codecs.Codec 类型的 SPI 类不存在的主要内容,如果未能解决你的问题,请参考以下文章

kafka jdbc sink连接器抛出org.apache.kafka.connect.errors.DataException(结构模式的字段名称未正确指定)插入PG表

人脸识别中的groupID 是指的啥

org.apache.tomcat.jdbc.pool.jmx.JmxUtil.registerJmx Jmx 注册失败

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.gaiay.business.h

org.apache.hadoop.security.AccessControlException: Permissiondenied: user=liuyingping, access=WRITE,

轻松解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误