3

我嘗試使用Hibernate,搜索在我的JavaEE項目之一,似乎遇到相同問題的described by Rallenaldojava.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相關的依賴,一個獨立的應用程序,我也可以使用具有基本相同配置的實體管理器的預置上下文。在這種情況下,我做了而不是有hib​​ernate-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> 

回答

0

好的。這是更好的答案。我們的解決方案(解決方法)是將lucene-analysers-common-5.3.1.jar和lucene-core-5.3.1.jar直接放入域lib文件夾中。調試後,我發現類Lucene40PostingsFormat被兩個類加載器加載,然後從第一個類加載器實例化爲另一個類的子類(它給出類類型轉換異常)。我假設有一個不必要的加載,但我不知道爲什麼以及如何僅通過配置對其進行更改。

+0

感謝您的信息! :-)它看起來很有希望。不過現在我正在度假。當我回來並且有一點時間時,我不得不重新審視它。我會盡快發佈我的調查結果。 –

+0

@kalosh,你能否詳細說明一下,我對class loader沒有太多的想法,我面臨同樣的例外 – sumanth232

+0

@ krishna222只是提到lucene庫到/ yourdomainFolder/lib – kalosh