SeamFramework.orgCommunity Documentation
GlassFish は、Java EE 5 を完全に実装したオープンソースのアプリケーションサーバーです。最新の安定リリースは v2 UR2 です。
まず最初に GlassFish 環境について述べて、どのように jee5 サンプルをデプロイするのかを詳しく説明します。次に、jpa サンプルアプリケーションをデプロイします。最後に、seam-gen により生成されたアプリケーションをどのようにして GlassFish 上で動作させるのかを示します。
この章のサンプルと情報は、すべて執筆時の GlassFish の最新バージョンに基づいています。
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
jee5/booking
サンプルは、(JBoss AS 上で動作する) ホテル予約サンプルに基づいています。そのままで GlassFish 上で動作するように設計されています。このサンプルは $SEAM_DIST/examples/jee5/booking
にあります。
サンプルをビルドするためには、 examples/jee5/booking
ディレクトリにおいてデフォルトの ant
ターゲットを実行します。
$ ant
これによりコンテナに対応した dist
ディレクトリと exploded-archives
ディレクトリが作成されます。
GlassFish 管理コンソールを利用して GlassFish にアプリケーションをデプロイします。
http://localhost:4848
から管理コンソールにログインします。
左側のサイドメニュー Applications (アプリケーション)
の下にあるメニューオプションで Enterprise Applications (エンタープライズアプリケーション)
にアクセスしてください。
Enterprise Application (エンタープライズアプリケーション)
テーブルのトップで Deploy (配備)
を選択してください。以下のヒントを使って、ウィザードを最後まで進めてください。
アプリケーションのインストール準備
ブラウザで examples/jee5/booking/dist/jboss-seam-jee5.ear
を指定してください。
OK
ボタンを選択してください。
http://localhost:8081/seam-jee5/
からアプリケーションにアクセスできます。
これは、Hibernate JPA と JPA トランザクションを利用して Seam POJO で実装されたホテル予約サンプルです。アプリケーションサーバーで動作させるのに、EJB3 サポートを必要としません。
サンプルには、GlassFish も含めた多くのコンテナ用の構成とビルドスクリプトが既に用意されています。
サンプルをビルドするためには、glassfish
ターゲットを使用します。
$ ant glassfish
これによりコンテナに対応した dist-glassfish
ディレクトリと exploded-archives-glassfish
ディレクトリが作成されます。
これは 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/
からアプリケーションにアクセスできます。
examples/jpa/resources-glassfish/WEB-INF/classes/GlassfishDerbyDialect.class
は、GlassFish サーバにおける Derby のバグを避けるハックです。もし GlassFish で Derby を使用するのであれば、これを Hibernate ダイアレクトとして使用しなければなりません。 構成ファイルの変更
META-INF/persistence.xml
— 必要な主な変更点は、データソース JNDI の変更、トランザクションマネージャのルックアップクラスを GlassFish トランザクションマネージャのルックアップクラスに変更、Hibernate ダイアレクトを GlassfishDerbyDialect
に変更することです。
WEB-INF/classes/GlassfishDerbyDialect.class
— このクラスは、Hibernate ダイアレクトを GlassfishDerbyDialect
に変更するのに必要です。
import.sql
— ダイアレクトと Derby DB のいずれでも ID
カラムは生成されないので、このファイルから削除されています。
seam-gen
は、開発者が素早くアプリケーションを準備して動作させるのにとても役に立つツールで、独自の機能を追加するための雛形を用意します。seam-gen
はそのままで JBoss AS で動作するように構成されたアプリケーションを生成します。以下の手順では、これを GlassFish 上で動作させるために必要なステップを示します。
第一ステップは、雛形となるプロジェクトを生成できるように 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
と入力して新しく作成されたディレクトリへ移動してください。
生成されたプロジェクトに変更を行う必要があります。
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
>
既存の Authenticator
Seam POJO コンポーネントを利用して、EJB3 を作成します。
クラス名を 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();
}
すでに web.xml
ファイルには EJB 参照を追加したので、次に進めます。
このアプリケーションは、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
>
プロジェクトのベースディレクトリ(例えば /projects/seamgen-example
)で ant
を実行してアプリケーションをビルドしてください。ビルドされるターゲットファイルは dist/seamgen-example.ear
です。
アプリケーションをデプロイするには、 項41.2.2. 「GlassFish へのアプリケーションのデプロイ」 の手順に従ってください 。ただし、jboss-seam-jee5
の代わりにこのプロジェクト seamgen-example
へ置き換えて使用してください。
http://localhost:8081/seamgen_example/
をブラウズしてアプリケーションを確認してください。