Java 2 Enterprise Edition, Ver.1.3の設計サンプルとして作られたWebアプリケーション。

インストール

入手

SunのWebサイトから無償で入手できます。以下のURLから、Enterprise:Java Pet Store Sample Application をダウンロードします。2003年5月24日時点では、Ver.1.3.1_02が最新となっています。

インストール

入手したサンプルを、J2EEサーバ上に配置します。手順一覧は以下の通り。個々の手順詳細は続く節で紹介します。

  1. アーカイブの展開と環境変数の設定
  2. メッセージングサービスとデータベースリソースの設定
  3. データベースサーバ(cloudscape)の起動
  4. J2EEアプリケーションサーバ(j2ee)の起動
  5. 配備の実行

アーカイブの展開と環境変数設定

入手したJava Pet Storeのアーカイブを解凍・展開します。

環境変数を設定します。

J2EEを動かすために必要な環境変数
環境変数名 設定例 内容
JAVA_HOME D:\java\j2sdk1.4.1 J2SE SDKをインストールしたディレクトリ
J2EE_HOME D:\java\j2eesdk1.3.1 J2EE SDKをインストールしたディレクトリ

メッセージングサービスとデータベースリソースの設定

展開したJava Pet Storeの中にあるsetup.batを実行します。

setup.batの実行
petstore1.3.1_02$ ./setup.bat
Buildfile: setup.xml

init:

help:

create_jms_queues:
     [echo] Creating JMS Queues ....
     [java] JmsDestination
     [java] --------------
     [java] < JMS Destination : jms/opc/MailQueue , javax.jms.Queue >
     [java] < JMS Destination : jms/Queue , javax.jms.Queue >
     [java] < JMS Destination : jms/opc/OrderQueue , javax.jms.Queue >
     [java] < JMS Destination : jms/opc/InvoiceTopic , javax.jms.Topic >
     [java] < JMS Destination : jms/opc/MailOrderApprovalQueue , javax.jms.Queue >
     [java] < JMS Destination : jms/opc/OrderApprovalQueue , javax.jms.Queue >
     [java] < JMS Destination : jms/supplier/PurchaseOrderQueue , javax.jms.Queue >
     [java] < JMS Destination : jms/opc/MailCompletedOrderQueue , javax.jms.Queue >
     [java] < JMS Destination : jms/Topic , javax.jms.Topic >

create_users:
     [echo] Creating users ....
     [java] グループ default は追加されました。
     [java] この変更内容は、J2EE サーバの再起動後に反映されます。
     [java] ユーザ jps_admin が追加されました。
     [java] この変更内容は、J2EE サーバの再起動後に反映されます。
     [java] ユーザ supplier が追加されました。
     [java] この変更内容は、J2EE サーバの再起動後に反映されます。

create_petstore_db:

create_supplier_db:

create_opc_db:

core:
     [echo] The J2EE SDK is now successfully configured to run the petstore appl
ication. Please restart cloudscape and the j2ee servers, and deploy all the ear
files. You can do this by issuing the following commands:
     [echo] change directory to j2sdkee1.3/bin; start RI and Cloudscape in separ
ate windows
     [echo] cloudscape -start
     [echo] j2ee -verbose
     [echo] change directory to petstore1.3.1_02 to deploy the EAR files
     [echo] setup.bat deploy (or on Unix, setup.sh deploy)

BUILD SUCCESSFUL

Total time: 1 minute 0 seconds
petstore1.3.1_02$

ログを見てみると・・・

まだJ2EEとは何か分かっていない段階なので、ログに出力されるメッセージは分かりませんが、分からないなりに覗いてみましょう。

JMSのキューを作成しているようです。JMSは非同期通信として用いられるメッセージングに対する標準APIです。

ユーザがいくつか作られています。ユーザ管理があるようです。ユーザとグループという概念があるようです。ここでは、jps_adminユーザとsupplierユーザ、そしてdefaultグループというのが作成されているようです。

データベースがいくつか作られているようです。petstore、supplier、opcという3つのDBが作られているのでしょうか。

データベース管理プログラム(Cloudscape)の実行

