4.3.6. 调试和解决 Seam 2.2 Booking 例程的部署错误和异常
重要
过程 4.10. 调试和解决部署错误和异常
- 问题 - java.lang.ClassNotFoundException: javax.faces.FacesException当您部署应用程序时,日志会包含下列错误:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 它表示:ClassNotFoundException 表示缺失的依赖关系。在这个例子里是无法找到
javax.faces.FacesException,您需要显性地添加这个依赖关系。如何解决这个问题:在
EAP6_HOME/modules/system/layers/base/目录里通过查找匹配缺失的类的路径找到这个类的模块名。在这个例子里,您会找到两个匹配的模块:这两个模块都有相同的模块名:javax/faces/api/main javax/faces/api/1.2
javax/faces/api/main javax/faces/api/1.2Copy to Clipboard Copied! Toggle word wrap Toggle overflow javax.faces.api,但位于 main 目录里的是用于 JSF 2.0 的,而位于 1.2 目录里的另外一个是用于 JSF 1.2 的。如果只有一个可用的模块,您可以简单地创建一个MANIFEST.MF并添加模块依赖关系。在这个例子里,您像使用 JSF 1.2 版本而不是 main 里的 JSF 2.0,所以您需要指定一个并排斥另外一个。为此,您可以在 EAR 的META-INF/目录里创建一个包含下列数据的jboss-deployment-structure.xml:在Copy to Clipboard Copied! Toggle word wrap Toggle overflow deployment部分,您可以添加用于 JSF 1.2 模块的javax.faces.api的依赖关系。您也可以在 WAR 的 subdeployment 部分添加用于 JSF 1.2 模块的依赖关系并排除用于 JSF 2.0 的模块。通过删除EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed文件并在相同目录里创建一个空白的jboss-seam-booking.ear.dodeploy文件来重新部署应用程序。 - 问题 - java.lang.ClassNotFoundException: org.apache.commons.logging.Log当您部署应用程序时,日志会包含下列错误:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 它表示:ClassNotFoundException指示了一个缺失的依赖关系。在这个例子里是无法找到org.apache.commons.logging.Log且您需要显性地添加依赖关系。如何解决这个问题:通过查找匹配缺失类的路径在
EAP6_HOME/modules/system/layers/base/里找到这个类的模块名。在这个例子里,您要找到匹配路径org/apache/commons/logging/的模块。这个模块名是 “org.apache.commons.logging”。修改jboss-deployment-structure.xml文件,添加模块依赖关系至部署部分。<module name="org.apache.commons.logging" export="true"/>
<module name="org.apache.commons.logging" export="true"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xml应该类似于:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过删除EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed文件并在相同目录里创建一个空白的jboss-seam-booking.ear.dodeploy文件来重新部署应用程序。 - 问题 - java.lang.ClassNotFoundException: org.dom4j.DocumentException当您部署应用程序时,日志会包含下列错误:
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]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]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 它表示:ClassNotFoundException 表示缺失的依赖关系。在这个例子里是无法找到
org.dom4j.DocumentException类。如何解决这个问题:在
EAP6_HOME/modules/system/layers/base/目录里通过查找org/dom4j/DocumentException来查找模块名。这个模块名是 “org.dom4j”。修改jboss-deployment-structure.xml文件,添加模块依赖关系至文件的部署部分。<module name="org.dom4j" export="true"/>
<module name="org.dom4j" export="true"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xml文件应该类似于:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过删除EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed文件并在相同目录里创建一个空白的jboss-seam-booking.ear.dodeploy文件来重新部署应用程序。 - 问题 - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue当您部署应用程序时,日志会包含下列错误:
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]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]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 它表示:ClassNotFoundException 表示缺失的依赖关系。在这个例子里是无法找到
org.hibernate.validator.InvalidValue类。如何解决这个问题:存在名为 “org.hibernate.validator” 的模块,但 JAR 不包含
org.hibernate.validator.InvalidValue类,所以添加模块依赖关系不会解决这个问题。在这个例子里,JAR 包含这个类,将其作为 JBoss EAP 5.X 部署的一部分。在EAP5_HOME/seam/lib/目录里查找包含缺失类的 JAR。为此,打开控制台并输入:其结果显示:cd EAP5_HOME/seam/lib grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在这个例子里,复制Binary file ./hibernate-validator.jar matches Binary file ./test/hibernate-all.jar matches
$ Binary file ./hibernate-validator.jar matches $ Binary file ./test/hibernate-all.jar matchesCopy to Clipboard Copied! Toggle word wrap Toggle overflow hibernate-validator.jar到jboss-seam-booking.ear/lib/目录:cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
$ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/libCopy to Clipboard Copied! Toggle word wrap Toggle overflow 通过删除EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed文件并在相同目录里创建一个空白的jboss-seam-booking.ear.dodeploy文件来重新部署应用程序。 - 问题 - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory当您部署应用程序时,日志会包含下列错误:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 它表示:com.sun.faces.config.ConfigurationException和java.lang.InstantiationException表示存在依赖关系的问题。在这个例子里,原因并不明显。如何解决这个问题:您需要找到包含
com.sun.faces类的模块。虽然这里没有com.sun.faces模块,但却有两个com.sun.jsf-impl模块。在 1.2 目录里快速检查jsf-impl-1.2_13.jar,您会发现它包含com.sun.faces类。如您对javax.faces.FacesExceptionClassNotFoundException所做的一样,您希望在 main 里使用 JSF 1.2 版本而不是 JSF 2.0,所以您需要指定一个且排除另外一个。您需要修改jboss-deployment-structure.xml以添加模块依赖关系到这个文件的 deployment 部分。您也需要添加它到 WAR 子部署并排除 JSF 2.0 模块。这个文件现在应该类似于:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过删除EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed文件并在相同目录里创建一个空白的jboss-seam-booking.ear.dodeploy文件来重新部署应用程序。 - 问题 - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack当您部署应用程序时,日志会包含下列错误:
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]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]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 它表示:ClassNotFoundException 表示缺失的依赖关系。在这个例子里是无法找到
org.apache.commons.collections.ArrayStack。如何解决这个问题:在
EAP6_HOME/modules/system/layers/base/目录里通过查找org/apache/commons/collections路径来查找模块名。这个模块名是 “org.apache.commons.collections”。修改jboss-deployment-structure.xml文件,添加模块依赖关系至文件的部署部分。<module name="org.apache.commons.collections" export="true"/>
<module name="org.apache.commons.collections" export="true"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xml文件应该类似于:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过删除EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed文件并在相同目录里创建一个空白的jboss-seam-booking.ear.dodeploy文件来重新部署应用程序。 - 问题 - Services with missing/unavailable dependencies当您部署应用程序时,日志会包含下列错误:
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 ]"]}}}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 ]"]}}}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 它表示:当您遇到 “Services with missing/unavailable dependencies” 错误,请查看 “missing” 后面括号里的文本。在这里例子里是:
“/em” 表示这是一个 Entity Manager 和数据源的问题。missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如何解决这个问题:在 JBoss EAP 6 里,数据源配置已经进行了修改,它需要在
EAP6_HOME/standalone/configuration/standalone.xml文件里进行定义。因为 JBoss EAP 6 附带的示例数据库已经在standalone.xml文件里进行了定义,请修改persistence.xml文件来使用这个示例数据库。请看standalone.xml文件,您可以看到示例数据库的jndi-name是java:jboss/datasources/ExampleDS。修改jboss-seam-booking.jar/META-INF/persistence.xml文件,注释现有的jta-data-source元素并用下列内容来替代:<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过删除EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed文件并在相同目录里创建一个空白的jboss-seam-booking.ear.dodeploy文件来重新部署应用程序。 - 此时,应用程序应该已部署无误了,但当您访问 http://localhost:8080/seam-booking/ 并尝试 "Account Login" 时,您会遇到一个运行时错误 “The page isn't redirecting properly”。在下一步里,您会学习如何调试和解决运行时错误。要学习如何调试和解决运行时的问题,点击这里:第 4.3.7 节 “调试和解决 Seam 2.2 Booking 例程的运行时错误和异常”