EAR vs separate EJB + WAR

There seems to be some confusion between 3 variants of deployment:

  1. An EAR that includes an EJB and WEB module
  2. Deploying a separate EJB module and a separate WEB module
  3. Deploying a WEB module that includes EJB classes or an EJB jar.

In the first situation, you have logically one application, but one that is divided in two tiers. The WEB module is isolated from the EJB module in the sense that it can consume classes from EJB module, but the EJB module can not consume classes from the WEB module. Since it’s a single application local access to EJB beans can be used and injection of EJB beans works as expected.

In the second situation (which you seem to be referring to in your question) there isn’t a logical single application, but really two separate modules. They do run in the same JVM, but officially Java EE does not allow to use local access and remote access has to be used (although practically local access often works anyway). Also, injection of EJB beans in beans in the web module does not work directly with a simple @EJB annotation, but instead the lookup attribute has to be used that specifies the global JNDI name.

Finally, the third situation (which you don’t seem to mention, but ‘home’ mentions) is a bit similar to the first one, but there are no tiers and isolation in this case. EJB beans can access all classes from the rest of the web module directly.

The web profile only supports this last deployment situation. Both EAR and standalone EJB deployments are not supported.

Leave a Comment