ペット屋さんでJavaのお勉強

はじめに

コンピュータプログラミング言語を学ぼうと思ったとき、幾つか選択肢があります。易しくて実用的なのは Visual Basic & VBA でしょう。VBAでExcelやAccessのマクロを作れるようになれば、実験やレポート作成の大きな手助けになります。C++を正しくマスターすれば、プロになっても通用するでしょう。JavaはC++を参考にして、初心者でもちょっとした努力で間違いの少ないプログラミングが出来るように設計されているので、プログラミング初心者にお勧めです。

コンピュータ関係の仕事をしたいと思う者にとって、今ではJavaは避けて通れない存在になりました。Java2 Micro Editionを使った携帯電話等のマイコン組み込み製品、あるいは、Java2 Enterprise Editionを使った電子商店やB2Bのe-businessまで、Javaデベロッパは世の失業率がどんなに上がろうとお構い無しの忙しさです。

一方では、Java Standard Editionでデスクトップアプリケーションやアプレットを作ったところで、誰も見向きもしてくれません。Javaが雑誌で持てはやされた数年前とは大違いです。OpenOfficeやAlgoUMLぐらいのアプリケーションなら別格ですよ。

あらためてきちんとJavaを学びたいと思うとき、「今さら“Hello World!”でも無いだろう、時代はJ2EEさ!」ってな勢いで始めたのがこのページです。

材料

では、教材として手頃なものは無いかと見回したところ、Sun Microsystemsが“J2EE BluePrints”の中で、“Java Pet Store”なる電子商店のサンプルを提供してくれていました。これは今の最もHotな技術を最も模範的に応用したサンプルです。美味しい。

道具

道具と言うよりも実行環境ですね。

  1. Windows 2000 Professional + Service Pack 2
  2. Java2 SDK, Standard Edition 1.4.0
  3. Java2 SDK, Enterprise Edition 1.3.1
  4. J2EE 日本語版追補
  5. Java Pet Store 1.3.1

まず上記のWindows 2000は、J2EEがWindows 9xでは動かないので必須です。J2SEはJ2EEを動かす為に必要で、J2EEはJava Pet Storeを動かす為に必要です。もしもJ2SE 1.3を使っている場合には、“Java Web Start Update Package, v1.0.1”でアップデートする必要があります。

ところでJava Pet Storeをダウンロードする為には、Java Developper Connectionにユーザー登録しなければならないのですが、日本語サイトのJDCに登録しても駄目みたいです。ダウンロードが米国サイトからなので、米国のJDCに登録しなければ先に進めませんでした。また日米で同じIDを登録できてしまいました。日米間でリンクしている訳ではなさそうです。

下ごしらえ

Java Pet Storeを動かす環境を作ります。インストールにはインストーラが用意されているので簡単です。ただし環境変数の設定はお忘れなく。

  1. J2SEをインストール
  2. 環境変数 JAVA_HOME を設定
  3. 環境変数 PAHT を設定
  4. J2EEをインストール
  5. 環境変数 J2EE_HOME を設定
  6. J2EE SDK 日本語版追補をインストール

Java Pet Store をインストール

Java Pet Storeのインストールは、まずダウンロードしたファイルを解凍する事から始まります。ファイルは単なるzip形式のファイルなので、+Lhaca等のツールを使って解凍し、それを適当な場所へ移動すればOKです。私は"F:\petstore1.3.1"に置きました。

次にJava Pet Storeのセットアップスクリプトを実行します。下の網掛け部分はWindows 2000のコマンドプロンプトで実行した様子です。

Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.

F:\>cd petstore1.3.1

F:\petstore1.3.1>setup.bat
Buildfile: setup.xml

init:

help:

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

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 to deploy the EAR files
     [echo] setup.bat deploy (or on Unix, setup.sh deploy)

BUILD SUCCESSFUL

Total time: 2 minutes 8 seconds

F:\petstore1.3.1>

データベースを開始

