SeamFramework.org Community Documentation

- 前のページ
- 次のページ

## 第41章 GlassFish アプリケーションサーバー上の Seam

GlassFish は、Java EE 5 を完全に実装したオープンソースのアプリケーションサーバーです。最新の安定リリースは v2 UR2 です。

まず最初に GlassFish 環境について述べて、どのように jee5 サンプルをデプロイするのかを詳しく説明します。次に、jpa サンプルアプリケーションをデプロイします。最後に、seam-gen により生成されたアプリケーションをどのようにして GlassFish 上で動作させるのかを示します。

## 41.1. GlassFish 環境とデプロイメント情報

### 41.1.1. インストール

この章のサンプルと情報は、すべて執筆時の GlassFish の最新バージョンに基づいています。

- GlassFish v2 UR2 - ダウンロードページ

GlassFish をダウンロードして、インストールしてください。

    $ java -Xmx256m -jar glassfish-installer-v2ur2-b04-linux.jar

インストールした後に、GlassFish をセットアップしてください。

    $ cd glassfish; ant -f setup.xml

作成されたドメインの名前は`domain1` です。

次に、組み込み JavaDB サーバを起動します。

    $ bin/asadmin start-database

## 注意

JavaDB は、HSQLDB が JBoss AS に含まれているのと同様に、GlassFish の組み込みデータベースです。

最後に、GlassFish サーバを起動してください。

    $ bin/asadmin start-domain domain1

Web 管理コンソールは、`http://localhost:4848/` からアクセス可能です。Web 管理コンソールには、デフォルトユーザー名 (`admin`) とパスワード (`adminadmin`) でアクセスできます。 管理コンソールを使用してサンプルをデプロイすることも可能です。 また、詳説は省きますが EAR / WAR ファイルを `glassfish/domains/domain1/autodeploy` にコピーしてデプロイすることも可能です。

サーバとデータベースを停止するには、以下のようにしてください。

    $ bin/asadmin stop-domain domain1; bin/asadmin stop-database

## 41.2. `jee5/booking` サンプル

`jee5/booking` サンプルは、(JBoss AS 上で動作する) ホテル予約サンプルに基づいています。そのままで GlassFish 上で動作するように設計されています。このサンプルは `$SEAM_DIST/examples/jee5/booking` にあります。

### 41.2.1. `jee5/booking` サンプルのビルド

サンプルをビルドするためには、 `examples/jee5/booking` ディレクトリにおいてデフォルトの `ant` ターゲットを実行します。

    $ ant

これによりコンテナに対応した `dist` ディレクトリと `exploded-archives` ディレクトリが作成されます。

### 41.2.2. GlassFish へのアプリケーションのデプロイ

GlassFish 管理コンソールを利用して GlassFish にアプリケーションをデプロイします。

1. `http://localhost:4848` から管理コンソールにログインします。

2. 左側のサイドメニュー `Applications (アプリケーション)` の下にあるメニューオプションで `Enterprise Applications (エンタープライズアプリケーション)` にアクセスしてください。

3. `Enterprise Application (エンタープライズアプリケーション)` テーブルのトップで `Deploy (配備)` を選択してください。以下のヒントを使って、ウィザードを最後まで進めてください。

   - `アプリケーションのインストール準備`

     - ブラウザで `examples/jee5/booking/dist/jboss-seam-jee5.ear` を指定してください。

     - `OK` ボタンを選択してください。

4. `http://localhost:8081/seam-jee5/` からアプリケーションにアクセスできます。

## 41.3. `jpa` booking サンプル

これは、Hibernate JPA と JPA トランザクションを利用して Seam POJO で実装されたホテル予約サンプルです。アプリケーションサーバーで動作させるのに、EJB3 サポートを必要としません。

サンプルには、GlassFish も含めた多くのコンテナ用の構成とビルドスクリプトが既に用意されています。

### 41.3.1. `jpa` サンプルのビルド

サンプルをビルドするためには、`glassfish` ターゲットを使用します。

    $ ant glassfish

これによりコンテナに対応した `dist-glassfish` ディレクトリと `exploded-archives-glassfish` ディレクトリが作成されます。

### 41.3.2. `jpa` サンプルのデプロイ

これは `ear` でなく `war` であることを除けば、 項41.2.2. 「GlassFish へのアプリケーションのデプロイ」 の `jee5` サンプルと非常に類似しています。

- 管理コンソールへログインしてください。

      http://localhost:4848

- 左側のサイドメニュー `Applications (アプリケーション)` の下にあるメニューオプションで `Web Applications (Web アプリケーション)` にアクセスしてください。

  - `アプリケーションのインストール準備`

    - ブラウザで `examples/jpa/dist-glassfish/jboss-seam-jpa.war` を指定してください。

    - `OK` ボタンを選択してください。

  - `http://localhost:8081/jboss-seam-jpa/` からアプリケーションにアクセスできます。