J2EEに含まれるデータベース管理プログラムを実行します。データベースはデモ中はずっと起動しっぱなしなので、コンソール(コマンドプロンプト)はこのままにしておきます。

cloudscapeの実行
petstore1.3.1_02$ cd $J2EE_HOME/bin
bin$ ./cloudscape.bat -start
Sat May 24 22:23:38 JST 2003: [RmiJdbc] Starting Cloudscape RmiJdbc Server Versi
on 1.7.2 ...
Sat May 24 22:23:39 JST 2003: [RmiJdbc] COM.cloudscape.core.JDBCDriver registere
d in DriverManager
Sat May 24 22:23:39 JST 2003: [RmiJdbc] Binding RmiJdbcServer...
Sat May 24 22:23:39 JST 2003: [RmiJdbc] No installation of RMI Security Manager.
..
Sat May 24 22:23:39 JST 2003: [RmiJdbc] RmiJdbcServer bound in rmi registry

ログを見てみると・・・

このCloudscapeというのは、RMIとJDBCのサーバと書かれています。JDBCということで普通のRDBMSのようですが、RMIとあるのはなんでしょうか。

J2EEサーバの実行

J2EEには多くのサーバプログラムが含まれます。それらを一括で起動するバッチ(スクリプト)がJ2EE SDKには用意されています。

j2eeの実行
toru$ cd $J2EE_HOME/bin
bin$ ./j2ee.bat -verbose
J2EE サーバ待機ポート: 1050
ネームサービスが開始されました:1050
DataSource をバインドしています。名前 = jdbc/Cloudscape、URL = jdbc:cloudscape:r
mi:CloudscapeDB;create=true
DataSource をバインドしています。名前 = jdbc/DB2、URL = jdbc:cloudscape:rmi:Clou
dscapeDB;create=true
DataSource をバインドしています。名前 = jdbc/InventoryDB、URL = jdbc:cloudscape:
rmi:CloudscapeDB;create=true
DataSource をバインドしています。名前 = jdbc/DB1、URL = jdbc:cloudscape:rmi:Clou
dscapeDB;create=true
DataSource をバインドしています。名前 = jdbc/EstoreDB、URL = jdbc:cloudscape:rmi
:CloudscapeDB;create=true
DataSource をバインドしています。名前 = jdbc/petstore/PetStoreDB、URL = jdbc/pet
store/PetStoreDB__xa
DataSource をバインドしています。名前 = jdbc/petstore/PetStoreDB__xa、dataSource
 = COM.cloudscape.core.RemoteXaDataSource@1a61172
DataSource をバインドしています。名前 = jdbc/XACloudscape、URL = jdbc/XACloudsca
pe__xa
DataSource をバインドしています。名前 = jdbc/XACloudscape__xa、dataSource = COM.
cloudscape.core.RemoteXaDataSource@1d0d45b
DataSource をバインドしています。名前 = jdbc/supplier/SupplierDB、URL = jdbc/sup
plier/SupplierDB__xa
DataSource をバインドしています。名前 = jdbc/supplier/SupplierDB__xa、dataSource
 = COM.cloudscape.core.RemoteXaDataSource@caf6c1
DataSource をバインドしています。名前 = jdbc/opc/OPCDB、URL = jdbc/opc/OPCDB__xa

DataSource をバインドしています。名前 = jdbc/opc/OPCDB__xa、dataSource = COM.clo
udscape.core.RemoteXaDataSource@cf710e
JMS サービスを開始します...
Initialization complete - waiting for client requests
バインディング: < JMS Destination : jms/opc/MailQueue , javax.jms.Queue >
バインディング: < JMS Destination : jms/supplier/PurchaseOrderQueue , javax.jms.
Queue >
バインディング: < JMS Destination : jms/opc/InvoiceTopic , javax.jms.Topic >
バインディング: < JMS Destination : jms/opc/MailCompletedOrderQueue , javax.jms.
Queue >
バインディング: < JMS Destination : jms/Topic , javax.jms.Topic >
バインディング: < JMS Destination : jms/opc/OrderQueue , javax.jms.Queue >
バインディング: < JMS Destination : jms/opc/OrderApprovalQueue , javax.jms.Queue
 >
