Takashi Nishigaya
Nishigaya's Weblog
Profile
Takashi Nishigaya
Sr. Java Architect
SunJava Consulting
Professional Services Delivery
アーカイブ
« 11月 2009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
     
       
今日
Click me to subscribe
Search

Java.net
リンク
 
« Java EE 5チュートリアル:EJB... | メイン | Java EE 5: Dependenc... »
木曜日 7 20, 2006
Java EE 5:デプロイメント記述子(web.xml, ejb-jar.xml, application.xml)を省略できる条件について

Java EE 5では、Webアプリケーションの構成情報をコンテナに伝えるためのデプロイメント記述子(Deployment Descriptor:DD)と呼ばれるXMLファイルを多くの場合省略することができるようになっています。Java EE 5仕様の標準デプロイメント記述子は、J2EE 1.4と同様、以下のものがあります。

  1. web.xml:Webモジュール(WARファイル)の設定情報
  2. ejb-jar.xml:EJBモジュール(EJB-JARファイル)の設定情報
  3. application.xml:Webアプリケーション(EARファイル)の設定情報
  4. application-client.xml:クライアント・アプリケーション(クライアントJARファイル)の設定情報
  5. webservices.xml:Webサービス用設定情報。WebモジュールまたはEJBモジュールのMETA-INFディレクトリに含めます。J2EE 1.4ではwebservices.xml以外に、WSDLファイル、WSDLマッピングファイルが必須のDDファイルとなっていました
  6. ra.xml:コネクタ・アーキテクチャ仕様に基づくリソース・アダプタ・モジュール(RARファイル)の設定ファイル

上記のうち、(Java EE 5でバージョンが上がらなかったコネクタ・アーキテクチャ仕様1.5の)ra.xml以外のデプロイメント記述子が省略可能になっています。一般的なWebアプリケーション(EARファイル)は以下のような構成になると思いますが、この場合、J2EE 1.4では必須であったweb.xml、ejb-jar.xml、application.xmlが省略可能となります。

ただし、web.xmlについてはWebモジュール内にServlet、Filter、リスナのいずれかが含まれる場合は、web.xmlは省略できないようです([1])。WebモジュールにJSPやWebサービスクラスだけが含まれる場合はweb.xmlが省略できます。

ejb-jar.xmlは、アノーテーションとデフォルトの振舞いによりejb-jarモジュールに含まれる全てのEJB、Webサービス、インターセプターおよびパーシスタンス・クラスの設定情報が十分に表現されているのであれば省略することができます。

また、EARファイルに必須であったapplication.xmlも省略可能となっています。例えば、EJBモジュールとしてcalc.jarがあり、Webモジュールとしてcalc.warがあったとします。この2つからearファイルを作成するためには、従来、以下のようなapplication.xmlをEARファイル内のMETA-INFディレクトリに含める必要がありました。

<application xmlns="http://java.sun.com/xml/ns/javaee" version="5"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                 http://java.sun.com/xml/ns/javaee/application_5.xsd">
  <description>Application description</description>
  <module>
    <ejb>calc.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>calc.war</web-uri>
      <context-root>calc</context-root>
    </web>
  </module>
</application>

実際には、上記のapplication.xmlは省略することができ、jarコマンドを用いて構成要素となるモジュールをEARファイルに含めればよいだけです。

$ jar cvf calc.ear calc.war calc.jar
$ jar tf calc.ear
META-INF/
META-INF/MANIFEST.MF
calc.war
calc.jar