## Hypersonic SQL DB の代わりに Derby を使用

GlassFish でアプリケーションをそのまま動かすために、Derby (別名 JavaDB) データベースを GlassFish と一緒に使用しました。しかし、別のデータベース(例えば Hypersonic SQL) を使用することを強く推奨します。 `examples/jpa/resources-glassfish/WEB-INF/classes/GlassfishDerbyDialect.class` は、GlassFish サーバにおける Derby のバグを避けるハックです。もし GlassFish で Derby を使用するのであれば、これを Hibernate ダイアレクトとして使用しなければなりません。

### 41.3.3. GlassFish v2 UR2 での変更点

- 構成ファイルの変更

  - `META-INF/persistence.xml` — 必要な主な変更点は、データソース JNDI の変更、トランザクションマネージャのルックアップクラスを GlassFish トランザクションマネージャのルックアップクラスに変更、Hibernate ダイアレクトを `GlassfishDerbyDialect` に変更することです。

  - `WEB-INF/classes/GlassfishDerbyDialect.class` — このクラスは、Hibernate ダイアレクトを `GlassfishDerbyDialect` に変更するのに必要です。

  - `import.sql` — ダイアレクトと Derby DB のいずれでも `ID` カラムは生成されないので、このファイルから削除されています。

## 41.4. `seam-gen` により生成されたアプリケーションの GlassFish v2 UR2 へのデプロイ

`seam-gen` は、開発者が素早くアプリケーションを準備して動作させるのにとても役に立つツールで、独自の機能を追加するための雛形を用意します。`seam-gen` はそのままで JBoss AS で動作するように構成されたアプリケーションを生成します。以下の手順では、これを GlassFish 上で動作させるために必要なステップを示します。

### 41.4.1. `seam-gen` セットアップの実行

第一ステップは、雛形となるプロジェクトを生成できるように `seam-gen` をセットアップすることです。以下に実行したように、設定すべき項目がいくつかあります。特に、データソースと Hibernate の設定値は、プロジェクトを生成する環境に合わせて設定します。

    $ ./seam setup
    Buildfile: build.xml

    init:

    setup:
    [echo] Welcome to seam-gen :-)
    [input] Enter your Java project workspace (the directory that contains your
    Seam projects) [C:/Projects] [C:/Projects]
    /projects
    [input] Enter your JBoss home directory [C:/Program Files/jboss-4.2.3.GA]
    [C:/Program Files/jboss-4.2.3.GA]

    [input] Enter the project name [myproject] [myproject]
    seamgen_example
    [echo] Accepted project name as: seamgen_example
    [input] Do you want to use ICEfaces instead of RichFaces [n] (y, [n])

    [input] skipping input as property icefaces.home.new has already
    been set.
    [input] Select a RichFaces skin [blueSky] ([blueSky], classic, ruby, wine,
    deepMarine, emeraldTown, japanCherry, DEFAULT)

    [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.seamgen_example] [com.mydomain.seamgen_example]
    org.jboss.seam.tutorial.glassfish.action
    [input] Enter the Java package name for your entity beans
    [org.jboss.seam.tutorial.glassfish.action]
    [org.jboss.seam.tutorial.glassfish.action]
    org.jboss.seam.tutorial.glassfish.model
    [input] Enter the Java package name for your test cases
    [org.jboss.seam.tutorial.glassfish.action.test]
    [org.jboss.seam.tutorial.glassfish.action.test]
    org.jboss.seam.tutorial.glassfish.test
    [input] What kind of database are you using? [hsql] ([hsql], mysql, oracle,
    postgres, mssql, db2, sybase, enterprisedb, h2)

    [input] Enter the Hibernate dialect for your database
    [org.hibernate.dialect.HSQLDialect]
    [org.hibernate.dialect.HSQLDialect]

    [input] Enter the filesystem path to the JDBC driver jar
    [/tmp/seam/lib/hsqldb.jar] [/tmp/seam/lib/hsqldb.jar]

    [input] Enter JDBC driver class for your database [org.hsqldb.jdbcDriver]
    [org.hsqldb.jdbcDriver]

    [input] Enter the JDBC URL for your database [jdbc:hsqldb:.]
    [jdbc:hsqldb:.]

    [input] Enter database username [sa] [sa]

    [input] Enter database password [] []

    [input] Enter the database schema name (it is OK to leave this blank) [] []

    [input] Enter the database catalog name (it is OK to leave this
    blank) [] []

    [input] Are you working with tables that already exist in the database? [n]
    (y, [n])

    [input] Do you want to drop and recreate the database tables and data in
    import.sql each time you deploy? [n] (y, [n])

    [propertyfile] Creating new property file:
    /home/mnovotny/workspaces/jboss/jboss-seam/seam-gen/build.properties
    [echo] Installing JDBC driver jar to JBoss server
    [copy] Copying 1 file to
    /home/mnovotny/workspaces/jboss/jboss-seam/seam-gen/C:/Program
    Files/jboss-4.2.3.GA/server/default/lib
    [echo] Type 'seam create-project' to create the new project

    BUILD SUCCESSFUL
    Total time: 4 minutes 5 seconds

