第2章 seam-gen を使って Seam を始めよう

Seam ディストリビューションは、コマンドラインユーティリティを含んでおり、 Eclipse プロジェクトのセットアップ、 簡単な Seam のスケルトンコードの生成、 既存データベースからアプリケーションのリバースエンジニアリングをとても簡単にします。

これは、Seam 入門として良い方法です。 そして、状態をデータベースに保管するとてもつまらないアプリケーションを構築するために、 新しいおもちゃがどれほどすばらしいかを大げさに話す退屈な Ruby 野郎の 1 人に次にエレベータの中で捕まったとわかった時のために、 攻撃材料を与えてくれます。

このリリースでは、seam-gen は JBoss AS で使用するのが最良です。 プロジェクト設定をマニュアルで少し変更するだけで他の J2EE や Java 5 アプリケーションサーバ用に生成されたプロジェクトも使用可能です。

Eclipse がなくても seam-gen は、使用可能ですが、 このチュートリアルでは、デバッキングや統合テストのために Eclipse と連携してどのように使用するかを示したいと思います。 やっぱり Eclipse をインストールしたくない人も、 このチュートリアルを続けることができます。 コマンドラインからすべてのステップは実行可能です。

Seam-gen は、簡単に言ってしまえば、テンプレートと共に Hibernate Tools をラッピングした大きく見苦しい Ant スクリプトです。 これは、必要であれば簡単にカスタマイズできることを意味します。

2.1. 始める前に

始める前に、JDK 5 または JDK 6 とJBoss AS 4.0.5 と Ant 1.6、そして、それに合う Eclipse 用の JBoss IDE プラグイン と TestNG プラグインがインストールされていることを確認してください。 Eclipse の JBoss サーバビューに JBoss 設定を追加してください。 デバッグモードで JBoss を起動してください。 最後に、Seam ディストリビューションを展開したディレクトリで、 コマンドプロンプト起動してください。

JBoss は、WAR や EAR の優れたホット再デプロイに優れた対応をしています。*** あいにく、JVM のバグのために、 EAR の再三のデプロイは 最終的に JVM を germ gen space を使い果たします。*** この理由により、デプロイ時には perm gen space を多めに取った JVM で JBoss を稼動させることを推奨します。*** JBoss IDE から JBoss を稼動させるならば、 VM 引数としてサーバ起動設定に以下が設定可能です。 以下の値を推奨します。

-Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512

十分なメモリがないとすると、以下が最小の推奨値です。

-Xms256m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256

コマンドラインから JBoss を起動しているならば、 bin/run.conf の JVM オプション設定が可能です。

今、このことを気にしたくなければ、気にしなくても構いません。 OutOfMemoryException に初めてでくわした時に、 また戻ってくれば良いのです。

2.2. 新しい Eclipse プロジェクトのセットアップ

最初にすべきことは、あなたの環境用に seam-gen を設定することです。 ( JBoss AS インストールディレクトリ、Eclipse ワークスペース、 データベースコネクション ) それは簡単です。単純にタイプしてください。

cd jboss-seam-1.1.x
seam setup

以下のように必要な情報の入力を要求されるでしょう。

C:\Projects\jboss-seam>seam setup
Buildfile: C:\Projects\jboss-seam\seam-gen\build.xml

setup:
    [echo] Welcome to seam-gen :-)
    [input] Enter your Java project workspace [C:/Projects]

    [input] Enter your JBoss home directory [C:/Program Files/jboss-4.0.5.GA]

    [input] Enter the project name [myproject]
helloworld
    [input] Is this project deployed as an EAR (with EJB components) or a WAR (with no EJB support) [ear] (ear,war,)

    [input] Enter the Java package name for your session beans [com.mydomain.helloworld]
org.jboss.helloworld
    [input] Enter the Java package name for your entity beans [org.jboss.helloworld]

    [input] Enter the Java package name for your test cases [org.jboss.helloworld.test]

    [input] What kind of database are you using? [hsql] (hsql,mysql,oracle,postgres,mssql,db2,sybase,)
mysql
    [input] Enter the Hibernate dialect for your database [org.hibernate.dialect.MySQLDialect]

    [input] Enter the filesystem path to the JDBC driver jar [lib/hsqldb.jar]
