4.4.2. EJB3 JAR で EAR をデプロイ

Java EE アプリケーションは、EAR アーカイブとしてデプロイされます。EAR アーカイブは、通常 Web ページ、サーブレット、その他の Web 関連のコンポーネント、WAR コンポーネントにサービス (例:データアクセスやトランザクション) を提供する1 つ以上の EJB3 JAR、アプリケーションが必要とするサポートライブラリ JAR 向けの WAR アーカイブを含む JAR ファイルです。EAR ファイルには application.xml や jboss-app.xml など、配備記述子 があります。以下に一般的な EAR アプリケーションの基本構造を示しました。

myapp.ear
|+ META-INF
   |+ applications.xml and jboss-app.xml
|+ myapp.war
   |+ web pages and JSP /JSF pages
   |+ WEB-INF
      |+ web.xml, jboss-web.xml, faces-config.xml etc.
      |+ lib
         |+ tag library JARs
      |+ classes
         |+ servlets and other classes used by web pages
|+ myapp.jar
   |+ EJB3 bean classes
   |+ META-INF
      |+ ejb-jar.xml and persistence.xml
|+ lib
   |+ Library JARs for the EAR

JBoss AS では他の多くのアプリケーションサーバーとは違い、WAR ファイルのコンポーネントが EJB3 サービスにアクセスできるように web.xml ファイルで EJB 参照を宣言する必要がありません。本章で前述したように、JNDI から直接参照を取得することができます。
一般的な application.xml ファイルは以下の通りです。このファイルは、WAR と EJB3 JAR アーカイブを EAR で宣言し、アプリケーションの Web コンテンツルートを定義します。当然、同じ EAR アプリケーション内に複数の EJB3 モジュールを持たせることができます。application.xml ファイルはオプションで、このアプリケーション内で利用する JAR ファイルの共有クラスパスを定義することも可能です。JAR ファイルの場所は、デフォルトで JBoss AS の lib になっていますが、他のアプリケーションサーバーでは異なる可能性もあります。

<application>
  <display-name>My Application</display-name>

  <module>
    <web>
      <web-uri>myapp.war</web-uri>
      <context-root>/myapp</context-root>
    </web>
  </module>

  <module>
    <ejb>myapp.jar</ejb>
  </module>
  
  <library-directory>lib</library-directory>

</application>

jboss-app.xml ファイルで、EAR アプリケーション向けに JBoss 固有のデプロイメントを設定できます。例えば、EAR 内でモジュールのデプロイメントの順番を指定、SAR (ARchive for MBean) や HAR (Hibernate ARchive for Hibernate objects) など JBoss 固有のアプリケーションモジュールを EAR にデプロイ、このアプリケーションで利用可能なセキュリティドメインと JMX MBean を提供します。jboss-app.xml で利用可能な属性については、DTD : http://www.jboss.org/j2ee/dtd/jboss-app_4_2.dtd を参照してください。
jboss-app.xml の一般的な用途は、他のアプリケーションとの名前の衝突を避けるため、この EAR ファイルを独自にスコープ設定されたクラスローダーにデプロイすべきかを設定することです。お使いの EAR アプリケーションが、独自にスコープ設定されたクラスローダー内にデプロイされ、EJB3 JAR に永続ユニットが1つのみ定義されている場合、@PersistenceContext アノテーションに永続ユニット名を渡す必要なく、@PersistenceContext EntityManager を使い EntityManager をセッション bean に注入することができます。以下のjboss-app.xml は、EAR アプリケーションに対しスコープ設定されたクラスローダー myapp:archive=myapp.を指定しています。

<jboss-app>
      <loader-repository>
      myapp:archive=myapp.ear
      </loader-repository>
</jboss-app>

EAR デプロイメントは、JBOSS_DIST/server/default/deploy/ear-deploy.xml で設定します。このファイルには、以下のような3つの属性が含まれています。

<server>
   <mbean code="org.jboss.deployment.EARDeployer"
          name="jboss.j2ee:service=EARDeployer">
      <!-- 
          A flag indicating if ear deployments should 
           have their own scoped class loader to isolate 
           their classes from other deployments.
      -->
      <attribute name="Isolated">false</attribute>
      
      <!-- 
          A flag indicating if the ear components should 
          have in VM call optimization disabled.
      -->
      <attribute name="CallByValue">false</attribute>
      
      <!-- 
          A flag the enables the default behavior of 
          the ee5 library-directory. If true, the lib 
          contents of an ear are assumed to be the default 
          value for library-directory in the absence of 
          an explicit library-directory. If false, there 
          must be an explicit library-directory.
      -->
      <attribute name="EnablelibDirectoryByDefault">true</attribute>
   </mbean>
</server>

Isolated パラメーターを true に設定した場合、EAR デプロイメントはすべて、デフォルトでスコープ設定されたクラスローダーを持つことになります。jboss-app.xml でクラスローダーを定義する必要はありません。CallByValue 属性は、全 EJB 呼び出しをリモートの呼び出しとして処理するべきかを指定します。リモート呼び出しは、ローカルの参照渡しと比較すると、大幅にパフォーマンスが低下しています。理由は、リモート呼び出しのオブジェクトは、シリアル化、デシリアル化される必要があるためです。アプリケーションの多くは、WAR および EJB3 JAR を同じサーバー上でデプロイするため、この値はデフォルトで false になっており、サーバーはローカルの参照渡しを使い同じ JVM 内にある EJB メソッドを呼び出します。EnablelibDirectoryByDefault 属性は、EAR アーカイブの lib ディレクトリが共有ライブラリ JAR のデフォルトの場所とすべきかを指定します。