プロジェクトを作成するためには、`$ ./seam new-project` と入力してください。そして `cd /projects/seamgen_example` と入力して新しく作成されたディレクトリへ移動してください。

### 41.4.2. GlassFish へのデプロイに必要な変更点

生成されたプロジェクトに変更を行う必要があります。

#### 41.4.2.1. 構成ファイルの変更

`resources/META-INF/persistence-dev.xml`

  - `jta-data-source` を `jdbc/__default` に修正してください。組み込みの GlassFish Derby DB を使用します。

  - 以下のプロパティを修正してください。主要な違いが 項41.3.3. 「GlassFish v2 UR2 での変更点」 で解説されています。

        <property name="hibernate.dialect" value="GlassfishDerbyDialect"/>

        <property name="hibernate.hbm2ddl.auto" value="update"/>

        <property name="hibernate.show_sql" value="true"/>

        <property name="hibernate.format_sql" value="true"/>

        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>

        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup"/>

  - prod プロファイルを使用して GlassFish にデプロイしたければ、`persistence-prod.xml` も同様に修正する必要があります。

`resources/GlassfishDerbyDialect.class`

  他のサンプルと同様に、データベースサポートのためのこのクラスを含める必要があります。`jpa` サンプルから `seamgen_example/resources` ディレクトリへコピーしてください。

      $ cp \
      $SEAM_DIST/examples/jpa/resources-glassfish/WEB-INF/classes/GlassfishDerbyDialect.class \
      ./resources

`resources/META-INF/jboss-app.xml`

  JBoss AS にはデプロイしないのでこのファイルを削除できます (JBoss AS では `jboss-app.xml` を使用して、クラスローディングの分離を有効にします)

`resources/*-ds.xml`

  JBoss AS にはデプロイしないのでこのファイルを削除できます (これらのファイルは、JBoss AS ではデータソースを定義していますが、GlassFish ではデフォルトのデータソースを使用しています)

`resources/WEB-INF/components.xml`

  - コンテナ管理トランザクション統合を有効にします - `<transaction:ejb-transaction/>` コンポーネントと、その名前空間宣言 `xmlns:transaction="http://jboss.com/products/seam/transaction"` を追記してください

  - `jndi-pattern` を `java:comp/env/seamgen_example/#{ejbName}` に修正します

`resources/WEB-INF/web.xml`

  `jee5/booking` サンプルと同様に、web.xml に EJB 参照を加える必要があります。厳密にはこの参照は必要でありませんが、良い標準となるよう明示します。これらの EJB 参照には、 JBoss AS 4.x との互換性を保持するために空の `local-home` を設定することが必要となります。

      <ejb-local-ref

      >

          <ejb-ref-name

      >seamgen_example/AuthenticatorAction</ejb-ref-name

      >

          <ejb-ref-type

      >Session</ejb-ref-type

      >

          <local-home/>

          <local

      >org.jboss.seam.tutorial.glassfish.action.Authenticator</local

      >

        </ejb-local-ref>

        <ejb-local-ref>

          <ejb-ref-name

      >seamgen_example/EjbSynchronizations</ejb-ref-name

      >

          <ejb-ref-type

      >Session</ejb-ref-type>

          <local-home/>

          <local

      >org.jboss.seam.transaction.LocalEjbSynchronizations</local>

        </ejb-local-ref

      >

  上述のような EJB 参照が含まれる web.xml を JBoss AS 4.x にデプロイする場合、これらそれぞれに関するローカル JNDI 名も以下で示すように jboss-web.xml に定義する必要があります。この行程は GlassFish へのデプロイでは必須ではりませんが、 JBoss AS 4.x にアプリケーションをデプロイする場合を考慮し言及しておきます。 ( JBoss AS 5 では必要ありません)

      <ejb-local-ref

      >

          <ejb-ref-name

      >seamgen_example/AuthenticatorAction</ejb-ref-name

      >

          <local-jndi-name

      >AuthenticatorAction</local-jndi-name

      >

        </ejb-local-ref>

        <ejb-local-ref>

          <ejb-ref-name

      >seamgen_example/EjbSynchronizations</ejb-ref-name

      >

          <local-jndi-name

      >EjbSynchronizations</local-jndi-name>

        </ejb-local-ref

      >