J2EEにはCloudscapeデータベースがバンドルされています。これはJavaで書かれたRDBMSで、現在ではIBMの製品になっています。OracleやMS-SQLと置き換える事も簡単に出来ますが、とりあえずCloudscaapeで動かしてみます。

Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.

F:\>cd j2sdkee1.3.1\bin

F:\j2sdkee1.3.1\bin>cloudscape.bat -start
Thu Aug 15 16:50:42 JST 2002: [RmiJdbc] Starting Cloudscape RmiJdbc Server Versi
on 1.7.2 ...
Thu Aug 15 16:50:45 JST 2002: [RmiJdbc] COM.cloudscape.core.JDBCDriver registere
d in DriverManager
Thu Aug 15 16:50:45 JST 2002: [RmiJdbc] Binding RmiJdbcServer...
Thu Aug 15 16:50:45 JST 2002: [RmiJdbc] No installation of RMI Security Manager.
..
Thu Aug 15 16:50:46 JST 2002: [RmiJdbc] RmiJdbcServer bound in rmi registry

この後しばらく待ったのですが、コマンドプロンプトに戻ってきませんでした。とりあえずウィンドウは開いたまま、作業を続けます。

J2EE Server を起動

Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.

F:\>cd j2sdkee1.3.1\bin

F:\j2sdkee1.3.1\bin>j2ee.bat -verbose
J2EE サーバ待機ポート: 1050
ネームサービスが開始されました:1050
DataSource をバインドしています。名前 = jdbc/DB1、URL = jdbc:cloudscape:rmi:Clou
dscapeDB;create=true
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/EstoreDB、URL = jdbc:cloudscape:rmi
:CloudscapeDB;create=true
DataSource をバインドしています。名前 = jdbc/supplier/SupplierDB、URL = jdbc/sup
plier/SupplierDB__xa
DataSource をバインドしています。名前 = jdbc/supplier/SupplierDB__xa、dataSource
 = COM.cloudscape.core.RemoteXaDataSource@d439fe
DataSource をバインドしています。名前 = jdbc/opc/OPCDB、URL = jdbc/opc/OPCDB__xa

DataSource をバインドしています。名前 = jdbc/opc/OPCDB__xa、dataSource = COM.clo
udscape.core.RemoteXaDataSource@97d026
DataSource をバインドしています。名前 = jdbc/XACloudscape、URL = jdbc/XACloudsca
pe__xa
DataSource をバインドしています。名前 = jdbc/XACloudscape__xa、dataSource = COM.
cloudscape.core.RemoteXaDataSource@8330bf
DataSource をバインドしています。名前 = jdbc/petstore/PetStoreDB、URL = jdbc/pet
store/PetStoreDB__xa
DataSource をバインドしています。名前 = jdbc/petstore/PetStoreDB__xa、dataSource
 = COM.cloudscape.core.RemoteXaDataSource@bfc4fc
JMS サービスを開始します...
Initialization complete - waiting for client requests
バインディング: < JMS Destination : jms/queue/opc/MailCompletedOrderQueue , java
x.jms.Queue >
バインディング: < JMS Destination : jms/queue/opc/MailOrderApprovalQueue , javax
.jms.Queue >
バインディング: < JMS Destination : jms/queue/opc/OrderApprovalQueue , javax.jms
.Queue >
バインディング: < JMS Destination : jms/Queue , javax.jms.Queue >
バインディング: < JMS Destination : jms/topic/opc/InvoiceTopic , javax.jms.Topic
 >
バインディング: < JMS Destination : jms/queue/opc/OrderQueue , javax.jms.Queue >

