当前位置: 首页 > 知识库问答 >
问题:

java.lang.ClassCastException:...Lucene40PostingsFormat

艾意蕴
2023-03-14

我试图在我的一个JavaEE项目中使用Hibernate-Search,似乎遇到了与Rallenaldo描述的完全相同的问题:

我的Maven项目正在使用

  • Java JDK 1.8.0_73
  • Hibernate 5.0.6.最终版
  • Hibernate搜索5.5.2.Final(使用Lucene 5.3.1)

并尝试部署在 Glassfish 4.1.1 应用程序服务器上(只需对标准配置进行最小的更改)。

当部署我的应用程序时,当Lucene尝试从包lucene-backward-codecs(版本5.3.1)加载编解码器时,部署过程以下面的ClassCastException结束:

java.lang.ClassCastException: class org.apache.lucene.codecs.lucene40.Lucene40PostingsFormat
at java.lang.Class.asSubclass(Class.java:3404)
at org.apache.lucene.util.SPIClassIterator.next(SPIClassIterator.java:141)
at org.apache.lucene.util.NamedSPILoader.reload(NamedSPILoader.java:65)
at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:47)
at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:37)
at org.apache.lucene.codecs.PostingsFormat$Holder.<clinit>(PostingsFormat.java:49)
at org.apache.lucene.codecs.PostingsFormat.forName(PostingsFormat.java:112)
at org.apache.lucene.codecs.lucene40.Lucene40Codec.<init>(Lucene40Codec.java:115)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at org.apache.lucene.util.NamedSPILoader.reload(NamedSPILoader.java:67)
at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:45)
at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:37)
at org.apache.lucene.codecs.Codec$Holder.<clinit>(Codec.java:47)
at org.apache.lucene.codecs.Codec.forName(Codec.java:113)
at org.apache.lucene.index.SegmentInfos.readCodec(SegmentInfos.java:469)
...

正如其他地方提到的,我已经证实了在我的电脑上没有其他版本的Lucene和Hibernate-Search。

如果我从Maven-project中排除Lucene向后编解码器依赖项,我会在Lucene代码中的完全相同位置获得类似的ClassCastException:

java.lang.ClassCastException: class org.apache.lucene.codecs.lucene50.Lucene50PostingsFormat
at java.lang.Class.asSubclass(Class.java:3404)
at org.apache.lucene.util.SPIClassIterator.next(SPIClassIterator.java:141)
at org.apache.lucene.util.NamedSPILoader.reload(NamedSPILoader.java:65)
at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:47)
at org.apache.lucene.util.NamedSPILoader.<init>(NamedSPILoader.java:37)
at org.apache.lucene.codecs.PostingsFormat$Holder.<clinit>(PostingsFormat.java:49)
at org.apache.lucene.codecs.PostingsFormat.forName(PostingsFormat.java:112)
at org.apache.lucene.codecs.lucene53.Lucene53Codec.<init>(Lucene53Codec.java:160)
at org.apache.lucene.codecs.lucene53.Lucene53Codec.<init>(Lucene53Codec.java:80)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
...

我无法找到这个问题的解决方案。我知道Rallenaldo的问题实际上也仍然悬而未决。有人知道是什么导致了这个问题吗?这是Glassfish 4.1.1问题吗?

编辑:我想在我的原始帖子中添加以下观察:我的项目的一部分生成了一个独立的应用程序,打包成一个可自我执行的jar文件,具有相同的hibernate和lucene相关的依赖项,其中我还使用了一个实体管理器,具有与现有上下文基本相同的配置。在这种情况下,我没有hibernate-search的上述问题。它开始没有任何问题,我可以看到它生成预期的索引文件。以下是persistence.xml中的相关行:

<persistence-unit name="puName" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <properties>
        ...
        <property name="hibernate.search.default.directory_provider" value="filesystem"/>
        <property name="hibernate.search.default.indexBase" value="/path/to/lucene/indexes"/>
        ...
    </properties>
</persistence-unit>

共有1个答案

程和畅
2023-03-14

还行。这是更好的答案。我们的解决方案(解决方法)是将琉森分析仪通用 5.3.1.jar和琉森核心 5.3.1.jar直接放入域 lib 文件夹中。调试后,我发现类 Lucene40PostingsFormat 由两个类加载器加载,然后从第一个类加载器实例化为另一个类的子类(它给出了类强制转换异常)。我假设有一个不必要的加载,但我不知道为什么以及如何仅通过配置进行更改。

 类似资料:
  • 我试图在一个JavaEE项目中使用Hibernate-Search,但似乎遇到了Rallenaldo所描述的完全相同的问题: 我的Maven-project正在使用 null 当部署我的应用程序时,当Lucene尝试从包lucene-backward-codecs(版本5.3.1)加载编解码器时,部署过程以以下ClassCastException结束: 正如其他地方所说的,我已经验证了在我的计算机

  • 问题内容: 通常,获取java.lang.ClassCastException ..的原因是什么?我在应用程序中遇到以下错误 问题答案: 根据文档: 抛出该异常以指示代码已尝试将强制转换为不是实例的子类。例如,以下代码生成一个:

  • 我在项目中使用了、和maven。我渐渐明白了 java.lang.ClassCastException: org.apache.xerces.ja 这是我Pom.xml 我尝试多种解决方案,但不能解决 第一种方法)在jboss-5.1.0.GA\lib\endorned文件夹中,我有一个jar<code>(xercesImpl)。所以我移除了那个罐子,并运行了这个项目。 现在我得到这个例外 将上下

  • 我试图从表中只读取两列(一个是整数,另一个是字符串)并获取结果列表。我正在使用读取表,如下面的代码所示。此代码正确执行,没有异常出现。 类如下所示 然后在托管Bean中,我使用上面代码的结果如下所示。在这里我得到了异常 JAVAlang.ClassCastException:[Ljava.lang.Object;与com.ewt.ewtalmutil.Object.BusinessProcessI

  • 问题内容: 为什么在我的程序中触发java.lang.ClassCastException? java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为com.App.Equip] 该查询返回已回答(在CheckLists calsse中找到)但尚未由Equip对象回答的清单的列表 -这是代码: -我的java类: 我想将我的SQl查询的结果格式化

  • 下面是我的代码。任何帮助都很感激。我根本无法阅读列表和创建地图。我将作为函数参数传递到Rest层。在我的服务层中,我需要使用存储在列表中的映射值。 我的列表有前面提到的值 ClassCastException:java.lang.String不能强制转换为java.util.Map