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.2
Copy 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 matches
Copy 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/lib
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.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.FacesException
ClassNotFoundException
所做的一样,您希望在 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 例程的运行时错误和异常”