Apache Tomcat Version 6.0.x から WebSphere Application Server Community Edition V2.1 にマイグレートする

この記事ではまず、アプリケーションを Tomcat 6.0 にデプロイするための手順を説明した後、そのコードを WebSphere® Application Server Community Edition V2.1 にマイグレートしてデプロイする手順を説明します。この記事で紹介するサンプル・アプリケーションから、この 2 つの実装の間での大きな違いのいくつかを明確に知ることができます。

はじめに

今すぐ Community Edition V2.1 をダウンロードしてください
IBM WebSphere Application Server Community Edition V2.1 は無料で入手、デプロイすることができます。今すぐダウンロードし、作業を始めてください。

IBM WebSphere Application Server Community Edition (以下、Community Edition と呼ぶことにします) は Java™ Enterprise Edition 5 (Java EE5) 認定のアプリケーション・サーバーであり、さまざまなコンポーネントが統合されています (データ用の Apache Derby やメッセージング・サービス用の Active MQ、Web サービス用の Apache Axis など)。

Community Edition は Apache Geronimo を中核とする GBean (Geronimo Beans) アーキテクチャーを使って構築されています。Community Edition はフットプリントが小さく、使いやすく、無料で入手することができ、またオプションとして IBM による世界クラスのサポートを利用できることから、小規模から中規模の組織にとって理想的なものです。

Apache Tomcat は Apache Software Foundation によって開発された Web コンテナーです。Apache Tomcat は Java Servlet API と JSP (Java Server Pages) API を実装しています。Tomcat Version 6.0.x は Java Servlet 2.5 API と JSP 2.1 API を実装しています。

この記事では、サンプル・アプリケーションを Tomcat 6.0.x から Community Edition 2.1 にマイグレートするための手順を説明しますが、Tomcat 5.x からのマイグレーションもほとんど同じはずです。Tomcat のバージョン 5.x は Java Servlet 2.4 API と JSP 2.0 API を実装しており、また Community Edition 2.1 はこれらのバージョンと後方互換性があります。ただし、構成の定義方法に関しては少し違いがあるかもしれません。

Apache Tomcat で開発されたアプリケーションを Community Edition にマイグレートする手順を説明するこの記事で、Tomcat と Community Edition でのアプリケーション開発に使用したのは Eclipse IDE です。この記事は次のセクションで構成されています。


アーキテクチャーの分析 - 類似点と相違点

図 1. Geronimo (Community Edition) のアーキテクチャー
Geronimo (Community Edition) のアーキテクチャー

図 1 を見るとわかるように、Community Edition はコンポーネントから成るアーキテクチャーになっており、さまざまなオープンソース・コミュニティーによる、最高のオープンソースの製品群を組み合わせて構成されています。Apache Tomcat は Community Edition のデフォルトの Web コンテナーです。そのため、Tomcat で開発されたアプリケーションは容易に Community Edition にマイグレートすることができます。

Community Edition に関する作業を行う際には、スタンドアロンの Tomcat と同じ Tomcat サーバーに対して作業することになります。そのため、Community Edition 用にアプリケーションを再度パッケージ化する必要はありません。一方で Tomcat から Community Edition にアプリケーションをマイグレートする際には、わずかですが、その違いに対応する必要があります。この違いが生ずる理由は、Tomcat は単なるサーブレット・コンテナーとしてデプロイされるわけではなく、Community Edition の中にサービスとしてデプロイされ、Java EE5 認定のアプリケーション・サーバーで利用可能な機能を提供するためです。Community Edition での Tomcat は Community Edition にデプロイされる他のコンテナー・サービスと統合されます。そうしたサービスには次のようなものがあります。

  • JMS (Apache ActiveMQ)
  • データベース (Apache Derby)
  • EJB (Apache OpenEJB)
  • Web サービス (Apache Axis)
  • パーシスタンス (Apache OpenJPA)
  • ロギング
  • セキュリティー

マイグレーションに関する問題の大部分を克服するためには、それぞれのサービスがどのように Tomcat の中にマッピングされ、またどのように Community Edition に適用されるのかを理解する必要があります。Tomcat の基本的なアーキテクチャーは同じですが、Community Edition の中では Tomcat は GBean として定義されます。この実装によって、新しいバージョンの Tomcat を今後のバージョンの Community Edition に容易に統合することができます。

下記の表は、スタンドアロンの Tomcat と Community Edition の中で実行される Tomcat との主な相違点と類似点を示しています。

表 1. Tomcat V6.0.x と Community Edition V2.1 の機能の比較
機能TomcatCommunity Edition
Java サーブレットServlet 2.5 API を実装しています。Servlet 2.5 API を実装しています。
JSPJSP 2.1 API を実装しています。JSP 2.1 API を実装しています。
JNDI通常は server.xml によって手動で構成されます。JNDI は Geronimo カーネルによって管理されるオブジェクト参照にアクセスすることができます。
JMScontext.xml によって手動で構成されます。Web ベースの GUI を使って JMS リソースを作成します。
JDBC データ・ソースcontext.xml によって手動で構成されます。Web ベースの GUI を使って JDBC データ・ソースを作成します。
Web サービス (Apache Axis)Axis.war をデプロイすることによって WebServices 機能が導入されます。Axis は Community Edition に始めから統合されています
セキュリティー・レルムserver.xml ファイルまたは context.xml ファイルを使って構成されます。あらゆるコンポーネントへのアクセス許可認証に利用できる、コンテナー管理のレルムをサポートします。個々のコンポーネント・レルムが定義される場合もあります。
さまざまなコネクター複数のプロコル・ハンドラーが同じエンジンにアクセスします。同じエンジンに対して HTTP コネクターと SSL コネクターが同時に動作します。管理コンソールを使ってさまざまなコネクターを構成します (HTTP、SSL、そしてロード・バランシングやクラスタリングに使用される Apache JServ プロトコル (AJP13) など)。
仮想ホスト同じ IP アドレス上の異なる Web サイトをホストすることができます。この構成には server.xml が使われます。同様の機能は config.xml を構成することで実現することができます。
デプロイメント記述子web.xml は WAR (J2EE Web アプリケーション) 用のデフォルトのデプロイメント記述子です。web.xml は WAR (J2EE Web アプリケーション) 用のデフォルトのデプロイメント記述子です。
デプロイメント・プランベンダー特有のデプロイメント記述子はありません。Community Edition には Geronimo 特有のサービスを構成するための Geronimo 特有のデプロイメント記述子があります。Web アプリケーションの場合には geronimo-web.xml がデプロイメント・プランです。

