java.lang.ClassCastException:... Lucene40PostingsFormat
我尝试使用Hibernate,搜索在我的JavaEE项目之一,似乎遇到相同问题的described by Rallenaldo:java.lang.ClassCastException:... Lucene40PostingsFormat
我Maven的项目使用
- 的Java JDK 1.8.0_73
- 休眠5.0.6.Final
- 的Hibernate搜索5.5.2.Final(使用Lucene的5.3.1)
并尝试在Glassfish 4.1.1应用程序服务器上进行部署(只需对标准配置进行最小限度的更改)。
当部署我的应用程序部署过程中的以下ClassCastException异常,当Lucene的尝试从包lucene的后向编解码器的编解码器加载结束(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向后编解码器dependecy,我在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的问题吗?
编辑:我想下面的观察添加到我原来的职位:我的项目的一部分生成打包为自可执行的JAR文件用相同的休眠和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>
好的。这是更好的答案。我们的解决方案(解决方法)是将lucene-analysers-common-5.3.1.jar和lucene-core-5.3.1.jar直接放入域lib文件夹中。调试后,我发现类Lucene40PostingsFormat被两个类加载器加载,然后从第一个类加载器实例化为另一个类的子类(它给出类类型转换异常)。我假设有一个不必要的加载,但我不知道为什么以及如何仅通过配置对其进行更改。
感谢您的信息! :-)它看起来很有希望。不过现在我正在度假。当我回来并且有一点时间时,我不得不重新审视它。我会尽快发布我的调查结果。 –
@kalosh,你能否详细说明一下,我对class loader没有太多的想法,我面临同样的例外 – sumanth232
@ krishna222只是提到lucene库到/ yourdomainFolder/lib – kalosh