Конфликти между Hibernate и Jersey при използване на Tomcat и Eclipse IDE

В моя проект използвам както Hibernate, така и Jersey, има конфликт на библиотека с Hibernate, Jersey от връзката по-долу, получавам така

http://www.hildeberto.com/2008/05/hibernate-and-jersey-conflict-on.html

Jersey използва библиотеката ASM, която също се използва от Hibernate, но в различни версии. Hibernate използва версия 1.5.3, а Jersey използва 3.5.1. Голяма разлика! Не можем просто да изтрием старата версия и да поставим новата там, защото те са архитектурно различни. Версия 1.5.3 има пакет "attrs", докато 3.5.1 го няма, но има пакет "подписи". Пакетът ASM е необходим на пакета cglib, който е част от библиотеките на Hibernate. Ако премахнем този пакет, Jersey ще работи правилно, но Hibernate ще спре да работи. За да разрешите този конфликт, използвайте cglib-nodep.jar вместо cglib.jar и запазете ASM версия 3.x с Jersey. cglib-nodep.jar включва някои ASM класове, изисквани от cglib.jar, променяйки името на пакета, за да избегне конфликт на класове.

но след включване на asm-3.1.jar, asm-attrs-2.2.3.jar, asm-commons-3.1.jar, asm-util-3.1.jar, cglib-nodep-2.1_3sources.jar получавам грешки:

ако поставя cglib 2.1.3:

java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
    at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
    at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)

ако поставя cglib-nodep-2.1_3-sources.jar:

java.lang.ClassNotFoundException: net.sf.cglib.core.KeyFactory
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)

моля, някой избройте jar файловете, необходими за разрешаване на този проблем.


person Rajeswari Kotikalapudi    schedule 18.07.2012    source източник


Отговори (1)


Ако не греша, cglib вече не е предпочитаният доставчик на байт код за Hibernate. По-скоро Javassist е и можете да принудите Javassist със следното:

hibernate.bytecode.provider=javassist

В последните версии на Hibernate това вече е поведението по подразбиране. Трябва или да имате по-стара версия на Hibernate, или проектът вече се конфигурира да замени горното с cglib. Така че можете или да актуализирате вашата версия на Hibernate, или да конфигурирате вашето копие да използва javassist вместо това. Конфигурацията донякъде зависи от вашата среда и това, което искате. Като цяло, вие включвате горния ред във файл hibernate.properties във вашия classpath. Мисля, че можете също да добавите -Dhibernate.bytecode.provider=javassist към командния ред или в JAVA_OPTS за конфигурация на JBoss.

Можете да видите повече дискусия тук и другаде в мрежата. Само Google hibernate.bytecode.provider

person Kevin Welker    schedule 18.07.2012
comment
не го разбрах, можеш ли да обясниш подробно - person Rajeswari Kotikalapudi; 19.07.2012
comment
FYI, разширих отговора си преди малко. Надяваме се, че това помага за изясняване. - person Kevin Welker; 21.07.2012