terça-feira, 3 de março de 2009

Netbeans 6.5 + Hibernate3 + RESTFul (Jersey) = NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V!

Por determinação da UFSCar, o desenvolvimento dos projetos da pós-graduação deve ser realizado no netbeans 6.5.

Nunca tinha mexido com essa IDE e estou encontrando algumas dificuldades. Na medida em que os problemas forem aparecendo pretendo registra-los (e se possível a solução) tanto para futuras referências quanto para compartilhar o conhecimento.


Nesse post, vou comentar sobre um erro bizarro que aconteceu comigo utilizando o netbeans 6.5..

..bizarro!

A aplicação (Struts2+Spring2.5+Hibernate3 JPA+GlassFish2) depois de muito trabalho, estava funcionando muito bem, obrigado.

Eu precisava gerar um WS-REST e, como estava utilizando o netbeans, simplesmente acessei
Tools > Plugins, adicionei a biblioteca RESTFul WebServices e a referenciei no projeto.

Montei o WS-REST que precisava e qual foi minha surpresa, quando, ao rodar o projeto para testar, o netbeans tentou fazer o deploy da aplicação no GlassFish e, após muita demora.. PIMBA:

java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V

=/ (...e eu só adicionei a library do WS-REST.. JURO!!)

..mas por que isso?

Buscando na web, encontrei alguns coitados (como eu) com o mesmo erro e variações.

De acordo com o que li e pelo que eu entendi, o problema ocorre quando, ao adicionar a
biblioteca do Jersey ao projeto, é adicionado o asm.jar desse módulo. (nâo, eu não tinha adicionado o Jersey.. o netbeans o incluiu implicitamente, para criar o WS-REST...)

Acontece que já havia uma outra versão desse jar no meu projeto (
utilizada pelo Hibernate). E a versão do Hibernate (1.5.3) e a do Jersey (3.1) tem arquiteturas (e até pacotes) diferentes. Ao subir a aplicação, o Hibernate tentava utilizar a nova versão e não encontrava o que procurava e dava tiutio!

..tá, e daí?

Entre umas e outras tentativas, encontrei a solução em uma thread do java.net
, que comentava que o asm.jar do Hibernate é utilizado indiretamente através da cglib. Eles comentam que há uma nova versão dessa biblioteca, a cglib-nodep que serve tanto para comunicar com a asm.jar do Hibernate quanto para comunicar com o asm.jar do Jersey. Removi a cglib do Hibernate e substitui pela cglib-nodep e..

..voilá! ;D

..maass..

..caso vc não esteja utilizando esse modulo no seu projeto, e o netbeans simplesmente tenha adicionado essa biblioteca por forças misticas desconhecidas, esse trecho da dica do Rambo pode ser útil:
(..) right click on the web module and select library and remove RESTful and Jersey ... or so one might think. But apparently the web.xml file has references to RESTful and removing the lib doesn't remove those entries. So go thru that file and remove all ref. to RESTful well, that is how I have got my app to load onto glassfish. (..)
Se preferir, veja o post completo!

..bom, é isso!

Espero que funcione para quem passar por problemas semelhantes..

..argh!

O pior, é que após passar um bom stress com isso, encontrei um ótimo post que explica detalhadamente o problema. Segue link para referência:
Hildeberto's Blog: Hibernate and Jersey Conflict on Glassfish

Marcadores: , , , ,

2 Comentários:

Anonymous Anônimo disse...

Cara acabei de resolver um problema no Netbeans também graças a seu post... estou utilizando hibernate,jsf e tentando integrar com spring e não conseguia de jeito nenhum inicializar o applicationContext por este problema da cglib... tanto no Spring como no Hibernate esta lib estava com problema. VALEU!

Edson Régis

15 de maio de 2009 às 22:17  
Anonymous Anônimo disse...

Pow cara parebens pela dica vc acabou de salvar uma vida.
Sabia q o problema estava ocorrendo por causa de versão das bibliotecas mais não sabia como resolver.
Meu problema foi rodar um projeto no glassfish 2 com o Hibernate. Notomcat tava OK mias no glassFish dava pau !


Valewww Abração

Magno da Costa
magnocosta.br@gmail.com

16 de abril de 2010 às 09:03  

Postar um comentário

Assinar Postar comentários [Atom]

<< Página inicial