バインディング: < JMS Destination : jms/opc/MailOrderApprovalQueue , javax.jms.Q
ueue >
バインディング: < JMS Destination : jms/Queue , javax.jms.Queue >
バインディング: < JMS Cnx Factory : jms/supplier/TopicConnectionFactory , Topic
, No properties >
バインディング: < JMS Cnx Factory : jms/supplier/QueueConnectionFactory , Queue
, No properties >
バインディング: < JMS Cnx Factory : jms/admin/QueueConnectionFactory , Queue , N
o properties >
バインディング: < JMS Cnx Factory : jms/TopicConnectionFactory , Topic , No prop
erties >
バインディング: < JMS Cnx Factory : TopicConnectionFactory , Topic , No properti
es >
バインディング: < JMS Cnx Factory : QueueConnectionFactory , Queue , No properti
es >
バインディング: < JMS Cnx Factory : jms/opc/QueueConnectionFactory , Queue , No
properties >
バインディング: < JMS Cnx Factory : jms/QueueConnectionFactory , Queue , No prop
erties >
バインディング: < JMS Cnx Factory : jms/opc/TopicConnectionFactory , Topic , No
properties >
バインディング: < JMS Cnx Factory : jms/petstore/QueueConnectionFactory , Queue
, No properties >
次のポートで Web サービスを開始します: 8000
次のポートで、セキュリティで保護された Web サービスを開始します:7000
J2EE SDK/1.3.1
次のポートで Web サービスを開始します: 9191
J2EE SDK/1.3.1
J2EE サーバの起動が完了しました。

ログを見てみると・・・

ネームサービスが起動されています。いくつものDatastoreがこのネームサービスに登録されているようです。

JMSサービスが起動されています。いろいろバインディングという表現で処理されていますが、現時点ではよくわかりません。

Webサービスが起動されています。ここでいうWebサービスは、Webサーバ機能のことを指すのでしょう。ポートは8000となっています。試しにWebブラウザでポート8000に接続してみるとよいでしょう。

セキュリティで保護されたWebサービスが起動されています。これは、httpsで接続できることを指しているのでしょうか。

ポート9191で起動されるWebサービスとは何かは現時点ではよくわかりません。

Pet Storeの配備

J2EEでは、作成したアプリケーションを"Deploy"(配備)するという作業があります。

setup.bat deploy
petstore1.3.1_02$ ./setup.bat deploy
Buildfile: setup.xml

init:

deploy:
     [echo] Deploying ears ....
     [exec] Generated sql = SELECT "a"."userId" FROM "CustomerEJBTable" "a"
     [exec] Generated sql = SELECT "a"."userName" FROM "UserEJBTable" "a"
     [exec] SQL の生成が完了しました。
     [exec] petstore.ear のアプリケーションをサーバ localhost に配備し、クライア
ント jar を null に保存します。
     [exec] 送付側オブジェクト Deploy Tool : PetStoreEAR を localhost に配備しま
す。
     [exec] リモートメッセージ: コンタクト先サーバ...
     [exec] リモートメッセージ: アプリケーション PetStoreEAR は転送されました。
     [exec] リモートメッセージ: PetStoreEAR には配備する EJB が 15 個、Web コン
ポーネントが 1 個あります。
     [exec] リモートメッセージ: EJB を配備しています...
     [exec] リモートメッセージ: Bean を処理しています ...
     [exec] リモートメッセージ: サーバ JAR を作成しています ...
     [exec] リモートメッセージ: クライアント JAR を作成しています ...
     [exec] リモートメッセージ: Web サーバにコンタクトして d:\java\j2sdkee1.3.1\
repository\winchan\applications\PetStoreEAR1053785040656Server.jar の実行を依頼
します。
     [exec] リモートメッセージ: Web コンポーネントは配備されました。
     [exec] リモートメッセージ: PetStoreEAR の配備が完了しました。
     [exec] 送付側オブジェクト Deploy Tool : http://xxx.xxx.xxx.xxx:9191/PetStor
