4.3.6. Depuração e resolução do erros e exceções do Seam 2.2 Booking Archive Deployment
Importante
Procedimento 4.16. Depuração e resolução dos erros de implantação e exceções
- Problema - java.lang.ClassNotFoundException: javax.faces.FacesExceptionQuando você implanta o aplicativo, 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.FacesExceptione você precisa 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, você pode encontrar dois módulos que coincidem com o caminho:Ambos os módulos possuem o mesmo nome de módulo:javax/faces/api/main javax/faces/api/1.2javax.faces.api, porém um deles no diretório principal é para JSF 2.0 e outro localizado no diretório 1.2 é para JSF 1.2. Caso houvesse apenas um módulo disponível, você poderia criar simplesmente um arquivoMANIFEST.MFe adicionar a dependência do módulo. Neste caso, você deseja usar a versão JSF 1.2 ao invés da versão 2.0 no principal, de forma que você precisa especificar uma e excluir a outra. Para isto, crie um arquivojboss-deployment-structure.xmlno diretório doMETA-INF/do EAR que contém os seguintes dados:Na seção<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>deployment, você adiciona a dependência para ojavax.faces.apido módulo JSF 1.2. Você pode 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 deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.apache.commons.logging.LogQuando você implanta o aplicativo, 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
ClassNotFoundExceptionindica a falta de uma dependência. Neste caso, ele não pode buscar a classeorg.apache.commons.logging.Loge você precisa 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, você pode 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.xmle adicione a dependência do módulo à seção de implantação do arquivo.O<module name="org.apache.commons.logging" export="true"/>jboss-deployment-structure.xmldeve 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 deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.dom4j.DocumentExceptionQuando você implanta o aplicativo, 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
ClassNotFoundExceptionindica 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.xmlpara adicionar a dependência do módulo à seção de implantação do arquivo.O arquivo jboss-deployment-structure.xml deve parecer-se com o seguinte:<module name="org.dom4j" export="true"/><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 deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValueQuando você implanta o aplicativo, 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
ClassNotFoundExceptionindica que falta uma dependência. Neste caso, isto não pode encontrar a classeorg.hibernate.validator.InvalidValue.Como resolver isto:Existe um módulo “org.hibernate.validator”, mas o JAR não contém 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 do JBoss Enterprise Application Plataform 5.1. Procure pelo JAR que contém a classe ausente no diretórioEAP5_HOME/seam/lib/. Digite o seguinte para abrí-lo:O resultado apresenta:$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'Neste caso, copie o$ Binary file ./hibernate-validator.jar matches $ Binary file ./test/hibernate-all.jar matcheshibernate-validator.jarpara o diretóriojboss-seam-booking.ear/lib/$ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/libReimplante o aplicativo apenas deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactoryQuando você implanta o aplicativo, 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 moreO que significa:O
com.sun.faces.config.ConfigurationExceptionejava.lang.InstantiationExceptionindicam um problema de dependência. Neste caso, a causa não é óbvia.Como resolver isto:Você precisa encontrar o módulo que contém as classes
com.sun.faces. Enquanto não há módulocom.sun.faces, existem dois móduloscom.sun.jsf-impl. Uma checagem rápida dojsf-impl-1.2_13.jarno diretório 1.2 demonstra que isto contém as classescom.sun.faces. Assim como realizado com ojavax.faces.FacesExceptionClassNotFoundException, você deseja usar a versão JSF 1.2 ao invés da versão JSF 2.0 no principal, de forma que você pode especificar um e excluir o outro. Você precisa modificar ojboss-deployment-structure.xmlpara adicionar a dependência do módulo à seção da implantação do arquivo. Você precisa também adicioná-lo à subimplantação WAR e excluir o 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 deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStackQuando você implanta o aplicativo, 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
ClassNotFoundExceptionindica 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 o jboss-deployment-structure.xml para adicionar a dependência do módulo à seção de implantação do arquivo.O arquivo jboss-deployment-structure.xml deve parecer-se com o seguinte:<module name="org.apache.commons.collections" export="true"/><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 deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - Serviços com dependências indisponíveis/faltantesQuando você implanta o aplicativo, 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 você obter um erro “Services with missing/unavailable dependencies”, observe o texto entre parênteses após "falta". Neste caso você verá:
O “/em” indica um Gerenciador de Entidade e problema de fonte de dados.missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]Como resolver isto:No JBoss Enterprise Application Plataform 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 Enterprise Application Plataform 6 lança uma fonte de dados de amostra que já está definida no arquivostandalone.xml, modifique o arquivopersistence.xmlpara uso da amostra da fonte de dados neste aplicativo. Buscando no arquivostandalone.xml, você pode perceber que ojndi-namepara amostra da fonte de dados éjava:jboss/datasources/ExampleDS. Modifique o arquivojboss-seam-booking.jar/META-INF/persistence.xmlpara comentar o elementojta-data-sourceexistente 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 deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.hibernate.cache.HashtableCacheProviderQuando você implanta o aplicativo, o log contém o seguinte erro:
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC00001: Failed to start service jboss.persistenceunit."jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase": org.jboss.msc.service.StartException in service jboss.persistenceunit."jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase": Failed to start service at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1786) (... log messages removed ...) Caused by: java.lang.ClassNotFoundException: org.hibernate.cache.HashtableCacheProvider from [Module "org.hibernate:main" from local module loader @12a3793 (roots: /home/sgilda/tools/jboss7/modules)] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191) (... log messages removed ...)O que significa:O
ClassNotFoundExceptionindica que falta uma dependência. Neste caso, isto não pode encontrar a classeorg.hibernate.cache.HashtableCacheProvider.Como resolver isto:Não existe módulo para o “org.hibernate.cache”. Neste caso, o JAR contendo a classe fazia parte da implantação do JBoss Enterprise Application Plataform 5.1. Busque pelo JAR que contém a classe faltante no diretório
EAP5_HOME/seam/lib/. Para isto, abra o console e digite o seguinte:O resultado apresenta:$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`Neste caso, copie oBinary file ./hibernate-core.jar matches Binary file ./test/hibernate-all.jar matcheshibernate-core.jarpara o diretóriojboss-seam-booking.ear/lib/:cp EAP5_HOME/seam/lib/hibernate-core.jar jboss-seam-booking.ear/libReimplante o aplicativo apenas deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.ClassCastException: org.hibernate.cache.HashtableCacheProviderQuando você implanta o aplicativo, o log contém o seguinte erro:
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC00001: Failed to start service jboss.persistenceunit."jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase": org.jboss.msc.service.StartException in service jboss.persistenceunit."jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase": Failed to start service at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1786) (... log messages removed ...) Caused by: java.lang.ClassCastException: org.hibernate.cache.HashtableCacheProvider cannot be cast to org.hibernate.cache.spi.CacheProvider at org.hibernate.cache.internal.bridge.RegionFactoryCacheProviderBridge.init(RegionFactoryCacheProviderBridge.java:65) ... 20 moreO que significa:O
ClassCastExceptionpode ser o resultado de muitos problemas. Caso você ver esta exceção no log, isto parece que a classeorg.hibernate.cache.HashtableCacheProviderestende oorg.hibernate.cache.spi.CacheProvidere está sendo carregado por um carregador de classe diferente ao da classe que isto estende. A classeorg.hibernate.cache.HashtableCacheProviderestá nohibernate-core.jare está sendo carregado pelo carregador de classe do aplicativo. A classe que isto estende, ,org.hibernate.cache.spi.CacheProvider, está noorg/hibernate/main/hibernate-core-4.0.0.Beta1.jare é carregado por aquele módulo. Isto não é óbvio, mas devido às alterações no Hibernate 4, esse problema é causado por um problema de compatibilidade inversa devido à mudança da classeHashtableCacheProvidera outro pacote. Essa classe foi movida do pacoteorg.hibernate.cacheao pacoteorg.hibernate.cache.internal. Caso você não remova a propriedadehibernate.cache.provider_classdo arquivopersistence.xml, isto forçará o aplicativo Seam a empacotar as bibliotecas Hibernate antiga, resultando noClassCastExceptions. Você deve preferir o uso do Infinispan ao invés do HashtableCacheProvider no JBoss Enterprise Application Plataform 6.Como resolver isto:No JBoss Enterprise Application Plataform 6, comente o
hibernate.cache.provider_class propertyno arquivojboss-seam-booking.jar/META-INF/persistence.xmlconforme abaixo:<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->Reimplante o aplicativo apenas deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Nessas alturas, o aplicativo implanta sem nenhum erro, mas quando você acessa o URL http://localhost:8080/seam-booking/ num navegador e tenta "Entrar na Conta", você obterá um erro do período de rodagem "A página não está redirecionando a propriedade". Na próxima etapa você aprenderá como depurar e solucionar os erros do período de rodagem.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 a Seção 4.3.4, “Migração do Seam 2.2 Booking Archive ao JBoss Enterprise Application Plataform 6: Instruções de Etapa-por-Etapa”, para retornar ao tópico anterior.