jboss - JBoss为 7错误:WAR部署成功,EAR部署失败

  显示原文与译文双语对照的内容
105 3

我采用相同的web应用程序,并将它的部署为 WAR,没有任何问题。但是,部署为EAR的应用程序失败。相同的文件,只是不同的部署。首先,看一下战争:

Webapp.war
.
|-- error.xhtml
|-- index.xhtml
|-- language.xhtml
|-- login.xhtml
|-- META-INF
|-- register.xhtml
|-- resources
| |-- css
| | `-- layout.css
| |-- images
| | `-- logo.png
| `-- javascript
| `-- detectScreenSize.js
|-- sendMail.xhtml
|-- templates
| `-- masterLayout.xhtml
`-- WEB-INF
 |-- beans.xml
 |-- classes
 | |-- ApplicationResources_es.properties
 | |-- ApplicationResources.properties
 | |-- com
 | | `-- webapp
 | | |-- controller
 | | | |-- auth
 | | | | |-- ClientInfo.class
 | | | | |-- LoginModule.class
 | | | | |-- RBAC.class
 | | | | |-- SimpleGroup.class
 | | | | `-- SimplePrincipal.class
 | | | |-- LocaleManager.class
 | | | |-- SendMailBean.class
 | | | |-- UserRegistration.class
 | | | `-- UserRemoval.class
 | | |-- data
 | | | `-- UserListProducer.class
 | | |-- exception
 | | | |-- ViewExpiredExceptionExceptionHandler.class
 | | | `-- ViewExpiredExceptionExceptionHandlerFactory.class
 | | |-- model
 | | | |-- Entity.class
 | | | |-- LoginHistory.class
 | | | |-- Role.class
 | | | |-- User.class
 | | | `-- UserRole.class
 | | `-- util
 | | |-- Resources.class
 | | |-- TimestampAdapter.class
 | | `-- Util.class
 | |-- META-INF
 | | |-- beans.xml
 | | `-- persistence.xml
 | `-- ValidationMessages.properties
 |-- faces-config.xml
 |-- jboss-web.xml
 |-- lib
 | |-- cssparser-0.9.5.jar
 | |-- guava-r08.jar
 | |-- richfaces-components-api-4.0.0.Final.jar
 | |-- richfaces-components-ui-4.0.0.Final.jar
 | |-- richfaces-core-api-4.0.0.Final.jar
 | |-- richfaces-core-impl-4.0.0.Final.jar
 | `-- sac-1.3.jar
 |-- navigation.xml
 `-- web.xml

这是个耳朵。相同文件( 除了现在它有了 application.xml ),只是结构不同。

Webapp.ear
.
|-- META-INF
| |-- application.xml
| |-- MANIFEST.MF
| `-- maven
| `-- com.webapp
| `-- Webapp-ear
| |-- pom.properties
| `-- pom.xml
|-- Webapp-ejb-1.0-SNAPSHOT.jar
`-- Webapp-web-1.0-SNAPSHOT.war

下面是 EJB jar file:

Webapp-ejb-1.0-SNAPSHOT.jar
.
|-- ApplicationResources_es.properties
|-- ApplicationResources.properties
|-- com
| `-- webapp
| |-- controller
| | |-- auth
| | | |-- ClientInfo.class
| | | |-- LoginModule.class
| | | |-- RBAC.class
| | | |-- SimpleGroup.class
| | | `-- SimplePrincipal.class
| | |-- LocaleManager.class
| | |-- SendMailBean.class
| | |-- UserRegistration.class
| | `-- UserRemoval.class
| |-- data
| | `-- UserListProducer.class
| |-- exception
| | |-- ViewExpiredExceptionExceptionHandler.class
| | `-- ViewExpiredExceptionExceptionHandlerFactory.class
| |-- model
| | |-- Entity.class
| | |-- LoginHistory.class
| | |-- Role.class
| | |-- User.class
| | `-- UserRole.class
| `-- util
| |-- Resources.class
| |-- TimestampAdapter.class
| `-- Util.class
|-- META-INF
| |-- beans.xml
| |-- MANIFEST.MF
| |-- maven
| | `-- com.webapp
| | `-- Webapp-ejb
| | |-- pom.properties
| | `-- pom.xml
| `-- persistence.xml
`-- ValidationMessages.properties

