Erro ao fazer o deploy no JBoss

Pessoal,

Tenho um projeto em servlets que precisa ser instalado no JBoss 7. Ele funciona perfeitamente no TomCat.

No JBoss 7 o deploy acontece com muitos, muitos warnings de incompatibilidade de classes: Encountered invalid class name (me dá a impressão que há versoes de classe diferentes - mas pq o TomCat nao tem esses erros)

ao roda há uma tela em que o usuário digita a nova senha e é usado um webservice Rest Jersey para validar a força da nova senha.

Essa parte funciona perfeitamente no TomCat mas simplesmente não funciona no JBoss 7. Não dá erro aparente, apenas não mostra o indicador da força da senha.

Nesse momento, no log do JBoss aparece o seguinte erro:

11:43:03,263 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/pwm]] (MSC service thread 1-3) Servlet /pwm threw load() exception:
com.sun.jersey.api.container.ContainerException:
The ResourceConfig instance does not contain any root resource classes.
at com.sun.jersey.server.impl.application.RootResourceUriRules.(RootResourceUriRules.java:99) [jersey-bundle-1.12.jar:1.12]
at com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1308) [jersey-bundle-1.12.jar:1.12]
at com.sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.java:171) [jersey-bundle-1.12.jar:1.12]
at com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:777) [jersey-bundle-1.12.jar:1.12]
at com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:773) [jersey-bundle-1.12.jar:1.12]
at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193) [jersey-bundle-1.12.jar:1.12]

O erro fala em ResourceConfig instance. A que ele se refere? O que é esse ResourceConfig? É o web.xml? Ou ele está se referindo a uma classe específica do webservice?

Agradeço desde já qualquer ajuda.

Fala cara.

De maneira geral acho que diferenças são esperadas simplesmente porque o classpath do JBoss, as libs que estão disponíveis, são bem diferentes das fornecidas pelo Tomcat. Você tem que tomar cuidadoi para que libs dentro da sua aplicação não sejam incompatíveis com aquelas já presentes na runtime do servidor.

Uma delas por exemplo é o jersey. O JBoss usa outra implementação de JAX-RS, o Resteasy, e o Jersey por padrão não é compatível com JBoss. Você tem que fazer umas coisinhas para que funcione sem problemas. Esse me parece que é um dos seus erros.

[quote=rodrigo.uchoa]Fala cara.

De maneira geral acho que diferenças são esperadas simplesmente porque o classpath do JBoss, as libs que estão disponíveis, são bem diferentes das fornecidas pelo Tomcat. Você tem que tomar cuidadoi para que libs dentro da sua aplicação não sejam incompatíveis com aquelas já presentes na runtime do servidor.

Uma delas por exemplo é o jersey. O JBoss usa outra implementação de JAX-RS, o Resteasy, e o Jersey por padrão não é compatível com JBoss. Você tem que fazer umas coisinhas para que funcione sem problemas. Esse me parece que é um dos seus erros.[/quote]

Muito obrigado. Valeu muito a dica. Vou dar uma estudada nesse Resteasy e ver o que devo mudar no meu projeto. Essa incompatibilidade é o tipo da informação que não se encontra muito facilmente.

Não precisa mudar para o Resteasy não. Configurar o JBoss pra usar Jersey não é o fim do mundo. Até onde lembro é só colocar uns parâmetros no web.xml da aplicação, e claro garantir que as libs do jersey sejam empacotadas com a sua aplicação.

Detalhe, use o Jersey compatível com o JEE 6 que deve ser a versão 1.x. O Jersey 2.x é JAX-RS 2.0 e já seria JEE 7. O JBoss 7 é JEE 6 ainda.

[quote=rodrigo.uchoa]Não precisa mudar para o Resteasy não. Configurar o JBoss pra usar Jersey não é o fim do mundo. Até onde lembro é só colocar uns parâmetros no web.xml da aplicação, e claro garantir que as libs do jersey sejam empacotadas com a sua aplicação.

Detalhe, use o Jersey compatível com o JEE 6 que deve ser a versão 1.x. O Jersey 2.x é JAX-RS 2.0 e já seria JEE 7. O JBoss 7 é JEE 6 ainda.[/quote]

Valeu mais esse toque!!!

E já que você está tentando me ajudar poderia me dar alguma explicação sobre o erro abaixo que basicamente deve falar sobre essa incompatibilidade:

11:42:54,746 WARN
[org.jboss.as.server.deployment]
(MSC service thread 1-3)
JBAS015893:
Encountered invalid class name
’com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App’
for service type
’javax.ws.rs.ext.MessageBodyWriter’

Só pra que eu entenda:

A invalid classe name: ‘com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App’, eu encontrei no Jersey-bundle-1.17.1.jar

o que jboss está me dizendo é que que o java dele, na classe ‘javax.ws.rs.ext.MessageBodyWriter’ não entende a classe que está no jar (estão em especificações diferentes como vc já havia dito).

É isso?

Não saberia dizer sem conhecer os detalhes específicos de implementação do JAX-RS. Mas certamente, algum problema proveniente do fato de existirem dois providers (Resteasy e Jersey) no classpath.

Para você desabilitar o Resteasy no JBoss basta adicionar os seguintes parâmetros ao web.xml:

<context-param> <param-name>resteasy.scan</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.scan.providers</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.scan.resources</param-name> <param-value>false</param-value> </context-param>

Tenta ver se somente isso já resolve seu problema. Se ainda persistir, pode ser alguma lib que você tem que retirar/colocar.

Ok. quando vc fala de classpath, vc está falando do classpath do jboss? é isso?

Isso! No classpath do JBoss.