application.xmlがEARファイルに存在しない場合のモジュールの判別ルールの詳細は、Java EE Specification V5.0, EE.8.4.2節 Deploying a Java EE Application, pp.166に記述がありますが、Configuration by Exceptionコンセプト(デフォルト・ルールを変更したい場合にのみ好みの設定をすればよいという考え方)に基づいた現実的なルールになっていることが分かります。以下にそのルールを抜粋します。

  1. EARファイル内で、ファイル拡張子が.warのものはWebモジュールとして扱う。ここで、そのWebモジュールのコンテキスト・ルート(<context-root>要素の値)は、そのWARファイル名から.warを除いたものになる。
  2. EARファイル内で、ファイル拡張子が.rarのものはリソース・アダプタとして扱う。
  3. ディレクトリlib内にあるファイル拡張子が.jarのファイルは、そのアプリケーションで使用する拡張ライブラリとして扱う。
  4. ディレクトリlib以外にあるファイル拡張子が.jarのファイルは、以下のルールに従う:
    1. そのJARファイルのMETA-INF/MANIFEST.MFにMain-Class属性があるか、またはMETA-INF/application-client.xmlがあれば、そのJARファイルをアプリケーション・クライアント・モジュールとして扱う。
    2. そのJARファイルにMETA-INF/ejb-jar.xmlが含まれているか、またはEJBコンポーネントを示すアノーテーション(@Statelessなど)が付与されたクラスが含まれていれば、そのJARファイルをEJBモジュールとして扱う。
    3. 他のJARファイルは無視する。ただし、他のモジュールのMETA-INF/MANIFEST.MFのClass-Path属性で参照されていれば、拡張ライブラリとして扱う。

このように、ほとんどの現実的なアプリケーションではapplication.xmlを省略することができそうです。しかしながら、アプリケーションの規模が大きくなってくると、AppServerのデプロイヤがアーカイブ内のファイルやクラスを走査するオーバヘッドが大きくなり、アプリケーションの起動時間が気になってくるかもしれません。そのような場合には、きちんとapplication.xmlやejb-jar.xmlをアプリケーションに含めてあげた方がいいでしょう。その場合でも、手作業でデプロイメント記述子を書く必要はありません。SJS AppServer 9(glassfish)では、AppServerのデプロイヤがデプロイ時に自動生成した各種デプロイメント記述子が以下のディレクトリに保存されています。

$ASROOT/domains/domain1/generated/xml/j2ee-apps/calc/calc_jar/META-INF/ejb-jar.xml
$ASROOT/domains/domain1/generated/xml/j2ee-apps/calc/calc_jar/META-INF/sun-ejb-jar.xml
$ASROOT/domains/domain1/generated/xml/j2ee-apps/calc/calc_war/WEB-INF/sun-web.xml
$ASROOT/domains/domain1/generated/xml/j2ee-apps/calc/calc_war/WEB-INF/web.xml
$ASROOT/domains/domain1/generated/xml/j2ee-apps/calc/META-INF/application.xml
$ASROOT/domains/domain1/generated/xml/j2ee-apps/calc/META-INF/sun-application.xml

上記のファイルを開発中のソース・コード・ツリーにコピーして利用すればOKです。


[1] Servlet APIはJava EE 5で2.5にマイナー・バージョン・アップされましたが、新しいJSRは割り当てられず、JSR-154のメンテナンス・リリースという位置付けになります。JSRドキュメントしてはServlet Specification V2.5, Maintenance Draft Review 5として公開されているものが最新のようで、Java EE 5の仕様としては、このドラフトMR5を参照していると思われます。web.xmlが省略できる場合についての記述は、ドラフトMR5の「SRV.9.13 Inclusion of a web.xml Deployment Descriptor」節, pp.73に記述があります。以下、この記述の抜粋です。

A web application is NOT required to contain a web.xml if it does NOT contain any
Servlet, Filter, or Listener components. In other words an application containing
only static files or JSP pages does not require a web.xml to be present.

Webサービス専用のWARファイルを作成するのでない限り、現実的なアプリケーション開発ではweb.xmlを省略できるケースはまずないと考えていいでしょう。Java EE 5全体のEoD化の目標に対して、Web層の仕様だけは出遅れた感が否めません。将来のServlet 3.0、JSF 2.0ではアノーテーションを導入したデプロイメント記述子の省略ができるようになることが期待されます。

Posted at 11:45午後 7 20, 2006 by Takashi Nishigaya in Java  |  投稿されたコメント[1]

投稿されたコメント:

cool

Posted by wow gold on 11月月 03日, 2008年 at 10:39 午前 JST #

コメント
  • HTML文法 不許可
« Java EE 5チュートリアル:EJB... | メイン | Java EE 5: Dependenc... »