バインディング: < JMS Destination : jms/queue/opc/MailQueue , javax.jms.Queue >
バインディング: < JMS Destination : jms/queue/supplier/PurchaseOrderQueue , java
x.jms.Queue >
バインディング: < JMS Destination : jms/Topic , javax.jms.Topic >
バインディング: < JMS Cnx Factory : jms/QueueConnectionFactory , Queue , No prop
erties >
バインディング: < JMS Cnx Factory : QueueConnectionFactory , Queue , No properti
es >
バインディング: < JMS Cnx Factory : jms/queue/petstore/QueueConnectionFactory ,
Queue , No properties >
バインディング: < JMS Cnx Factory : jms/topic/supplier/TopicConnectionFactory ,
Topic , No properties >
バインディング: < JMS Cnx Factory : jms/queue/admin/QueueConnectionFactory , Que
ue , No properties >
バインディング: < JMS Cnx Factory : jms/queue/supplier/QueueConnectionFactory ,
Queue , No properties >
バインディング: < JMS Cnx Factory : jms/TopicConnectionFactory , Topic , No prop
erties >
バインディング: < JMS Cnx Factory : jms/queue/opc/QueueConnectionFactory , Queue
 , No properties >
バインディング: < JMS Cnx Factory : TopicConnectionFactory , Topic , No properti
es >
バインディング: < JMS Cnx Factory : jms/topic/opc/TopicConnectionFactory , Topic
 , No properties >
次のポートで Web サービスを開始します: 8000
次のポートで、セキュリティで保護された Web サービスを開始します:7000
J2EE SDK/1.3.1
次のポートで Web サービスを開始します: 9191
J2EE SDK/1.3.1
J2EE サーバの起動が完了しました。

これも、コマンドプロンプトに戻ってこなかったんですよねぇ。ウィンドウを閉じても良いのか悪いのか…?

ここで上手く起動できたのか確認しましょう。Webブラウザを起動して、下のURLを入力してください。

http://localhost:8000

正しく起動できていれば、下の画面が見えるはずです。
J2EE Default Home Page Screenshot

Pet Store アプリケーションを配備

Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.

F:\>cd petstore1.3.1

F:\petstore1.3.1>setup.bat deploy
Buildfile: setup.xml

init:

deploy:
     [echo] Deploying ears ....
     [java] petstore.ear のアプリケーションをサーバ localhost に配備し、クライア
ント jar を null に保存します。
     [java] 送付側オブジェクト Deploy Tool : PetStoreEAR を localhost に配備しま
す。
     [java] リモートメッセージ: コンタクト先サーバ...
     [java] リモートメッセージ: アプリケーション PetStoreEAR は転送されました。
     [java] リモートメッセージ: PetStoreEAR には配備する EJB が 15 個、Web コン
ポーネントが 1 個あります。
     [java] リモートメッセージ: EJB を配備しています...
     [java] リモートメッセージ: Bean を処理しています ...
     [java] リモートメッセージ: サーバ JAR を作成しています ...
     [java] リモートメッセージ: クライアント JAR を作成しています ...
     [java] リモートメッセージ: Web サーバにコンタクトして f:\j2sdkee1.3.1\repos
itory\queen\applications\PetStoreEAR1029405841692Server.jar の実行を依頼します。

     [java] リモートメッセージ: Web コンポーネントは配備されました。
     [java] リモートメッセージ: PetStoreEAR の配備が完了しました。
     [java] 送付側オブジェクト Deploy Tool : http://192.168.0.10:9191/PetStore
EARClient.jar のクライアントコード
     [java] opc.ear のアプリケーションをサーバ localhost に配備し、クライアント
jar を null に保存します。
     [java] 送付側オブジェクト Deploy Tool : OrderProcessingCenterEAR を localho
st に配備します。
     [java] リモートメッセージ: コンタクト先サーバ...
     [java] リモートメッセージ: アプリケーション OrderProcessingCenterEAR は転送
されました。
     [java] リモートメッセージ: OrderProcessingCenterEAR には配備する EJB が 15
個、Web コンポーネントが 1 個あります。
     [java] リモートメッセージ: EJB を配備しています...
     [java] リモートメッセージ: Bean を処理しています ...
     [java] リモートメッセージ: ラッパーコードをコンパイルしています ...
     [java] リモートメッセージ: RMI-IIOP コードをコンパイルしています ...
     [java] リモートメッセージ: サーバ JAR を作成しています ...
     [java] リモートメッセージ: クライアント JAR を作成しています ...
     [java] リモートメッセージ: Web サーバにコンタクトして f:\j2sdkee1.3.1\repos