Community Edition での構成の大部分は、geronimo-web.xmlconfig.xml、または config-substitution.properties といったデプロイメント・プランの 1 つを使って行われます。また、JMS キューや接続ファクトリー、JDBC データ・ソースなどのリソースも Web ベースの管理コンソールを使って容易に追加することができます。管理コンソールを利用することによって、Tomcat で server.xmlcontext.xml を使って行われる手動による構成に比べ、構成の管理を単純化することができます。


サンプル・アプリケーションについて

このサンプル・アプリケーションは Tomcat V6.0.x から Community Edition V2.1 にマイグレートしたものであり、雑貨店のアプリケーションです。このアプリケーションは次のようなコンポーネントを使用します。

  • JSP
  • サーブレット
  • JSTL (JSP Standard Tag Library)
  • Apache Derby JDBC データ・ソース
  • Apache ActiveMQ ベースの JMS
  • Apache Axis ベースの Web サービス

また、このアプリケーションは Tomcat でデフォルトの UserRealm を使ってユーザーを認証しますが、Community Edition ではデフォルトで geronimo-admin レルムを使います。

この記事に含まれているサンプル・アプリケーションは、次のような内容を持つ 1 つの WAR モジュールで構成されています。

  • generalstore.jsp - 買い物用のカタログをユーザーに表示します。外部の Web サービスを使って現在の IBM の株価を表示します。
  • checkoutcart.jsp - ショッピング・カートをユーザーに表示します。Derby データ・ソースの RDBMS を使ってユーザー向けのメッセージを表示します。外部の Web サービスを使って IBM の株価を表示します。
  • generalstore.css - generalstore.jsp と checkoutcart.jsp の両 JSP ページで HTML 要素のフォーマットを設定するために使われるスタイルシートです。
  • StockService.wsdl - Web サービスの場所と、そのサービス内で利用可能なメソッドを記述します。この WSDL ファイルを使って必要な Java クラスを生成し、また Eclipse のツールを使ってこれらのクラスのファイルを生成します。
  • StoreController.java - JSP にリクエストを送るためのメイン・コントローラーです。またカテゴリーと製品の情報を取得し、JSP が表示するための属性としてそれらの情報を付加します。
  • GeneralStore.java - アプリケーションが必要とするデータを返すメソッドを含んでいます。また、カスタムのタグ・ライブラリーを実装する関数も含んでいます (generalstore-taglib.tld を参照してください)。
  • Category.java、Product.java、LineItem.java - アプリケーションのモデルとビューの間でデータを送受信する際に値を保持するために使用される JavaBeans です。
  • CheckOut.java - 注文を完了し、その注文を在庫管理のマネージャーに送信します。

アプリケーションをデプロイするために Tomcat をセットアップする

Tomcat のコネクターの構成

Tomcat サーバーはデフォルトでポート 8080 に対するリクエストをリッスンします。デフォルトのポートを変更するためには <Tomcat_Home>/conf/server.xml を変更します。リスト 1 はデフォルトのポートの構成を変更するために必要な変更を示しています。

リスト 1. server.xml での Tomcat のコネクターの構成
<Service name="Catalina">
     ...
     ...
<Connector port="8080" 
 protocol="HTTP/1.1" 
 connectionTimeout="20000"
 redirectPort="8443" />

ポートの値を、適当な任意の値に変更します。server.xml に対してどのような構成の変更を行う場合にも、その変更の前にサーバーを停止することを忘れないでください。この変更を有効にするにはサーバーを再起動します。

Tomcat の認証レルムの構成

Tomcat の中でレルムは、ユーザーとグループ、そしてパスワードの情報を維持します。通常は Tomcat の UserDatabaseRealm の構成を行うことで、ユーザーがこの店にアクセスする前にユーザーを認証できるようにします。またこのレルムを server.xml ファイルによって設定することもできます。リスト 2 の server.xml のコード・セグメントで太字になっている行は、この認証レルムの構成を表しています。

リスト 2. server.xml によって Tomcat の UserDatabaseRealm を構成する
<Server port="8005" shutdown="SHUTDOWN">
     ...
    <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  ... 
  <Service name="Catalina">
  
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />

      ...

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

上記の構成は、ユーザーとパスワード、そしてロールの情報を維持するために conf/tomcat-users.xml ファイルを使うように UserDatabaseRealm を設定します。このレルムは <Engine> のレベルで構成されるため、Tomcat の <Engine> コンポーネント・インスタンス上で実行されるすべてのホストでこのレルムを利用することができます。

このデフォルトの構成はそのまま使用できるため、このアプリケーションを実行するために conf/server.xml ファイルに変更を加える必要はありません。ただし conf/tomcat-users.xml ファイルには少し変更を加える必要があります (このファイルでは UserDatabaseRealm の中にすべてのユーザー情報を保持します)。リスト 3 に太字で示した変更を tomcat-users.xml ファイルに加えます。

リスト 3. tomcat-users.xml の中で Tomcat ユーザーに対して admin ロールと manager ロールを追加する
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat,manager,admin"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
</tomcat-users>

このコードは manager グループと admin グループの一部として、(「tomcat」というパスワードを持つ) tomcat ユーザー・ロールを割り当てます。

このアプリケーションの web.xml ファイルの中で、この店のコントローラーは保護され、「admin」ロールを持つユーザーのみにアクセスを許可しています。リスト 4 で太字になっている行は、このアプリケーションを保護する web.xml のコードを示しています (コード・ディストリビューションの dd ディレクトリーの中にあります)。

リスト 4. アプリケーションに対して認証によるアクセス保護を行う web.xml デプロイメント記述子
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns="http://java.sun.com/xml/ns/javaee" 
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
  id="WebApp_ID" version="2.5">
  <display-name>ShoppingStore</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>GeneralStore</servlet-name>
    <servlet-class>com.ibm.wasce.store.StoreController</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GeneralStore</servlet-name>
    <url-pattern>/store.cgi</url-pattern>
  </servlet-mapping>
  <resource-ref>
    <description>Derby DB connection</description>
    <res-ref-name>jdbc/storeDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
  <security-constraint>
    <display-name>General Store Security Constraint</display-name>
    <web-resource-collection>
      <web-resource-name>Entire store</web-resource-name>
      <url-pattern>*.cgi</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>admin</role-name>
    </auth-constraint>
  </security-constraint>
  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Shopping Realm</realm-name>
  </login-config>
  <security-role>
    <role-name>admin</role-name>
  </security-role>
  <servlet>
    <description></description>
    <display-name>CheckOut</display-name>
    <servlet-name>CheckOut</servlet-name>
    <servlet-class>com.ibm.wasce.store.CheckOut</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CheckOut</servlet-name>
    <url-pattern>/CheckOut</url-pattern>
  </servlet-mapping>