eEARClient.jar のクライアントコード
     [exec] Generated sql = SELECT "a"."poId" FROM "PurchaseOrderEJBTable" "a" W
HERE (("a"."poDate"  >= ? ) AND ("a"."poDate"  <= ? ))
     [exec] Generated sql = SELECT DISTINCT "a"."orderId" FROM "ManagerEJBTable"
 "a" WHERE ("a"."status"  = ? )
     [exec] Null text data??
     [exec] SQL の生成が完了しました。
     [exec] opc.ear のアプリケーションをサーバ localhost に配備し、クライアント
jar を null に保存します。
     [exec] 送付側オブジェクト Deploy Tool : OrderProcessingCenterEAR を localho
st に配備します。
     [exec] リモートメッセージ: コンタクト先サーバ...
     [exec] リモートメッセージ: アプリケーション OrderProcessingCenterEAR は転送
されました。
     [exec] リモートメッセージ: OrderProcessingCenterEAR には配備する EJB が 15
個、Web コンポーネントが 1 個あります。
     [exec] リモートメッセージ: EJB を配備しています...
     [exec] リモートメッセージ: Bean を処理しています ...
     [exec] リモートメッセージ: ラッパーコードをコンパイルしています ...
     [exec] リモートメッセージ: RMI-IIOP コードをコンパイルしています ...
     [exec] リモートメッセージ: サーバ JAR を作成しています ...
     [exec] リモートメッセージ: クライアント JAR を作成しています ...
     [exec] リモートメッセージ: Web サーバにコンタクトして d:\java\j2sdkee1.3.1\
repository\winchan\applications\OrderProcessingCenterEAR1053785072468Server.jar
の実行を依頼します。
     [exec] リモートメッセージ: Web コンポーネントは配備されました。
     [exec] リモートメッセージ: OrderProcessingCenterEAR の配備が完了しました。
     [exec] 送付側オブジェクト Deploy Tool : http://xxx.xxx.xxx.xxx:9191/OrderPr
ocessingCenterEARClient.jar のクライアントコード
     [exec] Generated sql = SELECT DISTINCT "a"."poId" FROM "SupplierOrderEJBTab
le" "a" WHERE ("a"."poStatus"  = ? )
     [exec] Generated sql = SELECT "a"."itemId" FROM "InventoryEJBTable" "a"
     [exec] Null text data??
     [exec] SQL の生成が完了しました。
     [exec] supplier.ear のアプリケーションをサーバ localhost に配備し、クライア
ント jar を null に保存します。
     [exec] 送付側オブジェクト Deploy Tool : SupplierEAR を localhost に配備しま
す。
     [exec] リモートメッセージ: コンタクト先サーバ...
     [exec] リモートメッセージ: アプリケーション SupplierEAR は転送されました。
     [exec] リモートメッセージ: SupplierEAR には配備する EJB が 7 個、Web コンポ
ーネントが 1 個あります。
     [exec] リモートメッセージ: EJB を配備しています...
     [exec] リモートメッセージ: Bean を処理しています ...
     [exec] リモートメッセージ: サーバ JAR を作成しています ...
     [exec] リモートメッセージ: クライアント JAR を作成しています ...
     [exec] リモートメッセージ: Web サーバにコンタクトして d:\java\j2sdkee1.3.1\
repository\winchan\applications\SupplierEAR1053785094468Server.jar の実行を依頼
します。
     [exec] リモートメッセージ: Web コンポーネントは配備されました。
     [exec] リモートメッセージ: SupplierEAR の配備が完了しました。
     [exec] 送付側オブジェクト Deploy Tool : http://xxx.xxx.xxx.xxx:9191/Supplie
rEARClient.jar のクライアントコード
     [exec] java.io.IOException: Error in opening uri http://localhost:8000/sun-
j2ee-ri_1_4.dtdstatus code=404
     [exec] java.io.IOException: Error in opening uri http://localhost:8000/sun-
j2ee-ri_1_4.dtdstatus code=404
     [exec]     at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3339)
     [exec]     at org.apache.crimson.parser.Parser2.externalParameterEntity(Par
ser2.java:3027)
     [exec]     at org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.ja
