How to force JBoss to deploy the EJB first in an EAR ?

Sometimes the order of deployed units, in an Enterprise application matters. For example, if you are deploying an EAR which is made up of a WEB application an EJB, it can be necessary that the EJB application is deployed at first.

A typical scenario is a Web application uses ServletContextListeners. If the ServletContextListener tries to access the EJB, as soon as the Web component is deployed, a NamingException might be the outcome of it, because the EJB hasn’t been still bound in the JNDI.

The quick fix to it is adding a ContextComparator in conf\bootstrap\deployers.xml file:  

<bean name="topContextComparator">
  <constructor factoryClass="org.jboss.system.deployers.LegacyDeploymentContextComparator" factoryMethod="getInstance"/>
  <property name="suffixOrder" class="java.util.Map">
    <map keyClass="java.lang.String" valueClass="java.lang.Integer">
      <entry>
        <key>.war</key>
        <value>700</value>
      </entry>
    </map>
  </property>
</bean>

This will ensure that your Web application is loaded after the EJB modules.