itory\queen\applications\OrderProcessingCenterEAR1029405978979Server.jar の実行
を依頼します。
     [java] リモートメッセージ: Web コンポーネントは配備されました。
     [java] リモートメッセージ: OrderProcessingCenterEAR の配備が完了しました。
     [java] 送付側オブジェクト Deploy Tool : http://192.168.0.10:9191/OrderPro
cessingCenterEARClient.jar のクライアントコード
     [java] supplier.ear のアプリケーションをサーバ localhost に配備し、クライア
ント jar を null に保存します。
     [java] 送付側オブジェクト Deploy Tool : SupplierEAR を localhost に配備しま
す。
     [java] リモートメッセージ: コンタクト先サーバ...
     [java] リモートメッセージ: アプリケーション SupplierEAR は転送されました。
     [java] リモートメッセージ: SupplierEAR には配備する EJB が 7 個、Web コンポ
ーネントが 1 個あります。
     [java] リモートメッセージ: EJB を配備しています...
     [java] リモートメッセージ: Bean を処理しています ...
     [java] リモートメッセージ: サーバ JAR を作成しています ...
     [java] リモートメッセージ: クライアント JAR を作成しています ...
     [java] リモートメッセージ: Web サーバにコンタクトして f:\j2sdkee1.3.1\repos
itory\queen\applications\SupplierEAR1029406110057Server.jar の実行を依頼します。

     [java] リモートメッセージ: Web コンポーネントは配備されました。
     [java] リモートメッセージ: SupplierEAR の配備が完了しました。
     [java] 送付側オブジェクト Deploy Tool : http://192.168.0.10:9191/Supplier
EARClient.jar のクライアントコード
     [java] petstoreadmin.ear のアプリケーションをサーバ localhost に配備し、ク
ライアント jar を null に保存します。
     [java] 送付側オブジェクト Deploy Tool : AdminEAR を localhost に配備します
。
     [java] リモートメッセージ: コンタクト先サーバ...
     [java] リモートメッセージ: アプリケーション AdminEAR は転送されました。
     [java] リモートメッセージ: AdminEAR には配備する EJB が 1 個、Web コンポー
ネントが 1 個あります。
     [java] リモートメッセージ: EJB を配備しています...
     [java] リモートメッセージ: Bean を処理しています ...
     [java] リモートメッセージ: ラッパーコードをコンパイルしています ...
     [java] リモートメッセージ: RMI-IIOP コードをコンパイルしています ...
     [java] リモートメッセージ: サーバ JAR を作成しています ...
     [java] リモートメッセージ: クライアント JAR を作成しています ...
     [java] リモートメッセージ: Web サーバにコンタクトして f:\j2sdkee1.3.1\repos
itory\queen\applications\AdminEAR1029406215349Server.jar の実行を依頼します。
     [java] リモートメッセージ: Web コンポーネントは配備されました。
     [java] リモートメッセージ: AdminEAR の配備が完了しました。
     [java] 送付側オブジェクト Deploy Tool : http://192.168.0.10:9191/AdminEAR
