java.lang.ClassCastException:... Lucene40PostingsFormat

时间:2016-02-28 14:56:57

标签: lucene classcastexception hibernate-search glassfish-4.1.1

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

我的Maven项目正在使用

  • Java JDK 1.8.0_73
  • Hibernate 5.0.6.Final
  • Hibernate-Search 5.5.2.Final(使用Lucene 5.3.1)

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

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

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项目中排除lucene-backward-codecs依赖性,我会在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's question在行动上仍然是开放的。有人知道导致这个问题的原因吗?这是Glassfish 4.1.1的问题吗?

编辑:我想在我的原始帖子中添加以下观察:我的项目的一部分生成一个独立的应用程序,打包为具有相同的hibernate和lucene相关依赖项的自执行jar文件,其中我还使用了一个实体管理器,它具有与存储上下文基本相同的配置。在这种情况下,我在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 个答案:

答案 0 :(得分:0)

确定。这是更好的答案。我们的解决方案(解决方法)是将lucene-analyzers-common-5.3.1.jar和lucene-core-5.3.1.jar直接放入域lib文件夹中。在调试之后,我发现类Lucene40PostingsFormat由两个类加载器加载,然后从第一个类加载器实例化为另一个类的子类(它给出类转换异常)。我假设有一个不必要的加载,但我不知道为什么以及如何仅使用配置更改它。