4.3.6. Depuração e resolução do erros e exceções do Seam 2.2 Booking Archive Deployment
Importante
Procedimento 4.10. Depuração e resolução dos erros de implantação e exceções
- Problema - java.lang.ClassNotFoundException: javax.faces.FacesExceptionQuando o aplicativo é implantado, o log contém o seguinte erro:
ERROR \[org.jboss.msc.service.fail\] (MSC service thread 1-1) MSC00001: Failed to start service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE: Failed to process phase POST_MODULE of subdeployment "jboss-seam-booking.war" of deployment "jboss-seam-booking.ear" (.. additional logs removed ...) Caused by: java.lang.ClassNotFoundException: javax.faces.FacesException from \[Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader\] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
O que significa:O ClassNotFoundException indica que falta uma dependência. Neste caso, ele não pode encontrar a classe
javax.faces.FacesException
e é necessário adicionar a dependência.Como resolver isto:Busque pelo nome do módulo para aquela classe no diretório
EAP6_HOME/modules/system/layers/base/
apenas observando o caminho que coincide com a classe faltante. Neste caso, é possível encontrar dois módulos que coincidem com o caminho:javax/faces/api/main javax/faces/api/1.2
Ambos os módulos possuem o mesmo nome de módulo:javax.faces.api
, porém um deles no diretório principal é para o JSF 2.0 e outro localizado no diretório 1.2 é para o JSF 1.2. Caso houvesse apenas um módulo disponível, seria possível simplesmente criar um arquivoMANIFEST.MF
e adicionar a dependência do módulo. Neste caso, a versão JSF 1.2 deve ser usada ao invés da versão 2.0 no principal, de forma que é necessário especificar uma e excluir a outra. Para isto, crie um arquivojboss-deployment-structure.xml
no diretório doMETA-INF/
do EAR que contém os seguintes dados:<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
Na seçãodeployment
, a dependência para ojavax.faces.api
do módulo JSF 1.2 é adicionada. É possível adicionar também a dependência do módulo JSF 1.2 na seção de subimplantação para o WAR e excluir o módulo para o JSF 2.0.Reimplante o aplicativo apenas excluindo o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
e criando um arquivojboss-seam-booking.ear.dodeploy
vazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.apache.commons.logging.LogQuando o aplicativo é implantado, o log contém o seguinte erro:
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC00001: Failed to start service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL: Failed to process phase INSTALL of deployment "jboss-seam-booking.ear" (.. additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log from [Module "deployment.jboss-seam-booking.ear.jboss-seam-booking.war:main" from Service Module Loader]
O que significa:O
ClassNotFoundException
indica a falta de uma dependência. Neste caso, ele não pode buscar a classeorg.apache.commons.logging.Log
e é necessária a adição da dependência.Como resolver isto:Busque pelo nome do módulo para aquela classe no diretório
EAP6_HOME/modules/system/layers/base/
apenas observando o caminho que coincide com a classe faltante. Neste caso, é possível encontrar um módulo que coincide o caminhoorg/apache/commons/logging/
. O nome do módulo é “org.apache.commons.logging”.Modifique o arquivojboss-deployment-structure.xml
e adicione a dependência do módulo à seção de implantação do arquivo.<module name="org.apache.commons.logging" export="true"/>
Ojboss-deployment-structure.xml
deve parecer-se com o seguinte:<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
Reimplante o aplicativo apenas excluindo o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
e criando um arquivojboss-seam-booking.ear.dodeploy
vazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.dom4j.DocumentExceptionQuando o aplicativo é implantado, o log contém o seguinte erro:
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-3) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.NoClassDefFoundError: org/dom4j/DocumentException (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
O que significa:O
ClassNotFoundException
indica que falta uma dependência. Neste caso, ele não pode buscar pela classeorg.dom4j.DocumentException
.Como resolver isto:Encontre o nome do módulo no diretório
EAP6_HOME/modules/system/layers/base/
procurando peloorg/dom4j/DocumentException
. O nome do módulo é “org.dom4j”. Modifique o arquivojboss-deployment-structure.xml
para adicionar a dependência do módulo à seção de implantação do arquivo.<module name="org.dom4j" export="true"/>
O arquivojboss-deployment-structure.xml
deve agora parecer-se com o abaixo:<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.dom4j" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
Reimplante o aplicativo apenas excluindo o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
e criando um arquivojboss-seam-booking.ear.dodeploy
vazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValueQuando o aplicativo é implantado, o log contém o seguinte erro:
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-6) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.RuntimeException: Could not create Component: org.jboss.seam.international.statusMessages (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
O que significa:O
ClassNotFoundException
indica que falta uma dependência. Neste caso, isto não pode encontrar a classeorg.hibernate.validator.InvalidValue
.Como resolver isto:O módulo existe “org.hibernate.validator”, mas o JAR não possui a classe
org.hibernate.validator.InvalidValue
, portanto a adição da dependência do módulo não resolve este problema. Neste caso, o JAR contendo a classe fazia parte da implantação JBoss EAP 5.X. Pesquise pelo JAR que contém a classe ausente no diretórioEAP5_HOME/seam/lib/
. Para isto, abra o console e digite o seguinte:$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
O resultado apresenta:$ Binary file ./hibernate-validator.jar matches $ Binary file ./test/hibernate-all.jar matches
Neste caso, copie ohibernate-validator.jar
para o diretóriojboss-seam-booking.ear/lib/
$ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
Reimplante o aplicativo apenas excluindo o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
e criando um arquivojboss-seam-booking.ear.dodeploy
vazio no mesmo diretório. - Problema - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactoryQuando o aplicativo é implantado, o log contém o seguinte erro:
INFO [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-7) Unsanitized stacktrace from failed start...: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.application.ApplicationFactory' was not configured properly. at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:296) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4] (... additional logs removed ...) Caused by: javax.faces.FacesException: org.jboss.seam.jsf.SeamApplicationFactory at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:606) [jsf-api-1.2_13.jar:1.2_13-b01-FCS] (... additional logs removed ...) at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:294) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4] ... 11 more Caused by: java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory at java.lang.Class.newInstance0(Class.java:340) [:1.6.0_25] at java.lang.Class.newInstance(Class.java:308) [:1.6.0_25] at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:604) [jsf-api-1.2_13.jar:1.2_13-b01-FCS] ... 16 more
O que significa:O
com.sun.faces.config.ConfigurationException
ejava.lang.InstantiationException
indicam um problema de dependência. Neste caso, a causa não é óbvia.Como resolver isto:Pesquise pelo módulo que contém as classes
com.sun.faces
. Enquanto não existir o módulocom.sun.faces
, haverão dois móduloscom.sun.jsf-impl
. Uma checagem rápida dojsf-impl-1.2_13.jar
no diretório 1.2 apresenta que isto contém as classescom.sun.faces
. Assim como nojavax.faces.FacesException
ClassNotFoundException
, o uso da versão JSF 1.2 é recomendada ao invés da versão JSF 2.0 da página principal, portanto uma precisa ser especificada e a outra excluída. A modificação dojboss-deployment-structure.xml
para adição da dependência do módulo é necessária na seção de implantação do arquivo. A adição da mesma é necessária à subimplantação WAR e exclusão do módulo JSF 2.0. O arquivo deve parecer-se com o seguinte:<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.dom4j" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
Reimplante o aplicativo apenas excluindo o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
e criando um arquivojboss-seam-booking.ear.dodeploy
vazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStackQuando o aplicativo é implantado, o log contém o seguinte erro:
ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-1) Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader] (... additional logs removed ...) Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
O que significa:O
ClassNotFoundException
indica que falta uma dependência. Neste caso, ele não pode buscar a classeorg.apache.commons.collections.ArrayStack
.Como resolver isto:Encontre o nome do módulo no diretório
EAP6_HOME/modules/system/layers/base/
procurando pelo caminhoorg/apache/commons/collections
. O nome do módulo é “org.apache.commons.collections”. Modifique ojboss-deployment-structure.xml
para adicionar a dependência do módulo à seção de implantação do arquivo.<module name="org.apache.commons.collections" export="true"/>
O arquivojboss-deployment-structure.xml
deve agora parecer-se com o abaixo:<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.dom4j" export="true"/> <module name="org.apache.commons.collections" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
Reimplante o aplicativo apenas excluindo o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
e criando um arquivojboss-seam-booking.ear.dodeploy
vazio no mesmo diretório. - Problema - Serviços com dependências indisponíveis/faltantesQuando o aplicativo é implantado, o log contém o seguinte erro:
ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Services with missing/unavailable dependencies" => ["jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.AuthenticatorAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]","jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.HotelSearchingAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".HotelSearchingAction.\"env/org.jboss.seam.example.booking.HotelSearchingAction/em\" ]"," (... additional logs removed ...) "jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.BookingListAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".BookingListAction.\"env/org.jboss.seam.example.booking.BookingListAction/em\" ]","jboss.persistenceunit.\"jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase\" missing [ jboss.naming.context.java.bookingDatasource ]"]}}}
O que significa:Quando o erro “Serviços com dependências ausentes/indisponíveis” aparecer, observe o texto entre parênteses após "missing". Segue abaixo uma amostra:
missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
O “/em” indica um Gerenciador de Entidade e problema de fonte de dados.Como resolver isto:No JBoss EAP 6, a configuração de fonte de dados foi alterada e precisa ser definida no arquivo
EAP6_HOME/standalone/configuration/standalone.xml
. Uma vez que o JBoss EAP 6 lança uma fonte de dados de amostra que já está definida no arquivostandalone.xml
, modifique o arquivopersistence.xml
para uso da amostra da fonte de dados neste aplicativo. Quando pesquisando no arquivostandalone.xml
, será possível perceber que ojndi-name
para amostra da fonte de dados éjava:jboss/datasources/ExampleDS
. Modifique o arquivojboss-seam-booking.jar/META-INF/persistence.xml
para comentar o elementojta-data-source
existente e substituí-lo pelo o seguinte:<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
Reimplante o aplicativo apenas excluindo o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
e criando um arquivojboss-seam-booking.ear.dodeploy
vazio no mesmo diretório. - A partir de agora, o aplicativo implanta sem erros, porém quando acessando o URL http://localhost:8080/seam-booking/ num navegador e você tentar "Entrar na Conta", o erro “A página não está sendo redirecionada de forma apropriada” será exibido. Na próxima etapa, será descrito como depurar e resolver os erros do período de execução.Consulte a Seção 4.3.7, “Depuração e Resolução de erros e exceções do Seam 2.2 Booking Archive Runtime” para maiores informações sobre como depurar e resolver problemas do período de execução.Clique na Seção 4.3.4, “Migração do Seam 2.2 Booking Archive ao JBoss EAP 6: Instruções de Etapa-por-Etapa” para retornar ao tópico anterior.