Client.jar のクライアントコード
     [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: 8 minutes 7 seconds

F:\petstore1.3.1>

配備には結構時間がかかりました。上の記録で8分7秒かかったとあるのですが、これはPentiumII-300MHzでの実行結果です。

ここで気付きました。J2EEを起動したコマンドプロンプトのウィンドウに、沢山のメッセージが追加されていました。ウィンドウは閉じなくて正解だったようです。追加されたメッセージが多すぎて、スクロールバッファから溢れてしまったのですが、最後の1ページの画面イメージは下のとおりです。

(これ以前を省略)
バインドされた名前:`java:comp/env/ejb/local/ContactInfo`
バインドされた名前:`java:comp/env/ejb/local/Address`
バインドされた名前:`java:comp/env/ejb/local/LineItem`
バインドされた名前:`java:comp/env/param/transitiondelegate/SupplierOrderTD`
バインドされた名前:`java:comp/env/jms/topic/opc/InvoiceTopic`
バインドされた名前:`java:comp/env/ejb/local/OrderFulfillmentFacade`
バインドされた名前:`java:comp/env/ejb/local/Inventory`
バインドされた名前:`java:comp/env/jms/topic/TopicConnectionFactory`
作成されたコンテキスト:/supplier
アプリケーション SupplierEAR は配備されました。

f:\j2sdkee1.3.1\repository\queen\gnrtrTMP\AdminEAR\com\sun\j2ee\blueprints\async
sender\ejb\AsyncSenderEJB_LocalHomeImpl.java をコンパイルしています ....
f:\j2sdkee1.3.1\repository\queen\gnrtrTMP\AdminEAR\com\sun\j2ee\blueprints\async
sender\ejb\AsyncSenderEJB_EJBLocalObjectImpl.java をコンパイルしています ....
rmic com.sun.j2ee.blueprints.opc.admin.ejb.OPCAdminFacade...
rmic com.sun.j2ee.blueprints.opc.admin.ejb.OPCAdminFacadeHome...
バインドされた名前:`java:comp/env/jms/queue/AsyncSenderQueue`
バインドされた名前:`java:comp/env/jms/queue/QueueConnectionFactory`
バインドされた名前:`java:comp/env/ejb/remote/OPCAdminFacade`
バインドされた名前:`java:comp/env/ejb/local/AsyncSender`
作成されたコンテキスト:/admin
アプリケーション AdminEAR は配備されました。

では確認しましょう。Webブラウザを立ち上げて、次のURLを入力してください。

http://localhost:8000/petstore/

期待したのはPet Storeのホームページだったのですが、残念ながらJavatm Pet Store Demo 1.3.1の解説ページへ行ってしまいました。
Pet Storeのホームページ Screenshot

このページの"enter the store"と書かれたリンクから、やっとペットストアのホームページへ入れます。最初のブラウジング時には「サンプルデータベースにデータを突っ込むから、しばらく待っててね」といった旨のメッセージが出るので、待つ事しばし。
待つ要求 Screenshot

下の画面の英語版が表示されるはずです。最初から日本語ローカライズもされていますので、日本語版を表示するには画面右上の日の丸マークをクリックしてください。見えましたか?
Pet Storeのフロントページ Screenshot

終了方法

Java Pet Store の簡易マニュアルには終了方法が書いてありませんでした(たぶん)。仕方ないので終了方法を自分で探してみた結果です。

  1. J2EEの停止

    J2EEサーバーを停止するには、次のコマンドを実行します。

    j2ee -stop
    
  2. データベースの停止 Cloudscape データベースを停止するには、次のコマンドを打ちます。
    cloudscape -stop
    

Pet Shop アプリケーションの配備に「停止」といった作業は必要なさそうです。たぶん。

再起動方法

終了方法が書いてなければ、再起動方法も当然のように書いてありません。そこで自分で探してみました。

  1. データベースの開始
    cloudscape -start
    
  2. J2EEの開始
    j2ee -verbose
    

Pet Shop アプリケーションは一度配備してしまえば毎回再度配備する必要はなさそうです。たぶん。

Link

Sun : はじめてのBluePrints & J2EEパターン
J2EEのガイドライン、デザインパターン、フレームワーク、Java Pet Storeコード解説です。Pet Storeの内側ですね。元は技術評論社の「Web+DB Press Vol.8」の巻頭特集でした。この記事を公開してくれた技術評論社に感謝!
@IT : 連載:J2EEの基礎「Java Pet Storeで、J2EEを体験する(1)」
Pet Storeを外側から見た解説があります。
Microsoft : Microsoft .NET Pet Shop
社運を賭けて.netを推進するMicrosoftでは、Java Pet Storeを.netで書き直して、J2EEと.netを比較しています。