4.3.6. Déboguer et résoudre les Erreurs de déploiement et les Exceptions de Seam 2.2 Booking Archive
Important
Procédure 4.10. Déboguer et résoudre les erreurs et les exceptions de déploiement
- Problème - java.lang.ClassNotFoundException: javax.faces.FacesExceptionQuand vous déployez l'application, le journal contient l'erreur suivante :
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)
Ceci signifie :L'exception ClassNotFoundException indique une dépendance manquante. Dans ce cas, impossible de trouver la classe
javax.faces.FacesException
et vous devez donc ajouter explicitement la dépendance.Comment résoudre ceci :Chercher le nom du module pour cette classe dans le répertoire
EAP6_HOME/modules/system/layers/base/
à l'aide d'un chemin d'accès qui corresponde à la classe manquante. Dans ce cas, vous trouverez 2 modules qui correspondent :javax/faces/api/main javax/faces/api/1.2
Les deux modules ont le même nom de module :javax.faces.api
mais un d'entre eux, qui se trouve dans le répertoire principal, est pour JSF 2.0 et l'autre, situé dans le répertoire 1.2, est pour JSF 1.2. S'il n'y avait qu'un seul module disponible, vous pourriez simplement créer un fichierMANIFEST.MF
et ajouter la dépendance de module. Mais, dans ce cas, vous devez utiliser la version JSF 1.2 et non pas la version 2.0 du répertoire principal, donc vous devez en spécifier une et exclure l'autre. Pour ceci, créer un fichierjboss-deployment-structure.xml
dans le répertoireMETA-INF/
de l'EAR qui contiendra les données suivantes :<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>
Dans la sectiondeployment
, vous ajoutez la dépendance pour l'APIjavax.faces.api
du module JSF 1.2. Vous ajoutez aussi la dépendance du module JSF 1.2 dans la section de sous-déploiement du WAR et vous excluez le module JSF 2.0.Redéployer l'application en effaçant le fichierEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
et en créant un fichier videjboss-seam-booking.ear.dodeploy
dans le même répertoire. - Problème - java.lang.ClassNotFoundException: org.apache.commons.logging.LogQuand vous déployez l'application, le journal contient l'erreur suivante :
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]
Ceci signifie :L'exception
ClassNotFoundException
indique une dépendance manquante. Dans ce cas, impossible de trouver la classeorg.apache.commons.logging.Log
et vous devez donc ajouter explicitement la dépendance.Comment résoudre ceci :Chercher le nom du module pour cette classe dans le répertoire
EAP6_HOME/modules/system/layers/base/
en cherchant un chemin d'accès qui corresponde à la classe manquante. Dans ce cas, vous trouverez un module qui correspond au cheminorg/apache/commons/logging/
. Le nom du module est “org.apache.commons.logging”.Modifier le fichierjboss-deployment-structure.xml
pour ajouter la dépendance de module à la section de déploiement du fichier.<module name="org.apache.commons.logging" export="true"/>
Le fichierjboss-deployment-structure.xml
devrait maintenant ressembler à ceci :<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>
Redéployer l'application en effaçant le fichierEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
et en créant un fichier videjboss-seam-booking.ear.dodeploy
dans le même répertoire. - Problème - java.lang.ClassNotFoundException: org.dom4j.DocumentExceptionQuand vous déployez l'application, le journal contient l'erreur suivante :
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]
Ceci signifie :L'exception
ClassNotFoundException
indique une dépendance manquante. Dans ce cas, impossible de trouver la classeorg.dom4j.DocumentException
.Comment résoudre ceci :Trouver le nom de module dans le répertoire
EAP6_HOME/modules/system/layers/base/
en cherchantorg/dom4j/DocumentException
. Le nom du module est “org.dom4j”. Modifier le fichierjboss-deployment-structure.xml
pour ajouter la dépendance de module à la section de déploiement du fichier.<module name="org.dom4j" export="true"/>
Lejboss-deployment-structure.xml
devrait maintenant ressembler à ceci :<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>
Redéployer l'application en effaçant le fichierEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
et en créant un fichier videjboss-seam-booking.ear.dodeploy
dans le même répertoire. - Problème - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValueQuand vous déployez l'application, le journal contient l'erreur suivante :
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]
Ceci signifie :L'exception
ClassNotFoundException
indique une dépendance manquante. Dans ce cas, impossible de trouver la classeorg.hibernate.validator.InvalidValue
.Comment résoudre ceci :Il y a un module “org.hibernate.validator”, mais le JAR ne contient pas la classe
org.hibernate.validator.InvalidValue
, donc si on ajoute la dépendance de module, on ne résout pas le problème. Dans un tel cas, le JAR qui contient la classe faisait partie du déploiement de JBoss EAP 5.X. Chercher le JAR qui contient la classe manquante dans le répertoireEAP5_HOME/seam/lib/
. Pour cela, ouvrir la console et tapez ce qui suit :$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
Résultat :$ Binary file ./hibernate-validator.jar matches $ Binary file ./test/hibernate-all.jar matches
Dans ce cas, copierhibernate-validator.jar
dans le répertoirejboss-seam-booking.ear/lib/
:$ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
Redéployer l'application en effaçant le fichierEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
et en créant un fichier videjboss-seam-booking.ear.dodeploy
dans le même répertoire. - Problème - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactoryQuand vous déployez l'application, le journal contient l'erreur suivante :
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
Ceci signifie :Les
com.sun.faces.config.ConfigurationException
etjava.lang.InstantiationException
indiquent un problème de dépendance. Dans un tel cas, la cause n'est pas évidente.Comment résoudre ceci :Il vous faut trouver le module qui contient les classes
com.sun.faces
. Malgré qu'il n'y ait pas de modulecom.sun.faces
, il y a deux modulescom.sun.jsf-impl
. Une simple vérification dujsf-impl-1.2_13.jar
dans le répertoire 1.2 révèle qu'il contient les classescom.sun.faces
. Comme avec les exceptionsjavax.faces.FacesException
ClassNotFoundException
, vous devez utiliser la version JSF 1.2 et non pas la version JSF 2.0 dans le principal, donc vous devrez en indiquer une et en exclure l'autre. Vous devrez modifier le fichierjboss-deployment-structure.xml
pour ajouter la dépendance de module à la section de déploiement du fichier. Vous devrez aussi y ajouter le sous-déploiement du WAR et exclure le module JSF 2.0. Le fichier devrait ressembler à ceci :<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>
Redéployer l'application en effaçant le fichierEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
et en créant un fichier videjboss-seam-booking.ear.dodeploy
dans le même répertoire. - Problème - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStackQuand vous déployez l'application, le journal contient l'erreur suivante :
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]
Ceci signifie :Le
ClassNotFoundException
indique une dépendance manquante. Dans ce cas, il ne peut pas trouver la classeorg.apache.commons.collections.ArrayStack
.Comment résoudre ceci :Trouver le nom de module dans le répertoire
EAP6_HOME/modules/system/layers/base/
en cherchantorg/apache/commons/collections
. Le nom du module est “org.apache.commons.collections”. Modifier le fichierjboss-deployment-structure.xml
pour ajouter la dépendance de module à la section de déploiement du fichier.<module name="org.apache.commons.collections" export="true"/>
Lejboss-deployment-structure.xml
devrait maintenant ressembler à ceci :<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>
Redéployer l'application en effaçant le fichierEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
et en créant un fichier videjboss-seam-booking.ear.dodeploy
dans le même répertoire. - Problème - Services avec des dépendances manquantes/non disponiblesQuand vous déployez l'application, le journal contient l'erreur suivante :
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 ]"]}}}
Ceci signifie :Quand vous avez l'erreur suivante : “Services with missing/unavailable dependencies”, chercher le texte entre les guillemets après “missing”. Dans ce cas, vous verrez :
missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
“/em” indique un problème de Gestionnaire d'entité (Entity Manager) et de source de données.Comment résoudre ceci :Dans JBoss EAP 6, la configuration de la source de données a été modifiée et doit être définie dans le fichier
EAP6_HOME/standalone/configuration/standalone.xml
. Comme JBoss EAP 6 est fourni avec une base de données déjà définie dans le fichierstandalone.xml
, modifier le fichierpersistence.xml
pour utiliser cet exemple de base de données dans cette application. Si vous regardez dans le fichierstandalone.xml
, vous verrez quejndi-name
de l'exemple de source de données estjava:jboss/datasources/ExampleDS
. Modifier le fichierjboss-seam-booking.jar/META-INF/persistence.xml
pour commenter l'élémentjta-data-source
et le remplacer comme suit :<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
Redéployer l'application en effaçant le fichierEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed
et en créant un fichier videjboss-seam-booking.ear.dodeploy
dans le même répertoire. - À ce moment là, l'application se déploie sans erreur, mais quand vous accédez à l'URL http://localhost:8080/seam-booking/ par un navigateur et tentez un "Account Login", vous obtenez l'erreur suivante : “The page isn't redirecting properly”. Dans une prochaine étape, vous allez apprendre comment déboguer et résoudre les erreurs de runtime.Pour apprendre comment débogger et comment résoudre les problèmes de runtime, cliquer ici : Section 4.3.7, « Déboguer et résoudre les Erreurs de runtime et les Exceptions de Seam 2.2 Booking Archive »Pour retourner au sujet précédent, cliquer ici : Section 4.3.4, « Migrer l'archive du Seam 2.2 Booking dans JBoss EAP 6: Instructions étape par étape »