</web-app>

上記のコードの中にある <security-constraint> 要素と <security-role> 要素は標準的な J2EE セキュリティー構成要素であり、別のコンテナーでもそのまま使用することができます。そのため、変更されていない同じ web.xml を後ほど Community Edition 環境の中で使用することができます。

ネットワーク Derby サーバーをセットアップする

最初に、Apache Derby 10.3.1 がインストールされていることを確認します。確認できたら次のステップに従います。

  1. DERBY_INSTALL 環境変数を Derby のインストール・ディレクトリーに設定します。CLASSPATH 環境変数の中に次の要素を含めます。
    • lib/derby.jar
    • lib/derbytools.jar
    • lib/derbynet.jar
    • lib/derbyclient.jar
  2. 次のコマンドを使って Derby サーバーを起動します。
    	java org.apache.derby.drda.NetworkServerControl start

    Derby サーバーが起動し、デフォルトのポート 1527 をリッスンします。

  3. promotion という 1 つのテーブルのみを持つ、generalstore という名前のデータベースを作成します。createdb1.sql スクリプトによってデータベースが作成され、初期データが設定されます。

    ij コマンドを使って次の SQL スクリプトを実行します。
    java org.apache.derby.tools.ij createdb1.sql

createdb1.sql スクリプトにはリスト 5 に示す SQL コマンドが含まれています。

リスト 5. createdb1.sql スクリプトによってデータベース・テーブルを作成し、そこに初期データを格納する
connect 'jdbc:derby://localhost/generalstore;create=true';
drop table promotion;
create table promotion
  (id char (5) not null,
   message char(40) not null,
   primary key(id));
insert into promotion values ('1', 'Thank your for your order.');
insert into promotion values ('2', 'Have a nice day!');
exit;

もし、ERROR 08001: No suitable driver というメッセージが表示された場合には、必要な lib/derbyclient.jar ライブラリーが CLASSPATH 環境変数の中に指定されていません。

Apache ActiveMQ JMS ブローカーをセットアップする

apache-activemq-4.1.1 がインストールされていることを確認し、確認できたら次のステップに従います。

  1. CLASSPATH 環境変数の中に下記の要素を含めます。
    • lib/activeio-core-3.0.0-incubator.jar
    • lib/commons-logging-1.1.jar
    • <ActiveMQ_HOME>/apache-activemq-4.1.1.jar
  2. activemq.bat スクリプトを実行して ActiveMQ ブローカーを起動します。このスクリプトは <ActiveMQ_HOME>/bin の中にあります。

Apache Axis をセットアップする

CLASSPATH 環境変数の中に下記の要素を含めます。下記の JAR は Eclipse 内部から自動的にダウンロードすることができます。詳しくは「Community Edition の WAR ファイルから不必要なサービスを削除する」を見てください。

  • wsdl4j-1.5.1.jar
  • saaj.jar
  • jaxrpc.jar
  • axis.jar

Tomcat の JNDI リソース参照と JDBC コネクター

checkoutcart.jsp ページは JSTL の SQL サポート・タグを使って promotion データベースにアクセスし、ユーザー向けのメッセージを出力します。リスト 6 は、この RDBMS にアクセスするためのコードの抜粋です。

リスト 6. データベース・サーバーにアクセスする checkoutcart.jsp の JSP コード
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="storetags" uri="/GeneralStoreTagLibrary" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"  %>
 ...
<sql:query var="rs" dataSource="jdbc/storeDB">
   select * from promotion
</sql:query>
 ...
<tr>
<td colspan="5">
<c:forEach var="row" items="${rs.rows}">
   ${row.message}<br/>
</c:forEach>
</td>
</tr>

JSTL の <sql:query> タグは JNDI を介して、jdbc/storeDB という名前のデータ・ソースを参照します。この名前参照は J2EE 標準の方法で、アプリケーションの web.xml デプロイメント記述子の中で定義されています。この標準的な構成は Tomcat と Community Edition の両方に対して有効です。リスト 7 はこの構成を示しています。

リスト 7. web.xml の中の要素によって JNDI データ・ソース参照を指定する
<resource-ref>
      <description>Derby DB connection</description>
      <res-ref-name>jdbc/storeDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
</resource-ref>

今度はこの参照を、実際の JDBC ドライバーと RDBMS 接続に一致するように、コンテナー専用の方法で構成する必要があります (Tomcat と Community Edition とでは異なります)。Tomcat の場合は、(Tomcat のインストール・ディレクトリーの中にある) conf/context.xml ファイルの中で構成します (リスト 8)。

リスト 8. Tomcat 専用の context.xml 記述子によって JNDI リソースを Derby JDBC コネクターと関連付ける
<Context>
     ...
     ...
<Resource name="jdbc/storeDB" auth="Container" type="javax.sql.DataSource"
  maxActive="100" maxIdle="30" maxWait="10000"
  driverClassName="org.apache.derby.jdbc.ClientDriver"
  user="APP" password="APP" 
  url="jdbc:derby://localhost/generalstore"/>
     ...
     ...
</Context>

ActiveMQ ブローカー用に Tomcat を構成する

CheckOut.java サーブレットは注文が適切に受け付けられるとメッセージを表示します。リスト 9 はこのサーブレットのコードの抜粋を示しています (接続ファクトリーと接続キューを参照しています)。

リスト 9. サーブレット・コードの抜粋
Context initContext = new InitialContext();
Context jndiContext=(Context) initContext.lookup("java:comp/env");
connectionFactory = (ConnectionFactory)  jndiContext.lookup("jms/ConnectionFactory");
queue = (Queue) jndiContext.lookup("jms/aQueue");

接続ファクトリーと接続キューに対する名前参照は web.xml の中で定義します (リスト 10)。

リスト 10. web.xml の要素によって JMS 接続ファクトリーと接続キューを指定する
<resource-ref>
        <description>jms broker</description>
        <res-ref-name>jms/ConnectionFactory</res-ref-name>
        <res-type>javax.jms.ConnectionFactory</res-type>
        <res-auth>Container</res-auth>
  </resource-ref>
	<message-destination-ref>
		<message-destination-ref-name>jms/aQueue</message-destination-ref-name>
		<message-destination-type>javax.jms.Queue</message-destination-type>
		<message-destination-usage>ConsumesProduces</message-destination-usage>
		<message-destination-link>aQueue</message-destination-link>
	</message-destination-ref>
	<message-destination>
		<message-destination-name>aQueue</message-destination-name>
	</message-destination>