../../mysql-connector.jar
    [input] Enter JDBC driver class for your database [com.mysql.jdbc.Driver]

    [input] Enter the JDBC URL for your database [jdbc:mysql:///test]

    [input] Enter database username [sa]
gavin
    [input] Enter database password []

    [input] Are you working with tables that already exist in the database? [n] (y,n,)
y
    [input] Do you want to drop and recreate the database tables and data in import.sql each time you deploy? [n] (y,n,)
n
[propertyfile] Creating new property file: C:\Projects\jboss-seam\seam-gen\build.properties
     [echo] Installing JDBC driver jar to JBoss server
     [echo] Type 'seam new-project' to create the new project

BUILD SUCCESSFUL
Total time: 1 minute 17 seconds
C:\Projects\jboss-seam>

このツールは気の利いたデフォルト値を提供します。 プロンプトに対して単に enter を押すだけで大丈夫です。

必須となる最重要な選択は、プロジェクトのEAR形式デプロイとWAR形式デプロイのどちらにするかです。*** EAR プロジェクトは、EJB3.0 に対応し、Java EE 5 が必須です。 WAR プロジェクトは、EJB3.0 に対応しませんが、J2EE 環境にデプロイ可能かもしれません。*** WAR形式のパッケージは理解し易いです。*** JBossを ejb3 プロファイルでインストールならば、ear を選択してください。そうでなければ、 war を選択してください。*** このチュートリアルの残りでは、EAR デプロイが選択されたと仮定しますが、 WAR デプロイもまったく同じステップで進むことが可能です。

既存のデータモデルで作業をしていれば、データベースに既にテーブルが存在することを seam-gen に知らせることを忘れないでください。***

設定は、seam-gen/build.properties に保管されていますが、 seam setup を 2 回実行することで変更することも可能です。***

以下のようにタイプすることで、Eclipse ワークスペースディレクトリに、 新規プロジェクトの生成が可能です。

seam new-project
C:\Projects\jboss-seam>seam new-project
Buildfile: C:\Projects\jboss-seam\seam-gen\build.xml

validate-workspace:

validate-project:

copy-lib:
     [echo] Copying project jars ...
     [copy] Copying 32 files to C:\Projects\helloworld\lib
     [copy] Copying 9 files to C:\Projects\helloworld\embedded-ejb

file-copy-wtp:

file-copy:
     [echo] Copying project resources ...
     [copy] Copying 12 files to C:\Projects\helloworld\resources
     [copy] Copying 1 file to C:\Projects\helloworld\resources
     [copy] Copying 5 files to C:\Projects\helloworld\view
     [copy] Copying 5 files to C:\Projects\helloworld
    [mkdir] Created dir: C:\Projects\helloworld\src

new-project:
     [echo] A new Seam project named 'helloworld' was created in the /Users/gavin/Documents/workspace directory
     [echo] Type 'seam explode' and go to http://localhost:8080/helloworld
     [echo] Eclipse Users: Add the project into Eclipse using File > New > Project and select General > Project (not Java Project)
     [echo] NetBeans Users: Open the project in NetBeans

BUILD SUCCESSFUL
Total time: 7 seconds
C:\Projects\jboss-seam>

これは、Seam jar、依存する jar そして JDBC ドライバを新しい Eclipse プロジェクトにコピーします。*** そして、必要となるすべてのリソースや設定ファイル、facelets テンプレートファイル、 stylesheet を Eclipse metadata や Ant ビルドスクリプトにしたがって生成します。*** 新規 -> プロジェクト... -> 一般 -> プロジェクト -> 次へ の手順でプロジェクトを追加し、プロジェクト名 (この場合、helloworld) をタイプして、完了 をクリックすれば、 Eclipse プロジェクトは自動的に展開された JBoss AS ディレクトリ構造にデプロイされます。 新規プロジェクトウィザードから Java プロジェクト は、選択しないでください。

Eclipse のデフォルト JDK が SE 5 あるいは Java SE 6 JDK でなければ、 プロジェクト -> プロパティ -> Java コンパイラ の手順で、Java SE 5 互換の JDK を選ぶ必要があります。

別の方法として、Eclise の外部から seam explode とタイプすることでプロジェクトのデプロイが可能です。 seam explode.

welcome page を見るには、http://localhost:8080/helloworld に進んでください。 これは、テンプレート view/layout/template.xhtml を使用した facelets page, view/home.xhtml です。 Eclipse からこのページやテンプレートの編集が可能です。 そしてブラウザを更新することで即座に結果を見ることが可能です。

プロジェクトディレクトリに生成された XML 設定ドキュメントに脅えないでください。 これらは、ほぼ標準 Java EE に関するもの、1度生成のしたら2度と見る必要のないもの、 それらは、すべての Seam プロジェクトで 90% は同じものです。 (それらは、書くのが容易で、 seam-gen がそれを可能にシテイマス***

生成されたプロジェクトは3つのデータベースと永続性設定を含んでいます。*** HSQLDB に対して TestNG 単体テストが実行されるとき、 jboss-beans.xmlpersistence-test.xml、 そして import-test.sql ファイルは使用されます。 import-test.sql 中のデータベーススキーマとテストデータは、いつもテスト実行前に、 データベースにエキスポートされます。******* myproject-dev-ds.xmlpersistence-dev.xml そして import-dev.sql ファイルは、アプリケーションをデプロイするデータベースにデプロイするときに使用します。*** seam-gen に既存データベースを相手に作業すると伝えるかどうかによって*** スキーマはデプロイ時に自動的にエキスポートされるかもしれません myproject-prod-ds.xmlpersistence-prod.xml そして import-prod.sql ファイルは、本番環境データベースにアプリケーションをデプロイするときに使用します。 デプロイ時にスキーマは自動的にエキスポートされません。***

2.3. 新規のアクションを生成する

伝統的なアクションスタイルの Web フレームワークに慣れているのならば、 たぶん、どのように Java のステートレスアクションメソッドで簡単なWebページが生成することができるのだろうかと思われていると思います。*** 以下のようタイプします。

seam new-action

Seam は情報のために質問をしてきます。そして、プロジェクトのための新しい facelets page や Seam コンポーネントを生成します。

C:\Projects\jboss-seam>seam new-action ping
Buildfile: C:\Projects\jboss-seam\seam-gen\build.xml

validate-workspace:

validate-project:

action-input:
    [input] Enter the Seam component name
ping
    [input] Enter the local interface name [Ping]

    [input] Enter the bean class name [PingBean]

    [input] Enter the action method name [ping]

    [input] Enter the page name [ping]


setup-filters:

new-action:
     [echo] Creating a new stateless session bean component with an action method
     [copy] Copying 1 file to C:\Projects\hello\src\com\hello
     [copy] Copying 1 file to C:\Projects\hello\src\com\hello
     [copy] Copying 1 file to C:\Projects\hello\src\com\hello\test
     [copy] Copying 1 file to C:\Projects\hello\src\com\hello\test
     [copy] Copying 1 file to C:\Projects\hello\view
     [echo] Type 'seam restart' and go to http://localhost:8080/helloworld/ping.seam

BUILD SUCCESSFUL
Total time: 13 seconds
C:\Projects\jboss-seam>

新しい Seam コンポーネントを追加したので、展開したディレクトリのデプロイを再起動する必要があります。*** これは、seam restart とタイプすることでも、 Eclipse から 生成されたプロジェクト build.xml ファイル の restart ターゲットを起動することでも可能です。*** 再起動する別の方法は、Eclipse の resources/META-INF/application.xml ファイルを編集することです。 アプリケーションを変更するたびに JBoss を再起動する必要はないことに留意してください。

さあ、http://localhost:8080/helloworld/ping.seam に進んで、クリックボタンを押してください。 プロジェクトの src directory ディレクトリを見れば、このアクションに隠されたコードを見ることができます。 ping() メソッドにブレークポイントを置いて、 クリックボタンを押してください。

最後に、PingTest.xml ファイルを test パッケージに配置し、 Eclipse の TestNG プラグインを使用して統合テストを実行します。 別な方法として、 seam test を使用してテストを起動するか、 生成されたビルドから test ターゲットを起動します。***

2.4. アクションのあるフォームを生成する

次のステップは、以下のようにフォームを生成することです。

seam new-form
C:\Projects\jboss-seam>seam new-form
Buildfile: C:\Projects\jboss-seam\seam-gen\build.xml

validate-workspace:

validate-project:

action-input:
    [input] Enter the Seam component name
hello
    [input] Enter the local interface name [Hello]

    [input] Enter the bean class name [HelloBean]

    [input] Enter the action method name [hello]

    [input] Enter the page name [hello]


setup-filters:

new-form:
     [echo] Creating a new stateful session bean component with an action method
     [copy] Copying 1 file to C:\Projects\hello\src\com\hello
     [copy] Copying 1 file to C:\Projects\hello\src\com\hello
     [copy] Copying 1 file to C:\Projects\hello\src\com\hello\test
     [copy] Copying 1 file to C:\Projects\hello\view
     [copy] Copying 1 file to C:\Projects\hello\src\com\hello\test
     [echo] Type 'seam restart' and go to http://localhost:8080/hello/hello.seam

BUILD SUCCESSFUL
Total time: 5 seconds
C:\Projects\jboss-seam>

アプリケーションを再起動させ、 http://localhost:8080/helloworld/hello.seam に進みます。*** そして、生成されたコードを見てみましょう。 テストを実行します。 新しいフィールドをフォームと Seam コンポーネントに追加してみましょう。 (Java コードを変更するごとに、各デプロイを再起動することを忘れないでください。)

2.5. 既存のデータベースからアプリケーションを自動生成する

手動でデータベースの中にテーブルを生成しましょう。 違うデータベースに切り替える必要があれば、 ( 再び seam setup を実行します。) Now type:***

seam generate-entities

デプロイを再起動して、 http://localhost:8080/helloworld に進んでください。 データベースの参照、既存オブジェクトの編集、 新しいオブジェクトの生成が可能です。 生成されたコードを見たら、たぶんあまりに簡単なのに驚かれたと思います。 Seam は、データアクセスコードを手で簡単に書いたり、 seam-gen を使用することを裏切りたくない人のために競って刑されています。***

2.6. EAR形式でアプリケーションをデプロイする

最後に、標準の Java EE 5 パッケージングを使用してアプリケーションを可能としたいと思います。*** Finally, we want to be able to deploy the application using standard Java EE 5 packaging. 最初に、seam unexplode を実行して、 展開したディレクトリを削除する必要があります。 EAR をデプロイするために、コマンドプロンプトで seam deploy をタイプすることが可能、 あるいは、 生成されたプロジェクトの build スクリプトの deploy ターゲットを実行します。*** seam undeploy を使用してアンデプロイ可能です。 あるいは、 undeploy ターゲットで可能です。***

デフォルトで、アプリケーションは、 dev profile に***よってデプロイされます。*** EAR は、 persistence-dev.xmlimport-dev.sql ファイルを含み、myproject-dev-ds.xml ファイルはデプロイされます。*** プロファイルは変更可能で、 以下のように prod profile とタイプして使用します。***

seam -Dprofile=prod deploy

アプリケーションのために新しいデプロイ***プロファイルを定義することが可能です。 プロジェクトに適切な名前をつけらたファイルを追加してください。 例えば、 persistence-staging.xmlimport-staging.sqlmyproject-staging-ds.xml そして、-Dprofile=staging を使用してプロファイルの名前を選択してください。

2.7. Seam と逐次 ホットデプロイ***

展開されたディレクトリで Seam アプリケーションをデプロイする場合、 デプロイ時に逐次ホットデプロイのサポートを得るかもしれません。***?? to components.xml に以下のライン***を追加して、 Seam と Facelets 両方においてデバッグモードを有効にする必要があります。***

<core:init debug="true"/>

以下のファイルは、 Webアプリケーションを完全に再起動することなく置き換えがされるかもしれません。

  • facelets ページ

  • pages.xml ファイル

しかし、Java コードを変更したければ、 やはり、アプリケーションの完全な再起動を必要とします。 JBoss において、 トップレベルのデプロイメント***記述子に影響されることで、*** 達成されます。(EAR デプロイメントでは、application.xml、 WAR デプロイメントでは、web.xml)***

しかし、素早いエディット/コンパイル/テストのサイクルを望むならば、 Seamは、JavaBean コンポーネントの逐次的再デプロイメント***をサポートします。*** この機能を有効にするために、 JavaBean コンポーネントを WEB-INF/dev ディレクトリにデプロイする必要があります。 その結果、それらは、WAR あるいは EAR クラスローダではなく 特別な Seam クラスローダによってロードされます。

以下の制約を知っている必要があります。

  • コンポーネントは JavaBean コンポーネントでなければならず、 EJB3 Bean は不可です。(この制約は修正中です。)

  • エンティティはホットデプロイされるべきではありません。 ***

  • components.xml を通してデプロイされたコンポーネントは、 ホットデプロイはできなかもしれません。***

  • ホットデプロイ可能なコンポーネントは、 WEB-INF/dev の外部にデプロイされたクラスからは見えません。***

  • Seam デバックモードを有効にしなければなりません。

seam-gen を使用して WAR プロジェクトを生成した場合、 逐次ホットデプロイは、src/action すぐにソースディレクトリにあるクラスに有効です。*** しかしならが、seam-gen は、EARに対する逐次的ホットデプロイに対応していません。