va:1314)
     [exec]     at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:
623)
     [exec]     at org.apache.crimson.parser.Parser2.parse(Parser2.java:333)
     [exec]     at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.j
ava:448)
     [exec]     at com.sun.enterprise.deployment.xml.XMLUtils.getNodesByType(XML
Utils.java:272)
     [exec]     at com.sun.enterprise.deployment.xml.RuntimeDescriptorNode.readR
untimeDescriptorNodes(RuntimeDescriptorNode.java:924)
     [exec]     at com.sun.enterprise.deployment.xml.RuntimeDescriptorNode.read(
RuntimeDescriptorNode.java:1012)
     [exec]     at com.sun.enterprise.deployment.ApplicationArchivist.open(Appli
cationArchivist.java:487)
     [exec]     at com.sun.enterprise.deployment.ApplicationArchivist.open(Appli
cationArchivist.java:342)
     [exec]     at com.sun.enterprise.tools.deployment.main.DeployTool.doGenerat
eSQL(DeployTool.java:253)
     [exec]     at com.sun.enterprise.tools.deployment.main.Main.main(Main.java:
268)
     [exec] java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
     [exec]     at java.util.Vector.elementAt(Vector.java:431)
     [exec]     at com.sun.enterprise.deployment.xml.RuntimeDescriptorNode.read(
RuntimeDescriptorNode.java:1016)
     [exec]     at com.sun.enterprise.deployment.ApplicationArchivist.open(Appli
cationArchivist.java:487)
     [exec]     at com.sun.enterprise.deployment.ApplicationArchivist.open(Appli
cationArchivist.java:342)
     [exec]     at com.sun.enterprise.tools.deployment.main.DeployTool.doGenerat
eSQL(DeployTool.java:253)
     [exec]     at com.sun.enterprise.tools.deployment.main.Main.main(Main.java:
268)
     [exec] Result: 2
     [exec] petstoreadmin.ear のアプリケーションをサーバ localhost に配備し、ク
ライアント jar を null に保存します。
     [exec] 送付側オブジェクト Deploy Tool : AdminEAR を localhost に配備します
。
     [exec] リモートメッセージ: コンタクト先サーバ...
     [exec] リモートメッセージ: アプリケーション AdminEAR は転送されました。
     [exec] 送付側オブジェクト 配備ツール (メイン) : RemoteException occurred in
 server thread; nested exception is:
     [exec]     java.rmi.RemoteException: 保存/オープンでエラーが発生しました。
     [exec] Result: 1
     [echo] The petstore application is now installed.
     [echo] Please restart your cloudscape database and the J2EE server, and the
n point your browser to http://localhost:8000/petstore to access petstore.

BUILD SUCCESSFUL

Total time: 1 minute 23 seconds
petstore1.3.1_02$

ログを見てみると・・・

petstore.ear、opc.ear、supplier.ear、petstoreadmin.earといったものをサーバに配備しています。現時点ではearとはなにか分かりませんが、earの中にはEJBやWebコンポーネントが複数入っているようです。

最後にBUILD SUCCESSFULになっているので大丈夫そうですが、途中でIOExceptionエラーが発生しています。j2ee-ri_1_4という表記があるので、どうやら前回J2EE1.4βを入れて試行したときの残骸があったようです。

Pet Storeに入る

インストールが完了したら、実際にデモアプリケーションを使ってみましょう。

まず、同じマシン上でWebブラウザを起動し、http://localhost:8000/petstore/ へアクセスします。

Pet StoreデモのWebページが表示されます。画面の赤丸をクリックすると、デモのPetStoreページに飛びます。

終了

J2EEサーバとCloudscopeを終了させる。

bin$ ./j2ee.bat -stop
J2EE サーバをシャットダウンします。
bin$ ./cloudscape.bat -stop
URL=[jdbc:rmi:jdbc:cloudscape:]

Attempting to shutdown RmiJdbc server
RmiJdbc Server RmiAddr is: //winchan/RmiJdbcServer

WARNING: Shutdown was successful!

bin$