这是 file:

Webapp-web-1.0-SNAPSHOT.war
.
|-- error.xhtml
|-- index.xhtml
|-- language.xhtml
|-- login.xhtml
|-- META-INF
| |-- MANIFEST.MF
| `-- maven
| `-- com.webapp
| `-- Webapp-web
| |-- pom.properties
| `-- pom.xml
|-- register.xhtml
|-- resources
| |-- css
| | `-- layout.css
| |-- images
| | `-- logo.png
| `-- javascript
| `-- detectScreenSize.js
|-- sendMail.xhtml
|-- templates
| `-- masterLayout.xhtml
`-- WEB-INF
 |-- beans.xml
 |-- faces-config.xml
 |-- jboss-web.xml
 |-- lib
 | |-- cssparser-0.9.5.jar
 | |-- guava-r08.jar
 | |-- richfaces-components-api-4.0.0.Final.jar
 | |-- richfaces-components-ui-4.0.0.Final.jar
 | |-- richfaces-core-api-4.0.0.Final.jar
 | |-- richfaces-core-impl-4.0.0.Final.jar
 | `-- sac-1.3.jar
 |-- navigation.xml
 `-- web.xml

以下是EAR部署中的application.xml:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
 <display-name>Webapp-ear</display-name>
 <module>
 <web>
 <web-uri>Webapp-web-1.0-SNAPSHOT.war</web-uri>
 <context-root>/Webapp</context-root>
 </web>
 </module>
 <module>
 <ejb>Webapp-ejb-1.0-SNAPSHOT.jar</ejb>
 </module>
 <library-directory>lib</library-directory>
</application>

WAR部署没有错误,但EAR无法按如下方式部署:

17:41:02,059 WARN [org.jboss.modules] (MSC service thread 1-2) Failed to define class com.webapp.exception.ViewExpiredExceptionExceptionHandler in Module"deployment.Webapp.ear.Webapp-ejb-1.0-SNAPSHOT.jar:main" from Service Module Loader: java.lang.LinkageError: Failed to link com/webapp/exception/ViewExpiredExceptionExceptionHandler (Module"deployment.Webapp.ear.Webapp-ejb-1.0-SNAPSHOT.jar:main" from Service Module Loader)
 at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:396)
 at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:243)
 at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:73)
 at org.jboss.modules.Module.loadModuleClass(Module.java:505)
 at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:182)
 at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
 at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
 at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
 at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
 at org.jboss.as.jpa.hibernate4.HibernateAnnotationScanner.getPackagesInJar(HibernateAnnotationScanner.java:92)
 at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:490) [hibernate-entitymanager-4.0.0.Final.jar:4.0.0.Final]
 at org.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:852) [hibernate-entitymanager-4.0.0.Final.jar:4.0.0.Final]
 at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:597) [hibernate-entitymanager-4.0.0.Final.jar:4.0.0.Final]
 at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:72) [hibernate-entitymanager-4.0.0.Final.jar:4.0.0.Final]
 at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:149) [jboss-as-jpa-7.1.0.CR1b.jar:7.1.0.CR1b]
 at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.start(PersistenceUnitServiceImpl.java:79) [jboss-as-jpa-7.1.0.CR1b.jar:7.1.0.CR1b]
 at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1824)
 at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1759)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [:1.7.0_02]
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [:1.7.0_02]
 at java.lang.Thread.run(Thread.java:722) [:1.7.0_02]
Caused by: java.lang.NoClassDefFoundError: javax/faces/context/ExceptionHandlerWrapper
 at java.lang.ClassLoader.defineClass1(Native Method) [:1.7.0_02]
 at java.lang.ClassLoader.defineClass(ClassLoader.java:791) [:1.7.0_02]
 at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) [:1.7.0_02]
 at org.jboss.modules.ModuleClassLoader.doDefineOrLoadClass(ModuleClassLoader.java:327)
 at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:391)