#### 41.4.2.2. `AuthenticatorAction` EJB の作成

既存の `Authenticator` Seam POJO コンポーネントを利用して、EJB3 を作成します。

1. - クラス名を `AuthenticatorAction` に変更します。

   - `@Stateless` アノテーションを新しい `AuthenticatorAction` クラスに付与します。

   - `AuthenticatorAction` が実装する `Authenticator` という名前のインタフェースを作成してください (EJB3 ではセッション Bean にローカルインタフェースが必要)。インタフェースに `@Local` アノテーションを付与し、`AuthenticatorAction` の `authenticate` と同じシグニチャのメソッドを一つ追加してください。

       @Name("authenticator")

       @Stateless

       public class AuthenticatorAction implements Authenticator {

       @Local

       public interface Authenticator {

          public boolean authenticate();

       }

2. すでに `web.xml` ファイルには EJB 参照を追加したので、次に進めます。

#### 41.4.2.3. `build.xml` への jar 依存関係の追加とその他の変更点

このアプリケーションは、`jee5/booking` サンプルと同様の変更が必要となります。

- デフォルトのターゲットを `archive` に変更します (GlassFish への自動的なデプロイを行いません)。

      <project name="seamgen_example" default="archive" basedir=".">

- `GlassFishDerbyDialect.class` をアプリケーション jar に含める必要があります。そのためには、`jar` タスクを見つけ、 `GlassfishDerbyDialect.class` に関する記述を以下のように追加します。

      <target name="jar" depends="compile,copyclasses" description="Build the distribution .jar file">

         <copy todir="${jar.dir}">

            <fileset dir="${basedir}/resources">

               <include name="seam.properties" />

               <include name="*.drl" />

               <include name="GlassfishDerbyDialect.class" />

            </fileset

      >

         </copy>

         ...

- 追加の jar を `ear` ファイルに入れる必要があります。`ear` ターゲットの `<copy todir="${ear.dir}/lib" >` 部分を探してください。`<fileset dir="${lib.dir}" >` 要素を子要素に追加してください。

- - Hibernate 依存関係を追加してください。

        <!-- Hibernate and deps -->

        <include name="hibernate.jar"/>

        <include name="hibernate-commons-annotations.jar"/>

        <include name="hibernate-annotations.jar"/>

        <include name="hibernate-entitymanager.jar"/>

        <include name="hibernate-validator.jar"/>

        <include name="jboss-common-core.jar"/>

  - サードパーティ依存関係を追加してください。

        <!-- 3rd party and supporting jars -->

        <include name="javassist.jar"/>

        <include name="dom4j.jar"/>

        <include name="concurrent.jar" />

        <include name="cglib.jar"/>

        <include name="asm.jar"/>

        <include name="antlr.jar" />

        <include name="commons-logging.jar" />

        <include name="commons-collections.jar" />

  最後には以下のようになります。

      <fileset dir="${lib.dir}">

         <includesfile name="deployed-jars-ear.list" />

         <!-- Hibernate and deps -->

         <include name="hibernate.jar"/>

         <include name="hibernate-commons-annotations.jar"/>

         <include name="hibernate-annotations.jar"/>

         <include name="hibernate-entitymanager.jar"/>

         <include name="hibernate-validator.jar"/>

         <include name="jboss-common-core.jar" />

         <!-- 3rd party and supporting jars -->

         <include name="javassist.jar" />

         <include name="dom4j.jar" />

         <include name="concurrent.jar" />

         <include name="cglib.jar" />

         <include name="asm.jar" />

         <include name="antlr.jar" />

         <include name="commons-logging.jar" />

         <include name="commons-collections.jar" />

      </fileset

      >

#### 41.4.2.4. seam-gen 生成アプリケーションのビルドと GlassFish へのデプロイ

- プロジェクトのベースディレクトリ(例えば `/projects/seamgen-example`)で `ant` を実行してアプリケーションをビルドしてください。ビルドされるターゲットファイルは `dist/seamgen-example.ear` です。

- アプリケーションをデプロイするには、 項41.2.2. 「GlassFish へのアプリケーションのデプロイ」 の手順に従ってください 。ただし、`jboss-seam-jee5` の代わりにこのプロジェクト `seamgen-example` へ置き換えて使用してください。

- `http://localhost:8081/seamgen_example/` をブラウズしてアプリケーションを確認してください。

- 前のページ第40章 IBM Websphere AS 上の Seam
- 上に戻る
- ホーム
- 次のページ第42章 依存性