今度は ActiveMQ の接続ファクトリーと宛先キューに関して、これもコンテナー専用の方法で Tomcat を構成する必要があります。Tomcat の場合はこの構成を (Tomcat のインストール・ディレクトリーの中にある) conf/context.xml ファイルの中で行います。リスト 11 は接続ファクトリーと宛先キューのパラメーターを示しています。

リスト 11. ActiveMQ ブローカーを構成するための Tomcat 専用の context.xml 記述子
<Context>
     ...
     ...
<Resource
        name="jms/ConnectionFactory"
        auth="Container"
        type="org.apache.activemq.ActiveMQConnectionFactory"
        description="JMS Connection Factory"
        factory="org.apache.activemq.jndi.JNDIReferenceFactory"
        brokerURL="tcp://localhost:61616"
        brokerName="localhost"
        persistent="false"
        useEmbeddedBroker="false"/>

     <Resource name="jms/aQueue"
        auth="Container"
        type="org.apache.activemq.command.ActiveMQQueue"
        factory="org.apache.activemq.jndi.JNDIReferenceFactory"
        physicalName="MY.TEST.QUEUE"/>
     ...
     ...
</Context>

StockService.wsdl を使って Web サービス・クラスを生成する

このセクションでは次の手順で Web サービス・クラスを生成します。

  1. リスト 12 は、Web サービスの成果物を生成するために必要な WSDL ファイルを示しています。 リスト 12. Web サービスの成果物を生成するための StockService.wsdl

    <wsdl:definitions xmlns:http=http://schemas.xmlsoap.org/wsdl/http/
       xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/
       xmlns:s=http://www.w3.org/2001/XMLSchema
       xmlns:soapenc=http://schemas.xmlsoap.org/soap/encoding/
       xmlns:tns=http://www.webserviceX.NET/
       xmlns:tm=http://microsoft.com/wsdl/mime/textMatching/
       xmlns:mime=http://schemas.xmlsoap.org/wsdl/mime/
       targetNamespace=http://www.webserviceX.NET/
       xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    
      <wsdl:types>
       <s:schema elementFormDefault="qualified" 
              targetNamespace="http://www.webserviceX.NET/">
       <s:element name="GetQuote">
         <s:complexType>
          <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="symbol"
            type="s:string"/>
          </s:sequence>
         </s:complexType>
        </s:element>
        <s:element name="GetQuoteResponse">
         <s:complexType>
          <s:sequence>
           <s:element minOccurs="0" maxOccurs="1" name="GetQuoteResult" type="s:string"/>
          </s:sequence>
         </s:complexType>
        </s:element>
        <s:element name="string" nillable="true" type="s:string"/>
       </s:schema>
      </wsdl:types>
      <wsdl:message name="GetQuoteSoapIn">
       <wsdl:part name="parameters" element="tns:GetQuote"/>
      </wsdl:message>
      <wsdl:message name="GetQuoteSoapOut">
       <wsdl:part name="parameters" element="tns:GetQuoteResponse"/>
      </wsdl:message>
      <wsdl:message name="GetQuoteHttpGetIn">
       <wsdl:part name="symbol" type="s:string"/>
      </wsdl:message>
      <wsdl:message name="GetQuoteHttpGetOut">
       <wsdl:part name="Body" element="tns:string"/>
      </wsdl:message>
      <wsdl:message name="GetQuoteHttpPostIn">
       <wsdl:part name="symbol" type="s:string"/>
      </wsdl:message>
      <wsdl:message name="GetQuoteHttpPostOut">
       <wsdl:part name="Body" element="tns:string"/>
     </wsdl:message>
    
     <wsdl:portType name="StockQuoteSoap">
      <wsdl:operation name="GetQuote">
       <wsdl:input message="tns:GetQuoteSoapIn"/>
       <wsdl:output message="tns:GetQuoteSoapOut"/>
      </wsdl:operation>
     </wsdl:portType>
    
     <wsdl:portType name="StockQuoteHttpGet">
      <wsdl:operation name="GetQuote">
       <wsdl:input message="tns:GetQuoteHttpGetIn"/>
       <wsdl:output message="tns:GetQuoteHttpGetOut"/>
      </wsdl:operation>
     </wsdl:portType>
    
     <wsdl:portType name="StockQuoteHttpPost">
      <wsdl:operation name="GetQuote">
      <wsdl:input message="tns:GetQuoteHttpPostIn"/>
       <wsdl:output message="tns:GetQuoteHttpPostOut"/>
      </wsdl:operation>
     </wsdl:portType>
    
     <wsdl:binding name="StockQuoteSoap" type="tns:StockQuoteSoap">
      <soap:binding transport=http://schemas.xmlsoap.org/soap/http
       style="document"/>
      <wsdl:operation name="GetQuote">
       <soap:operation soapAction=http://www.webserviceX.NET/GetQuote
         style="document"/>
       <wsdl:input>
        <soap:body use="literal"/>
       </wsdl:input>
       <wsdl:output>
        <soap:body use="literal"/>
       </wsdl:output>
      </wsdl:operation>
     </wsdl:binding>
    
     <wsdl:binding name="StockQuoteHttpGet" type="tns:StockQuoteHttpGet">
      <http:binding verb="GET"/>
      <wsdl:operation name="GetQuote">
       <http:operation location="/GetQuote"/>
       <wsdl:input>
        <http:urlEncoded/>
       </wsdl:input>
       <wsdl:output>
        <mime:mimeXml part="Body"/>
       </wsdl:output>
      </wsdl:operation>
     </wsdl:binding>
    
     <wsdl:binding name="StockQuoteHttpPost" type="tns:StockQuoteHttpPost">
      <http:binding verb="POST"/>
      <wsdl:operation name="GetQuote">
       <http:operation location="/GetQuote"/>
       <wsdl:input>
        <mime:content part="NMTOKEN" type="application/x-www-form-urlencoded"/>
       </wsdl:input>
       <wsdl:output>
        <mime:mimeXml part="Body"/>
       </wsdl:output>
      </wsdl:operation>
     </wsdl:binding>
     <wsdl:service name="StockQuote">
      <wsdl:port name="StockQuoteSoap" binding="tns:StockQuoteSoap">
       <soap:address location="http://www.webservicex.net/stockquote.asmx"/>
      </wsdl:port>
      <wsdl:port name="StockQuoteHttpGet" binding="tns:StockQuoteHttpGet">
       <http:address location="http://www.webservicex.net/stockquote.asmx"/>
      </wsdl:port>
      <wsdl:port name="StockQuoteHttpPost" binding="tns:StockQuoteHttpPost">
       <http:address location="http://www.webservicex.net/stockquote.asmx"/>
      </wsdl:port>
     </wsdl:service>
    </wsdl:definitions>
  2. Stock Service.wsdl ファイルを右クリックし (図 2)、Web Services -Generate Client の順に選択します。
    図 2. StockService.wsdl を使って Web サービスの成果物を生成する
    StockService.wsdl を使って Web サービスの成果物を生成する

    このステップによって、この Web サービスに必要なすべての成果物が自動的に生成されます。図 3 を見るとわかるように、以下のクラスが生成されます。

    • StockQuote.java
    • StockQuoteLocator.java
    • StockQuoteSoap.java
    • StockQuoteSoapProxy.java
    • StockQuoteSoapStub.java

    またこのステップでは、「アプリケーションを Community Edition にマイグレートする」で触れている JAR をダウンロードし、これらの JAR をアプリケーションの WEB-INF/lib ファイルに移動します。

    図 3. 生成された Web サービス・クラス
    生成された Web サービス・クラス
  3. このアプリケーションの Web サービスにアクセスするためには、リスト 13 のコードを checkoutcart.jsp ファイルと generalstore.jsp ファイルに追加します。

    リスト 13. IBM の株価にアクセスするためのコード・スニペット
    <%
    StockQuoteLocator sql = new StockQuoteLocator(); 
    StockQuoteSoap sqs = sql.getStockQuoteSoap();
    PrintWriter out1 =response.getWriter(); 
    String s1=sqs.getQuote("IBM");
     s1=s1.substring(46,51);
    %>

    ここでは IBM を変数として渡しており、それによって Stock という Web サービスから IBM の株価を取得します。


