2012-02-05 161 views
2

我采用完全相同的Web应用程序,并将其部署为WAR,没有任何问题。但是,部署为EAR的相同应用程序失败。相同的文件,只是不同的部署。首先看WAR:JBoss AS 7错误: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 

现在,这里是EAR。相同的文件(除了现在它有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文件:

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 

这里的WAR文件:

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:

​​

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" maven原型来生成EAR项目的模板和poms,我使用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"> 

什么我没有得到吗?请帮忙。

回答

2

首先你的EJB bean不应该依赖于JSF库。 JSF是为查看部分应用程序而设计的框架(html + backing beans)。 EJB模块应该在没有关于JSF的知识的情况下运行。

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

+1

类加载文档为7.1可在https:// docs上找到。 jboss.org/author/display/AS71/Class+Loading+in+AS7 – ctomc 2013-07-02 10:15:47

2

当使用EAR部署时,EJB应位于EAR的/lib目录中,或者您需要添加<ear-subdeployments-isolated>false</ear-subdeployments-isolated>以使EE子系统识别EJB JAR。

另一种选择是将Dependencies: Webapp-ejb-1.0-SNAPSHOT添加到WAR中的MANIFEST.MF。

您可以从以下文档https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7中获得有关使用EAR进行类加载的更多信息。

+0

我读了你指出的信息,这是非常有帮助的。我使用jboss'maven archetype“org.jboss.spec.archetypes:jboss-javaee6-ear-webapp”来生成项目,它没有包含依赖项或类路径清单条目,尽管它确实有一个ejb - 见[here ](HTTP://计算器。com/a/8776267/984932)查看原型生成的项目 - 可能是因为JBoss'默认为false。项目中的ejb有一个可以从facelet视图访问的生产者方法,并且在没有任何JBoss配置修改的情况下工作正常。 – 2012-02-06 20:25:21

+0

但是我遇到的问题与EAR中的模块无关,无法访问EAR中的其他类。为了调试,我从应用程序中删除了ViewExpiredExceptionHandler,并发现底层问题是EJB模块中的类不能引用faces.context。*包中的任何对象,否则会引发ClassNotFoundException。当我删除对FacesContext,ActionEvent等对象的引用时,应用程序无错地部署。这应该是JBoss AS7的一个bug。有关于它的讨论[这里](https://community.jboss.org/thread/194780)。 – 2012-02-06 20:34:36

+0

好的,在论坛上准备好了,它确实有一些需要添加到EJB部署中的依赖关系。它看起来像你在那里得到了更好的帮助,所以我将它留给论坛:-) – 2012-02-07 17:09:46