我正在尝试在我的一个 JavaEE 项目中使用 Hibernate-Search,但似乎遇到了与 described by Rallenaldo 完全相同的问题。 :
我的 Maven 项目正在使用
- Java JDK 1.8.0_73
- 休眠 5.0.6.Final
- Hibernate-Search 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 项目中排除 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 的问题吗?
编辑:我想在我的原始帖子中添加以下观察:我的项目的一部分生成一个独立的应用程序,打包为一个自可执行的 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>
最佳答案
好的。这是更好的答案。我们的解决方案(解决方法)是将 lucene-analyzers-common-5.3.1.jar 和 lucene-core-5.3.1.jar 直接放入域 lib 文件夹中。调试后我发现类 Lucene40PostingsFormat 正在被两个类加载器加载,然后从第一个类加载器实例化为另一个类加载器的子类(它给出类转换异常)。我假设有一个不必要的加载,但我不知道为什么以及如何仅通过配置来更改它。
关于lucene - java.lang.ClassCastException : . .. Lucene40PostingsFormat 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35684036/