3

Я пытаюсь использовать Hibernate-поиск в одном из моих JavaEE проектов и, как запустить в точно такую ​​же проблему, как described by Rallenaldo:java.lang.ClassCastException: ... Lucene40PostingsFormat

Моего 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-отсталых-кодеков (версия 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.

Если я исключить Lucene-отсталые-кодеками зависимые пакеты из Maven-проекта, я получаю подобную ClassCastException на том же месте в Lucene-код:

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?


Edit: Я хочу добавить следующее замечание в мой оригинальный пост: часть моего проекта создает отдельное приложение упакованное как самораспаковывающийся 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> 

ответ

0

Ok. Вот лучший ответ. Раствор (обходной путь) для нас заключался в том, чтобы поместить lucene-analyers-common-5.3.1.jar и lucene-core-5.3.1.jar непосредственно в папку домена lib. После отладки я обнаружил, что класс Lucene40PostingsFormat загружается двумя загрузчиками классов, а затем создается из первого класса loader в качестве подкласса другого (он дает исключение класса cast). Я предполагаю, что есть одна ненужная загрузка, но я не знаю, почему и как ее изменить только с помощью конфигурации.

+0

Спасибо за информацию! :-) Это выглядит многообещающим. Однако сейчас я в отпуске. Я должен заглянуть в него снова, когда вернусь и немного поработаю. Я выложу свои выводы, как только доберусь до него. –

+0

@kalosh, можете ли вы уточнить, я не очень разбираюсь в загрузчиках классов, я столкнулся с тем же исключением – sumanth232

+0

@ krishna222 Просто поместите упомянутые lucene libs в/yourdomainFolder/lib – kalosh

Смежные вопросы