. . . 20 more
Caused by: java.lang.ClassNotFoundException: javax.faces.context.ExceptionHandlerWrapper from [Module"deployment.Webapp.ear.Webapp-ejb-1.0-SNAPSHOT.jar:main" from Service Module Loader]
 at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
 at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
 at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
 at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
 at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
. . . 25 more
17:41:02,143 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC00001: Failed to start service jboss.persistenceunit."Webapp.ear/Webapp-ejb-1.0-SNAPSHOT.jar#PostgresPersistenceUnit": org.jboss.msc.service.StartException in service jboss.persistenceunit."Webapp.ear/Webapp-ejb-1.0-SNAPSHOT.jar#PostgresPersistenceUnit": Failed to start service
 at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1780) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [:1.7.0_02]
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [:1.7.0_02]
 at java.lang.Thread.run(Thread.java:722) [:1.7.0_02]
Caused by: java.lang.RuntimeException: error trying to scan <jar-file>: vfs:/content/Webapp.ear/Webapp-ejb-1.0-SNAPSHOT.jar/
 at org.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:855)
 at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:597)
 at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:72)
 at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:149)
 at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.start(PersistenceUnitServiceImpl.java:79)
 at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1824) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
 at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1759) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
. . . 3 more
Caused by: java.lang.RuntimeException: JBAS011431: Could not load entity class 'com.webapp.exception.ViewExpiredExceptionExceptionHandler' with PersistenceUnitInfo.getNewTempClassLoader()
 at org.jboss.as.jpa.hibernate4.HibernateAnnotationScanner.getPackagesInJar(HibernateAnnotationScanner.java:96)
 at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:490)
 at org.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:852)
. . . 9 more
Caused by: java.lang.ClassNotFoundException: com.webapp.exception.ViewExpiredExceptionExceptionHandler from [Module"deployment.Webapp.ear.Webapp-ejb-1.0-SNAPSHOT.jar:main" from Service Module Loader]
 at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
 at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
 at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
 at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
 at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
 at org.jboss.as.jpa.hibernate4.HibernateAnnotationScanner.getPackagesInJar(HibernateAnnotationScanner.java:92)
. . . 11 more

奇怪的是,错误是:

Caused by: java.lang.RuntimeException: JBAS011431: Could not load entity class 'com.webapp.exception.ViewExpiredExceptionExceptionHandler' with PersistenceUnitInfo.getNewTempClassLoader()

ViewExpiredExceptionHandler 不是实体,因此 PersistenceUnitInfo 为什么要加载它?

我使用了"org.jboss.spec.archetypes:jboss-javaee6-ear-webapp"为EAR项目生成模板和的Maven 原型,我使用 Maven jboss-as:deploy 插件来部署 EAR 。我在用 jboss-as-7.1.0.CR1b

我的web.xml的servlet规范 3.0:

<web-app
 version="3.0"
 xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

我在这里am什么?请帮助。

时间:原作者:

141 4

首先,你的EJB bean永远不应该依赖于 JSF 。JSF是为查看应用程序( html+backing bean )的一部分而设计的框架。EJB模块应该没有关于JSF的知识。

如果你确实需要从EJB方法引用 JSF,你必须明确告知容器( JBoss 7.1.) 这个模块依赖于JSF模块。你可以在这里找到详细信息:https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

原作者:
81 2

使用EAR部署时,ejb应该位于EAR的/lib 目录中,或者你需要添加<ear-subdeployments-isolated>false</ear-subdeployments-isolated>使子系统能够识别 EJB jar 。

另一个选择是添加Dependencies: Webapp-ejb-1.0-SNAPSHOT到你战争中的MANIFEST.MF 。

你可以从以下文档中获取更多关于类加载的信息 https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

原作者:
...