Tomcat にアプリケーションをデプロイする

このセクションでは次のステップに従って Tomcat にアプリケーションをデプロイします。

  1. アプリケーションを WAR ファイルとして Eclipse からエクスポートします。
  2. Tomcat を起動し、ブラウザーで次の URL を指定して Web コンソールを起動します。
    http://localhost:8080/manager/html
  3. すると、先ほど設定した UserDatabaseRealm でログインするように促されます。manager のロールが必要なため、user namepasswordtomcat と入力します。
  4. マネージャー・アプリケーションは、デプロイされたすべてのモジュールを表示します。一番下の Deploy directory or WAR file located on server というボックスがあるところまでスクロールし、Context path/Shopping と入力し、また WAR or Directory URL には generalstore.war ファイルへの絶対パスを入力します。
  5. Deploy ボタンをクリックします。すると General Store アプリケーションが /Shopping コンテキストで実行されている様子が表示されるはずです。図 4 は、デプロイが成功した後のマネージャー・アプリケーションを示しています。
    図 4. アプリケーションが適切に Tomcat にデプロイされた様子
    アプリケーションが適切に Tomcat にデプロイされた様子
  6. このアプリケーションにアクセスするためには、URL として http://localhost:8080/Shopping/store.cgi を入力します。

アプリケーションを Community Edition にマイグレートする

一般的に、General Store アプリケーションを Community Edition にマイグレートするためには次のことを行う必要があります。

  1. Community Edition のコンテナーが管理する認証レルムに置き換えるように Tomcat の UserDatabaseRealm を構成します。
  2. スタンドアロン・バージョンの Derby ではなく、Community Edition に含まれる Derby RDBMS を起動して使用します。
  3. Community Edition が管理する新しいデータ・ソースを作成します。
  4. 必要なデータベース・テーブルを作成し、初期データを設定します。
  5. Community Edition の Derby データ・ソースを指すように JNDI 参照を構成します。
  6. ActiveMQ JMS ブローカーの接続ファクトリーと接続キューを Community Edition の中で構成します。

マイグレーションを行う際に変更を必要としない要素は次のとおりです。

  • web.xml 中のデータ・ソースに対する JNDI 参照
  • web.xml の中でアプリケーションを保護しているセキュリティー構成

これらの要素は、どの J2EE コンテナーでも使用できるように注意深くコーディングされています。

Tomcat のコネクターが Community Edition の中で使用するポートを変更する

Tomcat のコネクターが Community Edition の中で使用するポートを変更する必要がある場合には、server.xml ファイルを探してはいけません。Community Edition には server.xml ファイルがないからです。代わりに、Community Edition のインストール・ディレクトリーの下の var/config ディレクトリーにある config-substitutions.properties ファイルを見てください。リスト 14 は Community Edition でのポートの構成を示しています。

リスト 14. Community Edition での Tomcat のポートの構成
AJPPort=8009
clusterNodeName=NODE
ORBPort=6882
MaxThreadPoolSize=500
ResourceBindingsNamePattern=
SMTPHost=localhost
ResourceBindingsQuery=?\#org.apache.geronimo.naming.ResourceSource
COSNamingPort=1050
webcontainer=TomcatWebContainer
OpenEJBPort=4201
ORBSSLPort=2001
PortOffset=0
ActiveMQStompPort=61613
JMXPort=9999
ORBHost=localhost
EndPointURI=http\://localhost\:8080
NamingPort=1099
DefaultWadiSweepInterval=36000
WebConnectorConTimeout=20000
HTTPSPort=8443
COSNamingHost=localhost
MinThreadPoolSize=200
ReplicaCount=2
ServerHostname=0.0.0.0
ActiveMQPort=61616
ORBSSLHost=localhost
SMTPPort=25
webcontainerName=tomcat6
ResourceBindingsNameInNamespace=jca\:
DefaultWadiNumPartitions=24
HTTPPort=8080
clusterName=CLUSTER_NAME
ClusterName=DEFAULT_CLUSTER
ResourceBindingsFormat={groupId}/{artifactId}/{j2eeType}/{name}
RemoteDeployHostname=localhost
TmId=71,84,77,73,68

リスト 14 に示す Community Edition のコードを変更することで、デフォルトのポート構成を変更することができます。PortOffset 変数がコメント・アウトされている場合は、アンコメントして任意の値を入力することもできます。この変更を行うと、PortOffset に定義される値によって Community Edition でのすべてのサービスのポート設定を変更することができます。例えば PortOffset=10 と定義したとすると、HTTP ポートは 8090 となり、管理コンソールの URL は http://localhost:8090/console となります。

Tomcat のコネクターが使用するポートを変更する際には、以下のコマンドにより Tomcat アプリケーションが使用しているスタンドアロンの Derby データベースをシャットダウンすることを忘れないでください。
java org.apache.derby.drda.NetworkServerControl stop

