<application>
   <display-name>EJB3 Ear tutorial</display-name>
   <module>
      <web>
         <web-uri>tutorial.war</web-uri>
         <context-root>/tutorial</context-root>
      </web>
   </module>
   <module>
      <ejb>tutorial.jar</ejb>
   </module>
</application>
   public void init() throws ServletException
   {
      super.init();
      try
      {
         InitialContext ctx = new InitialContext();
         // J2EE 1.5 has not yet defined exact XML <ejb-ref> syntax for EJB3
         CalculatorLocal calculator = (CalculatorLocal) ctx.lookup("tutorial/CalculatorBean/local");
         setCalculator(calculator);
      }
      catch (NamingException e)
      {
         throw new RuntimeException(e);
      }
   }
One thing about EAR packaging is that the default JNDI name is recalculated to be EARNAME/EJBNAME/local for Local interfaces and EARNAME/EJBNAME/remote for remote interfaces.
To give you a preview of how injection will work inside servlets/jsps, we've simulated the code. Take a look at CalculatorActionServlet.java. You can use this pattern until the XML Schema is updated for J2EE 1.5 for injection, or until Tomcat supports EJB injection annotations.
   private CalculatorLocal calculator;
   /**
    * The @EJB annotation is similated.  Tomcat does not yet understand injection annotations.
    * @param calculator
    */
   @EJB(name = "calculator")
   public void setCalculator(CalculatorLocal calculator)
   {
      this.calculator = calculator;
   }
<persistence>
   <persistence-unit name="testdb">
      ...
   <properties>
      <property name="entity.manager.factory.jndi.name" value="java:/MyEntityManagerFactory"/>
   </properties>
</persistence>
Unix: $ export JBOSS_HOME=<where your jboss 4.0 distribution is> Windows: $ set JBOSS_HOME=<where your jboss 4.0 distribution is> $ ant
After building, you can then goto calculator.jsp