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 のデフォルトの場所とすべきかを指定します。