4.3.6. Depuración y resolución de errores y excepciones de implementación del archivador de reservas Seam 2.2
Importante
Procedimiento 4.10. Depuración y resolución de excepciones y errores de implementación
- Emita - java.lang.ClassNotFoundException: javax.faces.FacesExceptionCuando implementa la aplicación, el registro contiene el siguiente error:
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)
Lo que significa:La ClassNotFoundException indica que falta una dependencia. En este caso, no puede encontrar la clase
javax.faces.FacesException
y necesita agregar la dependencia de manera explícita.Para resolverlo:Busque el nombre del módulo para esa clase en el directorio
EAP6_HOME/modules/system/layers/base/
buscando una ruta que coincida con la clase que falta. En este caso se encuentran dos módulos que coinciden:javax/faces/api/main javax/faces/api/1.2
Ambos módulos tienen el mismo nombre de módulo:javax.faces.api
pero uno en el directorio principal es para JSF 2.0 y el que se encuentra en el directorio 1.2 es para JSF 1.2. Si hubiera solo un módulo disponibles entonces podría simplemente crear un archivoMANIFEST.MF
y agregar la dependencia del módulo. Pero en este caso, quiere utilizar la versión JSF 1.2 y no la versión 2.0 en main así que necesita especificar uno y excluir el otro. Para lograr esto, cree un archivojboss-deployment-structure.xml
en el directorioMETA-INF/
del EAR que contiene los siguientes datos:<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>
En la seccióndeployment
agregue la dependencia para lajavax.faces.api
para el módulo JSF 1.2. También agregue la dependencia para el módulo JSF 1.2 en la sección de subimplementación para la WAR y excluya el módulo para JSF 2.0.Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.apache.commons.logging.LogCuando implementa la aplicación, el registro contiene el siguiente error:
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]
Lo que significa:La
ClassNotFoundException
indica que falta una dependencia. En este caso, no puede encontrar la claseorg.apache.commons.logging.Log
y necesita agregar la dependencia de manera explícita.Para resolverlo:Busque el nombre del módulo para esa clase en el directorio
EAP6_HOME/modules/system/layers/base/
buscando una ruta que coincida con la clase que falta. En este caso, encuentra un módulo que coincide con la rutaorg/apache/commons/logging/
. El nombre del módulo es “org.apache.commons.logging”.Modifique el archivojboss-deployment-structure.xml
para agregar la dependencia del módulo a la sección de implementación del archivo.<module name="org.apache.commons.logging" export="true"/>
Eljboss-deployment-structure.xml
ahora se debe ver así:<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>
Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.dom4j.DocumentExceptionCuando implementa la aplicación, el registro contiene el siguiente error:
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]
Lo que significa:La
ClassNotFoundException
indica que falta una dependencia. En este caso, no puede encontrar la claseorg.dom4j.DocumentException
.Para resolverlo:Busque el nombre del módulo en el directorio
EAP6_HOME/modules/system/layers/base/
buscando laorg/dom4j/DocumentException
. El nombre del módulo es “org.dom4j”. Modifique el archivojboss-deployment-structure.xml
para agregar la dependencia del módulo a la sección de implementación del archivo.<module name="org.dom4j" export="true"/>
El archivojboss-deployment-structure.xml
ahora se debe ver así:<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>
Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValueCuando implementa la aplicación, el registro contiene el siguiente error:
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]
Lo que significa:La
ClassNotFoundException
indica que falta una dependencia. En este caso, no puede encontrar la claseorg.hibernate.validator.InvalidValue
.Para resolverlo:Hay un módulo “org.hibernate.validator”, pero la JAR no contiene la clase
org.hibernate.validator.InvalidValue
así que el agregar la dependencia del módulo no resuelve este problema. En este caso, la JAR que contiene la clase era parte de la implementación JBoss EAP 5.X. Busque la JAR que contiene la clase que falta en el directorioEAP5_HOME/seam/lib/
. Para lograr esto, abra una consola y escriba lo siguiente:$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
El resultado muestra:$ Binary file ./hibernate-validator.jar matches $ Binary file ./test/hibernate-all.jar matches
En este caso, copie lahibernate-validator.jar
al directoriojboss-seam-booking.ear/lib/
:$ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactoryCuando implementa la aplicación, el registro contiene el siguiente error:
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
Lo que significa:La
com.sun.faces.config.ConfigurationException
y lajava.lang.InstantiationException
indican un problema de dependencias. En este caso, la causa no es tan obvia.Para resolverlo:Necesita encontrar el módulo que contiene las clases
com.sun.faces
. Aunque no hay un módulocom.sun.faces
, hay dos móduloscom.sun.jsf-impl
. Una revisión rápida de lajsf-impl-1.2_13.jar
en el directorio 1.2 muestra que contiene las clasescom.sun.faces
. Tal como lo hizo conjavax.faces.FacesException
ClassNotFoundException
, debe utilizar la versión JSF 1.2 y no la versión JSF 2.0 en main, así que necesita especificar una y excluir la otra. Necesita modificar eljboss-deployment-structure.xml
para agregar la dependencia del módulo a la sección de implementación del archivo. También tiene que agregarla a la subimplementación WAR y excluir el módulo JSF 2.0. El archivo se debe ver así:<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>
Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStackCuando implementa la aplicación, el registro contiene el siguiente error:
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]
Lo que significa:La
ClassNotFoundException
indica que falta una dependencia. En este caso, no puede encontrar la claseorg.apache.commons.collections.ArrayStack
.Para resolverlo:Busque el nombre del módulo en el directorio
EAP6_HOME/modules/system/layers/base/
buscando la rutaorg/apache/commons/collections
. El nombre del módulo es “org.apache.commons.collections”. Modifique eljboss-deployment-structure.xml
para agregar la dependencia del módulo a la sección de implementación del archivo.<module name="org.apache.commons.collections" export="true"/>
El archivojboss-deployment-structure.xml
ahora se debe ver así:<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>
Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - Emita - servicios con dependencias no disponibles/que faltanCuando implementa la aplicación, el registro contiene el siguiente error:
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 ]"]}}}
Lo que significa:Cuando obtenga un error “Services with missing/unavailable dependencies”, vea el texto dentro de los paréntesis después de “missing”. En este caso puede ver:
missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
El “/em” indica un problema de fuente de datos y gestor de entidades.Para resolverlo:En JBoss EAP 6, la configuración de la fuente de datos cambió y es necesario definirla en el archivo
EAP6_HOME/standalone/configuration/standalone.xml
. Ya que JBoss EAP 6 se envía junto con una base de datos de ejemplo que ya está definida en el archivostandalone.xml
, modifique el archivopersistence.xml
para utilizar esa base de datos de ejemplo en esta aplicación. Al ver en el archivostandalone.xml
puede ver que eljndi-name
para la base de datos de ejemplo esjava:jboss/datasources/ExampleDS
. Modifique el archivojboss-seam-booking.jar/META-INF/persistence.xml
para comentar el elemento existentejta-data-source
y reemplazarlo así:<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
Vuelva a implementar la aplicación borrando el archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
y creando un archivo en blancojboss-seam-booking.ear.dodeploy
en el mismo directorio. - En este momento la aplicación se implementa sin errores, pero cuando accede la URL http://localhost:8080/seam-booking/ en un navegador e intenta "Account Login", obtiene un error en tiempo de ejecución “The page isn't redirecting properly”. En el siguiente paso, aprenderá a depurar y resolver errores en tiempo de ejecución.Para aprender cómo depurar y resolver problemas de tiempo de ejecución haga clic aquí: Sección 4.3.7, “Depuración y resolución de errores y excepciones en tiempo de ejecución del archivador de reservas Seam 2.2”Para regresar al tema anterior haga clic aquí: Sección 4.3.4, “Migración del archivador de reservas de Seam 2.2 a JBoss EAP 6: instrucciones paso por paso”