上述のようにして、Tomcat のコネクターが使用するポートを変更する代わりに、Web コンソールを使用して Tomcat コネクターの追加や Tomcat コネクターが使用するポート番号の編集をすることもできます。そのためには Web コンソールのメニューから単純に Server - Web Server の順に選択します。ポート番号を編集して変更を保存した後、再起動を行ってポートの変更を即座に有効にします。そのポート番号を管理コンソールの表示に使用している場合には、ブラウザーの URL でポート番号を変更し、改めてコンソールを表示することを忘れないでください。

Community Edition が管理する認証レルムを構成する

Community Edition はデフォルトで、geronimo-admin と呼ばれるレルムを管理します。このレルムは var/security ディレクトリー配下にある properties ファイルを使ってユーザー名とパスワード、そしてグループの情報を保存します。このレルムに設定されている唯一のユーザーは、admin グループと admin ロールに属する、manager というパスワードを持つ system です。デフォルトのレルムにユーザーやグループを追加するためには、Web コンソール・メニューの Security - Console Realm オプションを使います。

このセキュリティー・レルムは、Community Edition 専用の geronimo-web.xml デプロイメント・プランの中で構成することができます。そのためにはリスト 15 のコードを geronimo-web.xml に追加する必要があります。

リスト 15. Community Edition でのセキュリティー・レルムの構成
<security-realm-name>geronimo-admin</security-realm-name>
<sec:security>
 <sec:default-principal realm-name="geronimo-properties-realm">
  <sec:principalclass="org.apache.geronimo.
     security.realm.providers.GeronimoUserPrincipal" name="system"/>
  </sec:default-principal>
  <sec:role-mappings>
   <sec:role role-name="admin">
    <sec:realm realm-name="geronimo-admin">
      <sec:principalclass="org.apache.geronimo.
        security.realm.providers.GeronimoGroupPrincipal" name="admin"/>
      <sec:principalclass="org.apache.geronimo.
        security.realm.providers.GeronimoUserPrincipal" name="system"/>
     </sec:realm>
   </sec:role>
  </sec:role-mappings</sec:security>

Community Edition の中で Promotion データベース・テーブルを作成する

GUI ベースの Web コンソールを使用すると、Community Edition の中で容易に Promotion テーブルを作成することができます。

  1. サーバーを起動します。
  2. ブラウザーで http://localhost:8080/console を指定して管理コンソールを起動します。
  3. user namepassword にデフォルトの値 (それぞれ systemmanager) を入力します。
  4. コンソール・ナビゲーションで、Embedded DB ポートレットの下にある DB Manager を選択します (図 5)。
    図 5. 管理コンソールの Embedded DB ポートレット
    管理コンソールの Embedded DB ポートレット
  5. 次に表示される画面 (図 6) で、Create DBgeneralstore という名前を入力し、Create をクリックします。
    図 6. generalstore データベースを作成する
    generalstore データベースを作成する
  6. Use DB ドロップダウン・ボックスから generalstore を選択し、Run SQL をクリックしてリスト 16 と図 7 に示すスクリプトを実行します。

    リスト 16. Community Edition の中で promotion テーブルを作成するためのスクリプト

    create table promotion	 
     (id char (5) not null, 
       message char(40) not null, primary key(id));
      insert into promotion values ('1', 'Thank your for your order.');
      insert into promotion values ('2', 'Have a nice day!');
    図 7. promotion テーブルを作成する
    promotion テーブルを作成する

Community Edition の中で Derby データ・ソースを作成する

  1. ブラウザーで http://localhost:8080/console を指定して管理コンソールを起動します。user namepassword にデフォルトの値 (それぞれ sytemmanager) を入力します。
  2. コンソール・ナビゲーションで、Services の下にある Database Pools を選択します。
  3. 次に表示される画面 (図 8) で Using Geronimo database pool wizard を選択します。
    図 8. Geronimo データベース・プール・ウィザードを選択する
    Geronimo データベース・プール・ウィザードを選択する
  4. 図 9 に示すように、このデータベース・プールに SampleDS という名前を付け、Database TypeDerby Embedded XA に設定し、Next を選択します。
    図 9. Community Edition の中でデータベース・プールを作成する
    Community Edition の中でデータベース・プールを作成する
  5. Database Pools ウィザードで、図 10 に示すようにフォームにデータを入力します。ここで PasswordAPP であることに注意してください。データを入力したら、Deploy をクリックします。
    図 10. Community Edition の中でデータベース・プールを作成する
    Community Edition の中でデータベース・プールを作成する
  6. デプロイが成功すると、Community Edition にデプロイされているデータベース・プールのリストの中に SampleDS というデータ・ソースが追加されていることがわかります (図 11)。
    図 11. デプロイされているデータベース・プールのリストの中の SampleDS データ・ソース
    デプロイされているデータベース・プールのリストの中の SampleDS データ・ソース
  7. geronimo-web.xml デプロイメント・プランの <dependency> 要素と <resource-ref> 要素の中で、SampleDSjdbc/storeDB の JNDI 参照 web.xml に関連付けます (リスト 17)。

    リスト 17. geronimo-web.xml デプロイメント・プランのコード・スニペット

    <sys:dependency>
      <sys:groupId>console.dbpool</sys:groupId>
      <sys:artifactId>SampleDS</sys:artifactId>  
    </sys:dependency>
    	
    <naming:resource-ref>
      <naming:ref-name>jdbc/storeDB</naming:ref-name>
      <naming:resource-link>SampleDS</naming:resource-link>
    </naming:resource-ref>

ActiveMQ JMS の接続ファクトリーと接続キューを作成する

