2

I take the same exact same web application and deploy it as an WAR with no problems. However, same application deployed as EAR fails. Same files, just different deployment. First, look at the WAR:

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

Now, here is the EAR. Same files (except for now it has application.xml), just different structure.

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

Here's the 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

Here's the WAR 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

Here is the application.xml in the EAR deployment:

<?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>

The WAR deploys without errors, but the EAR fails to be deployed as follows:

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

It's strange that the error is:

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

The ViewExpiredExceptionHandler is not an entity, so why would PersistenceUnitInfo try to be loading it?

I used the "org.jboss.spec.archetypes:jboss-javaee6-ear-webapp" maven archetype to generate the template and poms for the EAR project and I use maven jboss-as:deploy plugin to deploy the EAR. I am using jboss-as-7.1.0.CR1b.

My web.xml is servlet spec 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">

What am I not getting here? Please help.

Matteo
  • 14,696
  • 9
  • 68
  • 106
Patrick Garner
  • 3,201
  • 6
  • 39
  • 58

2 Answers2

2

When using an EAR deployment, EJB's should be in the /lib directory of the EAR or you need to add <ear-subdeployments-isolated>false</ear-subdeployments-isolated> to get the EE subsystem to recognize the EJB JAR.

Another option would be to add Dependencies: Webapp-ejb-1.0-SNAPSHOT to the MANIFEST.MF in your WAR.

You can get more information on class loading with EAR's from the following documentation https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7.

James R. Perkins
  • 16,800
  • 44
  • 60
  • I read the info you pointed to and it was very helpful. I used jboss' maven archetype "org.jboss.spec.archetypes:jboss-javaee6-ear-webapp" to generate the project and it did not include Dependencies or Class-Path manifest entries although it did have an ejb -- see [here](http://stackoverflow.com/a/8776267/984932) to see the project the archetype generated -- probably because JBoss' defaults to false. The ejb in the project has a producer method that is accessed from a facelet view and it works fine without any JBoss configuration modifications. – Patrick Garner Feb 06 '12 at 20:25
  • But the problem I'm having is unrelated to modules within an EAR being able to access other classes within the EAR. In order to debug I removed ViewExpiredExceptionHandler from the application and discovered that the underlying problem is that classes in the EJB module cannot reference any object in faces.context.* packages, else a ClassNotFoundException is thrown. When I remove references to FacesContext, ActionEvent, etc. objects the application deploys without error. It's got to be a bug with JBoss AS7. There is a discussion about it [here](https://community.jboss.org/thread/194780). – Patrick Garner Feb 06 '12 at 20:34
  • Okay, ready on the forum it does look like there are some dependencies you need to add to your EJB deployment. It does look like you're getting better help there, so I'll leave it to the forums :-) – James R. Perkins Feb 07 '12 at 17:09
  • @JamesR.Perkins I am also facing the same issue. Can you please tell me where to add false this line ? Actually i am not getting the term EE subsystem. So in which file I supposed to add this line. – mahendra kawde Sep 09 '15 at 10:37
  • @JamesR.Perkins Please see http://stackoverflow.com/questions/32479487/wildfly-9-0-1-final-ear-deployment-failed thread – mahendra kawde Sep 09 '15 at 12:40
2

First of all Your EJB beans should never depend on JSF libraries. JSF is framework designed for view part of the application (html+backing beans). EJB module should operate without the knowledge about JSF.

If You really need to reference JSF from EJB method you have to explicitly inform container (JBoss 7.1.) that this module depends on JSF module. You can find details here: https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

pWoz
  • 1,649
  • 3
  • 20
  • 30