GUI ベースの Web コンソールを使用すると、Community Edition が管理する接続ファクトリーと接続キューを容易に作成することができます。

  1. 管理コンソールを起動します。コンソール・ナビゲーションで、Services ポートレット配下にある JMS Resources を選択します。次に表示される画面で For ActiveMQ を選択します。
  2. さらに次の画面で、図 12 に示すようにフォームに入力し、Next をクリックします。
    図 12. JMS リソース・グループを構成する
    JMS リソース・グループを構成する
  3. 次に表示される画面 (図 13) で Add Connection Factory をクリックします。
    図 13. 接続ファクトリーを追加する
    接続ファクトリーを追加する
  4. ファクトリーのタイプとして javax.jms.ConnectionFactory を選択し、Next をクリックします (図 14)。
    図 14. 接続ファクトリーを追加する
    接続ファクトリーを追加する
  5. 図 15 に示すようにフォームに入力し、Next をクリックします。
    図 15. 接続ファクトリーを追加する
    接続ファクトリーを追加する
  6. 次に表示される画面 (図 16) で Add Destination を選択してキューを追加します。
    図 16. 宛先を追加する
    宛先を追加する
  7. ドロップダウン・ボックスで javax.jms.Queue を選択し、Next をクリックします (図 17)。
    図 17. 宛先のタイプを設定する
    宛先のタイプを設定する
  8. Message Destination Namejms/aQueue と設定し、Next をクリックします (図 18)。
    図 18. キューを追加する
    キューを追加する
  9. 次に表示される画面 (図 19) で Deploy Now をクリックすると、Community Edition にリソース・プランがデプロイされます。
    図 19. Community Edition にリソース・プランをデプロイする
    Community Edition にリソース・プランをデプロイする
  10. デプロイメントが成功すると、利用可能な JMS リソースの 1 つとして migration が表示されます (図 20)。
    図 20. 利用可能な JMS リソースのリストの中に表示されている migration
    利用可能な JMS リソースのリストの中に表示されている migration
  11. すでに web.xml の中にある接続ファクトリーと接続キューを関連付けるためには、geronimo-web.xml デプロイメント・プランの <dependency> 要素と <resource-ref> 要素の中で指定します (リスト 18)。

    リスト 18. geronimo-web.xml デプロイメント・プランのコード・スニペット

    	<sys:dependency>
    	 <sys:groupId>org.apache.geronimo.configs</sys:groupId>
    	 <sys:artifactId>activemq-ra</sys:artifactId>
    	 <sys:version>2.1.1</sys:version>
    	 <sys:type>car</sys:type>
    	</sys:dependency>
                     ...
                     ...
    	<naming:resource-ref> 
    	 <naming:ref-name>jms/ConnectionFactory</naming:ref-name>
    	 <naming:pattern>
    	   <naming:groupId>org.apache.geronimo.configs</naming:groupId>
    	   <naming:artifactId>activemq-ra</naming:artifactId>
    	   <naming:version>2.1.1</naming:version>
    	   <naming:name>DefaultActiveMQConnectionFactory</naming:name>
    	 </naming:pattern>
    	</naming:resource-ref>
    	
    	<naming:message-destination>
    	 <naming:message-destination-name>
    	  aQueue
    	 </naming:message-destination-name>
    	 <naming:admin-object-link>
    	  SendReceiveQueue
    	 </naming:admin-object-link>
    	</naming:message-destination>

Community Edition の WAR ファイルから不必要なサービスを削除する

サンプルの ShoppingStore_Tomcat.war ファイルのサイズ (約 9MB) を ShoppingStore_CommunityEdition.war ファイルのサイズ (約 32KB) と比較すると、なぜサイズの差がこれほど大きいのか不思議に思うかもしれません。その理由は、Tomcat にインストールされているアプリケーションの WEB-INF\lib ディレクトリーにあるサービス (Axis、JMS、commons など) や Derby データベース・ドライバーで、Community Edition でも含める必要があるものすべてが、すでに Community Edition の中に統合されているためです。これらの JAR ファイルを削除すると、これらのサービスやドライバーの統合やサポートが必要なくなるというメリットがあります。

WEB-INF\lib の中には、ShoppingStore_Tomcat.war のうち、以下の JAR ファイルが含まれています。

  • activeio-core-3.0.0-incubator.jar
  • apache-activemq-4.1.1.jar
  • axis.jar
  • commons-discovery-0.2.jar
  • commons-logging.jar
  • derby.jar
  • derbyclient.jar
  • derbynet.jar
  • derbytools.jar
  • jaxrpc.jar
  • jstl.jar
  • saaj.jar
  • standard.jar
  • wsdl4j-1.5.1.jar

これらの JAR ファイルは Community Edition の <WASCE_HOME>/repository ディレクトリーにも含まれています。JAR が存在するかどうかを判断するためには、/repository ディレクトリーの中で、バージョン番号を含まないコンポーネント名 (activeio-core など) やソースを含まないコンポーネント名 (activemq など) を探します。/repository の中にある、上記に対応する JAR ファイルにはバージョン番号が含まれています (axis1-4.jar など)。/repository の中に含まれていない JAR ファイル (例えばアプリケーション専用のファイルなど) は WEB-INF\lib の中に保持する必要があります。

このマイグレーションの例では、Tomcat の WEB-INF\lib ディレクトリーの中にある JAR ファイルはすべて削除することができます。ただし大部分の Web アプリケーションではアプリケーション専用の何らかの JAR ファイルを WEB-INF\lib ディレクトリーに置いているため、ライブラリーを削減できるかどうかはアプリケーションによって異なります。データベース・ドライバーの JAR ファイルは、通常は \repository にインストールしてアプリケーション間で共有する必要があります。管理コンソールのツールを利用すると、\repository の中にないデータベース・ドライバー・ファイル (Oracle や MySQL など) をダウンロードしてインストールする際に便利です (Services - Database Pools - Using the Geronimo database pool wizard の順に選択します)。

また、WEB-INF\lib ディレクトリーの中にある JAR ファイルを指す <servlet> パラメーターが web.xml ファイルの中にあるかもしれません。JAR ファイルを削除した場合に web.xml を変更する必要があるかどうかを判断する必要があります。


アプリケーションを Community Edition にデプロイする

アプリケーションをデプロイするためには管理コンソールを起動し、以下の手順に従います。

  1. コンソール・ナビゲーションで、Applications ポートレット配下にある Deploy New を選択します。
  2. Archive テキスト・ボックスの隣にある Browse をクリックし、Shoppingstore.war を見つけたら、Install をクリックします。このステップによってアプリケーションが Community Edition にデプロイされます (図 21)。
    図 21. アプリケーションを Community Edition にデプロイする
    アプリケーションを Community Edition にデプロイする
  3. ブラウザーで http://localhost:8080/Shopping/store.cgi を指定して、アプリケーションを起動します。ログインするように促されたら、user namesystem を、passwordmanager を入力します。

マイグレーションの問題に対するトラブルシューティング

この記事のサンプル・アプリケーションは、Tomcat をマイグレートする際の構成とデプロイメント・プランの典型的な例を表しています。このサンプルの中には、さまざまな数多くのリソース・タイプがデプロイメント例として含まれています。WAR ファイルがデプロイできない場合、管理コンソールの Deploy New メニューには、その WAR ファイルに関する詳細なエラー・メッセージが表示されます。

WAR ファイルがデプロイできない場合に、スクリプト化されたデプロイ・ツールを使ってエラーを表示することもできます。アプリケーションのテスト中にエラーが発生する場合には、Eclipse のサーバー・ログまたは var\log\server.log ファイル (Linux の場合は geronimo.out ファイル) を調べると、アプリケーションにアクセスする場合に発生する Java エラーを調べることができます。

マイグレーションを行う際に発生する一般的な問題には次のようなものがあります。

  • クラスローダーの問題
  • リソースの構成の問題
  • デプロイメント・プランの問題

以下のセクションでは、これらの問題を詳細に調べます。

クラスローダーの問題

Community Edition はデフォルトで、最初に親から (つまり \repository から) クラスをロードするクラスローダーの階層構造に従います。Tomcat は最初にアプリケーションからクラスをロードします。Tomcat アプリケーションが古いコンポーネント (例えば古いバージョンの Axis) を使用しており、API の構造が新しいコンポーネントで変更されている場合には、問題が起こる可能性があります。この場合には WAR をデプロイする際、あるいは実行時にクラスローダーのエラーが起こるかもしれません。

クラスローダーの問題を修正するための方法として、デプロイメント・プランの <moduleId> パラメーターの後に hidden-classes パラメーターを追加する方法があります。hidden-classes によって、親の構成からロードすべきではないクラスの名前を指定することができます。リスト 19 は Axis のクラスローダーの問題に対する geronimo-web.xml の例を示しています。このアプリケーションには WEB-INF\lib の中の axis.jar ファイルが使われます。

リスト 19. Axis のクラスローダーの問題に対する hidden-classes コード
</moduleId>
<hidden-classes>
    <filter>org.apache.axis2<filter>
</hidden-classes>

クラスローダーの問題を修正するための、もう 1 つの方法として、デプロイメント・プランの <moduleId> パラメーターの後に inverse-classloading パラメーターを追加する方法があります。inverse-classloading を追加することによって、Community Edition はまずアプリケーションの WEB-INF\lib にあるクラスをロードした後で、親からクラスをロードするクラスローダーの階層構造に従うようになります。リスト 20 は <moduleId> パラメーターの後に inverse-classloading パラメーターを追加した geronimo-web.xml の例です。

リスト 20. Geronimo のクラスローダーの問題に対する inverse-classloading コード
</moduleId>
<inverse-classloading/>

クラスローダーの構造を変更することによってアプリケーションのマイグレーションは成功するはずです。しかしある時点で、Community Edition のコンポーネントと動作するようにアプリケーションのコードを修正する必要があります。コンポーネントを統合でき、サポートできることが、Tomcat のスタンドアロンではなく Community Edition を使用することによる重要なメリットだからです。詳細については Managing the classpath を訪れ、ドキュメンテーションを調べてください。

リソースの構成の問題

データベース接続やセキュリティー接続などのリソースによってデプロイメントや実行の際に問題が起きる可能性があります。Tomcat は構成ファイルの構造が Community Edition とは異なり、server.xmlcontext.xml を使っているため、Community Edition に移行する際には構成の問題が起こる可能性があります。こうした問題の大部分は、パラメーターやアクセス方法が不正なことによるものです。データベースに関しては、管理コンソールで Database Pools - Using the Geronimo database pool wizard の順に選択し、このウィザードを使ってデータベース接続をテストします。ウィザードの最後でデータベース・プールの Deploy をクリックすると、このウィザードはデータベースに対してテストを行い、接続に成功しない場合にはエラーとなります。接続に成功するまで、データベース・プールを編集してパラメーターを変更し、テストを繰り返します。セキュリティー・レルムに関しては、管理コンソールで Security Realms - Add new security realm の順に選択し、このウィザードを使ってセキュリティー・レルムの接続をテストします。Security Realm ウィザードでは、接続のテストをする際にログイン用のユーザー名とパスワードを入力します。ログインに成功しない場合にはセキュリティー・レルムを編集し、成功するまでテストを繰り返します。

デプロイメント・プランの問題

geronimo-web.xml デプロイメント・プランが適切に動作するためには、特定のパラメーターとフォーマットが必要です。この記事で使用している General Store アプリケーションでは、ShoppinStore_WASCE.war ファイルの中に妥当な geronimo-web-xml ファイルが含まれています。Sample Applications のパッケージは Community Edition のダウンロード・サイトから入手することができます。これらのサンプルには、geronimo-web.xml デプロイメント・プランを持つさまざまなアプリケーション・タイプが含まれています。これらのサンプルは、皆さん独自のデプロイメント・プランでの要件の基礎として利用することができます。

また、管理コンソールの Plan Creator メニューを使うと、Tomcat の WAR ファイルと、管理コンソールで作成されたリソース接続 (つまりデータベース接続や JMS 接続、セキュリティー接続など) から geronimo-web.xml デプロイメント・プランを作成することができます。この方法を使うと geronimo-web.xml デプロイメント・プランを簡単に作成することができます。WAR ファイルをデプロイする際には、Plan フィールドを使うことで、その WAR ファイルの外でデプロイメント・プランを定義することができます。WAR ファイルのデプロイメントと外部デプロイメント・プランに関しては図 21 を参照してください。


まとめ

Tomcat 6.0.x から Community Edition V2.1 にアプリケーションをマイグレートする作業は単純です。これは Tomcat 6.0.x がそのままの形で Community Edition に統合され、実際に Community Edition の一部になっているためです。しかしマイグレート後は Community Edition がすべての構成管理を制御するため、Tomcat で server.xmlcontext.xml の中に通常見られる構成要素を以下のファイルにマイグレートする必要があります。

  • config-substitution.properties: 頻繁に変更されるパラメーター (コネクターのポート番号など) の場合
  • geronimo-web.xml: これはアプリケーションのコンテキスト用の、Community Edition 専用のデプロイメント・プランです。このファイルはアーカイブの WEB-INF ディレクトリーの中に含めることができます。

ここでは Web アプリケーションを Tomcat 6.x から WebSphere Application Server Community Edition にマイグレートする手順を追うことで、このマイグレーションでの重要なポイントとして、認証レルムの切り替えや JNDI 参照のマッピング、Derby データベースのセットアップ、JDBC コネクターの構成、そして JMS リソース・ファクトリーと JMS キューについて調べました。


ダウンロード

内容ファイル名サイズ
Tomcat Web archiveShoppingStore_Tomcat.war8.9MB
Web archive migrated to Community Edition ShoppingStore_CommunityEdition.war32KB

参考文献

学ぶために

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere, Open source
ArticleID=337138
ArticleTitle=Apache Tomcat Version 6.0.x から WebSphere Application Server Community Edition V2.1 にマイグレートする
publish-date=08062008