SeamFramework.orgCommunity Documentation

第36章 OC4J 上の Seam

36.1. OC4J のインストールと操作
36.2. jee5/booking サンプル
36.2.1. ホテル予約サンプルの依存関係
36.2.2. 構成ファイルの変更点
36.2.3. jee5/booking サンプルのビルド
36.3. OC4J への Seam アプリケーションのデプロイ
36.4. seam-gen により生成されたアプリケーションの OC4J へのデプロイ
36.4.1. seam-gen アプリケーションの雛形の生成
36.4.2. OC4J へのデプロイに必要な変更点
36.4.3. seam-gen 生成アプリケーションのビルドと OC4J へのデプロイ
36.4.4. リバースエンジンニアリング生成した CRUD と Drools を使用したサンプルの拡張
36.5. 完成

OC4J (Oracle Containers for Java) 11g (現時点では "Technology Preview" リリース) は、Oracle の JEE5 アプリケーションサーバーです。Seam アプリケーションは、OC4J にデプロイすることが可能ですが、構成の変更と依存関係の追加が必要になります。この章では、まさに何が必要であるかを説明します。Seam に同梱されている JEE5 ホテル予約サンプルアプリケーションのビルドとデプロイを説明するところから始めます。それから、seam-gen によって生成されるプロジェクトをデプロイします。 まず最初に、RichFaces の ajax コンポーネントと facelets を使用した基本的な seam-gen アプリケーションを動作させます。次にこのアプリケーションを、Drools を使用した Seam セキュリティ、Hibernate により提供されるJPA、MySQL データベースからのリバースエンジニアリングを使用した CRUD 自動アプリケーションへと拡張してゆきます。

最初にターゲットコンテナ - OC4J のインストールが必要です。 この章では、OC4J 11g Technology Preview (OC4J 10g ではありません) の使用が必要です。OC4J 11g は http://www.oracle.com/technology/tech/java/oc4j/11/ からダウンロードできます。以下は、OC4J 11g のインストール、起動、アクセス、終了の手順です。OC4J のインストールについてのさらなる情報については、OC4J と一緒に配布されている readme.txt や、OC4J インストールガイド (installation guide) 、リリースノート (release notes)を参照してください。

  1. OC4J をダウンロードして解凍してください。

  2. 環境変数として $JAVA_HOME$ORACLE_HOME が設定されていることを確認してください ($ORACLE_HOME は OC4J を解凍したディレクトリです)。 OC4J のインストールの詳細については、OC4J と一緒に配布された readme.txt を参考にしてください

  3. $ORACLE_HOME/j2ee/home/applications ディレクトリにアプリケーション (ear/war) をデプロイしてください。

    OC4J は、デフォルトではホットデプロイをサポートしていないことに注意してください。 これは、アプリケーションをデプロイするたびにサーバを再起動しなければならないことを意味します。

  4. OC4J を起動してください。 $ORACLE_HOME/j2ee/home/java -jar -XX:MaxPermSize=256M oc4j.jar

    上記のコマンドを使用して、デフォルトの PermGen メモリ設定を上書きしなければなりません。詳細は、 OC4J リリースノート を参照してください。

    OC4J の初回起動時には、管理パスワードを設定するように求められます。

  5. デプロイできればすぐに、http://localhost:8888/<your-app-path> にアクセスしてアプリケーションを確認できます。

  6. サーバを停止するには、サーバを実行させているコンソールで CTRL-C を押します。

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

まずホテル予約サンプルの基本的な依存関係を調べます。この知識をもとに OC4J に必要となる追加の依存関係を調べます。

アプリケーションに依存関係を含める方法は、後の 項36.2.3. 「jee5/booking サンプルのビルド 」 で説明します。

必要な変更点はほんのわずかです。

このミニチュートリアルでは、JEE 5 アプリケーションを OC4J にデプロイするのに必要な (とても退屈な) 手順を説明します。項36.1. 「OC4J のインストールと操作」 の手順に従ってすでに OC4J をダウンロードしインストールを終えているものとして進めます。 組み込み hsqldb データベースを使用して jee5/booking サンプルをデプロイすることします。別のアプリケーションをデプロイするために、データソースとアプリケーション名を変更する必要があります。

  1. OC4J 共用ライブラリディレクトリへ hsqldb.jar をコピーしてください。 cp $SEAM_HOME/lib/hsqldb.jar $ORACLE_HOME/j2ee/home/applib/ (OC4J には組み込みデータベースが同梱されていないので HSQLDB を使用することにします)

  2. OC4J データソースファイル $ORACLE_HOME/j2ee/home/config/data-sources.xml を編集して、<data-sources> の内側に以下を追加してください

    
    <managed-data-source
       connection-pool-name="jee5-connection-pool"
       jndi-name="jdbc/__default"
       name="jee5-managed-data-source" />
    <connection-pool name="jee5-connection-pool">
       <connection-factory
          factory-class="org.hsqldb.jdbcDriver" 
          user="sa"
          password="" 
          url="jdbc:hsqldb:." />
    </connection-pool>

    jndi-namepersistence.xmljta-data-source として使用されます。

  3. $ORACLE_HOME/j2ee/home/config/server.xml を編集して、<application-server> の内側に以下を追加してください

    
    <application name="jboss-seam-jee5"
     path="../../home/applications/jboss-seam-jee5.ear"
     parent="default" 
     start="true" />

    簡単にするために、プロジェクトに使用したのと同じ名前を使用してください。

  4. $ORACLE_HOME/j2ee/home/config/default-web-site.xml を編集して、<web-site> の内側に以下を追加してください

    
    <web-app application="jboss-seam-jee5"
     name="jboss-seam-jee5" 
     load-on-startup="true"
     root="/seam-jee5" />

    root は、アプリケーションにアクセスするために Web ブラウザに入力するコンテキストパスです。

  5. アプリケーションを OC4J にコピーしてください。 cp dist/jboss-seam-jee5.ear $ORACLE_HOME/j2ee/home/applications/

  6. 上記の 項36.1. 「OC4J のインストールと操作」 の手順に従って、OC4J を起動 / 終了してください。

  7. http://localhost:8888/seam-jee5 をブラウズしてアプリケーションを確認してください。

seam-genは、開発者が素早く完全な Seam アプリケーションを準備し動作させることができる優れたツールです。しかし生成されるプロジェクトは、JBoss AS 上で動作させるように構成されています。そのため OC4J で実行させるためには、追加の手順が必要になります。以下の説明は、コマンドラインとシンプルなテキストエディタを使用していることを想定します。しかし、もちろんお気に入りの IDE を使用することもできます。seam-gen プロジェクトは Eclipse と Netbeans のサポート機能も一緒に生成されます。

seam-gen 使用した簡単なアプリケーションを作成してデプロイすることから始めます。次に、seam-gen と Hibernate Tools を使用して、データベーススキーマからのリバースエンジニアリングにより基礎的な CRUD アプリケーションを生成するのがいかに簡単であるかを示します。seam-gen は、 JPA エンティティ Bean や Seam アプリケーションフレームワークコンポーネント、 JSF ビューを作成します。Drools を使用した Seam セキュリティも追加します。

このチュートリアルは MySQL を使用します (しかしもちろん SQL とデータソースを適切に変更して、どんなデータベースも使用できます); MySQL をインストールし構成して実行して、サンプルデータを持つデータベースを作成してください。JDBC サポートのために mysql-connector-java-X.jar もダウンロードするのを忘れないでください。このチュートリアルで Seam セキュリティを設定するには、usernamepassword カラムを持つ User という名前のテーブルと最低一つのエントリがあることを想定します。さらに好きなどんなタイプのサンプルデータとテーブルを設定することもできます。

まず seam-gen をセットアップする必要があります。Seam ディストリビューションディレクトリで ./seam setup を実行します。以下の設定例に従い、あなたのシステムと設定に基づいて設定してください (例えば oc4jexample の代わりに自分のデータベース名を使用してください)。

> ./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]
/home/jbalunas/workspace
    [input] Enter your JBoss home directory [C:/Program Files/jboss-4.2.3.GA] 
[C:/Program Files/jboss-4.2.3.GA]
/home/jbalunas/jboss/jboss-4.2.3.GA
    [input] Enter the project name [myproject] [myproject]
oc4j_example
     [echo] Accepted project name as: oc4j_example
    [input] Select a RichFaces skin (not applicable if using ICEFaces) [blueSky]
 ([blueSky], classic, ruby, wine, deepMarine, emeraldTown, sakura, 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.
oc4j_example] [com.mydomain.oc4j_example]
org.jboss.seam.tutorial.oc4j.action
    [input] Enter the Java package name for your entity beans [org.jboss.seam.
tutorial.oc4j.action] [org.jboss.seam.tutorial.oc4j.action]
org.jboss.seam.tutorial.oc4j.model
    [input] Enter the Java package name for your test cases [org.jboss.seam.
tutorial.oc4j.action.test] [org.jboss.seam.tutorial.oc4j.action.test]
org.jboss.seam.tutorial.oc4j.test
    [input] What kind of database are you using? [hsql]  ([hsql], mysql, oracle,
 postgres, mssql, db2, sybase, enterprisedb, h2)
mysql
    [input] Enter the Hibernate dialect for your database [org.hibernate.
dialect.MySQLDialect] [org.hibernate.dialect.MySQLDialect]

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

    [input] Enter the JDBC URL for your database [jdbc:mysql:///test] 
[jdbc:mysql:///test]
jdbc:mysql:///oc4jexample
    [input] Enter database username [sa] [sa]
username
    [input] Enter database password [] []
password
    [input] skipping input as property hibernate.default_schema.new has already 
been set.
    [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], )
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
    [input] Enter your ICEfaces home directory (leave blank to omit ICEfaces) [] []

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

BUILD SUCCESSFUL

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

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

構成ファイルの変更から始めましょう:

build.xml
resources/META-INF/persistence-dev.xml
resources/META-INF/jboss-app.xml

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

resources/*-ds.xml

JBoss AS にはデプロイしないのでこのファイルを削除できます (これらのファイルは、JBoss AS ではデータソースを定義していますが、OC4J ではマスタの data-sources.xml ファイルを編集しなければなりません)

resources/WEB-INF/components.xml
resources/WEB-INF/web.xml

以下の Seam コンテナ管理トランザクション統合 EJB のエントリを追加しなければなりません。 OC4J では、アプリケーションをさらに修正すれば、EJB をここで宣言する必要があることを思い出してください。


<ejb-local-ref>
   <ejb-ref-name>
      oc4j_example/EjbSynchronizations/local
   </ejb-ref-name>
   <ejb-ref-type
>Session</ejb-ref-type>
   <local>
      org.jboss.seam.transaction.LocalEjbSynchronizations
   </local>
   <ejb-link
>EjbSynchronizations</ejb-link>
</ejb-local-ref>
resources/META-INF/orion-application.xml

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

build.xml は、生成するアーカイブファイルに以下にリストした jar を追加するように修正しなければなりません。以下の <fileset dir="${basedir}"> セクションを探して、 その下にインポートされる他のライブラリを追加してください。


<target name="ear" description="Build the EAR">
       <copy todir="${ear.dir}">
               <fileset dir="${basedir}/resources">
                       <include name="*jpdl.xml" />
                       <include name="*hibernate.cfg.xml" />
                       <include name="jbpm.cfg.xml" />
                       <include name="*.drl" />
               </fileset>
            <fileset dir="${lib.dir}">
                  <include name="jboss-seam.jar" />
            </fileset>
               <fileset dir="${basedir}">
                       <include name="lib/jbpm*.jar" />
                       <include name="lib/jboss-el.jar" />
                       <include name="lib/drools-*.jar"/>
                       <include name="lib/janino*.jar"/>
                       <include name="lib/antlr-*.jar"/>
                       <include name="lib/mvel*.jar"/>
                     <include name="lib/richfaces-api*.jar" />
               </fileset>
       </copy>
       <copy todir="${ear.dir}/META-INF">
               <fileset dir="${basedir}/resources/META-INF">
                       <include name="application.xml" />
                       <include name="jboss-app.xml" />
               </fileset>
       </copy>
</target>

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


<fileset dir="${basedir}">
      <include name="lib/jbpm*.jar" />
      <include name="lib/jboss-el.jar" />
      <include name="lib/drools-*.jar"/>
      <include name="lib/janino*.jar"/>
      <include name="lib/antlr-*.jar"/>
      <include name="lib/mvel*.jar"/>
      <include name="lib/richfaces-api*.jar" />
      <include name="lib/hibernate.jar"/>
      <include name="lib/hibernate-annotations.jar"/>
      <include name="lib/hibernate-commons-annotations.jar"/>
      <include name="lib/hibernate-entitymanager.jar"/>
      <include name="lib/hibernate-search.jar"/>
      <include name="lib/hibernate-validator.jar"/>
      <include name="lib/commons-logging.jar"/>
      <include name="lib/commons-collections.jar"/>
      <include name="lib/jboss-common-core.jar"/>
      <include name="lib/core.jar"/>
      <include name="lib/javassist.jar"/>
      <include name="lib/quartz.jar"/>
      <include name="lib/dbunit.jar"/>
      <include name="lib/jboss-embedded-api.jar"/>
      <include name="lib/dom4j.jar"/>                             
      <include name="lib/lucene-core.jar"/>
      <include name="lib/cglib.jar"/>
      <include name="lib/asm.jar"/>
      <include name="lib/commons-beanutils.jar"/>
      <include name="lib/commons-digester.jar"/>
      <include name="lib/concurrent.jar"/>
      <include name="lib/antlr.jar"/>
</fileset>

これらの手順は 項36.3. 「OC4J への Seam アプリケーションのデプロイ」 の手順と非常に類似していますが、oc4j_example アプリケーションへ正しく置き換えて使用することが必要です。

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

  • mysql-connector.jar ファイルを $ORACLE_HOME/j2ee/home/applib ディレクトリにコピーして、JDBC ドライバが利用できるようにしてください。

  • $ORACLE_HOME/j2ee/home/config/data-sources.xml

    
    <managed-data-source
       connection-pool-name="oc4j-example-connection-pool"
       jndi-name="jdbc/__oc4jexample"
       name="oc4j-example-managed-data-source" />
    <connection-pool
       name="oc4j-example-connection-pool">
       <connection-factory
          factory-class="com.mysql.jdbc.Driver"
          user="username" 
          password="password"
          url="jdbc:mysql:///oc4j" />
    </connection-pool>
  • $ORACLE_HOME/j2ee/home/config/server.xml

    
    <application name="oc4j_example"
     path="../../home/applications/oc4j_example.ear"
     parent="default"
     start="true" />
  • $ORACLE_HOME/j2ee/home/config/default-web-site.xml

    
    <web-app application="oc4j_example"
     name="oc4j_example" 
     load-on-startup="true"
     root="/oc4j_example" />
  • 上記の 項36.1. 「OC4J のインストールと操作」 の手順に従って、OC4J を起動 / 終了してください。

  • http://localhost:8888/oc4j_example をブラウズしてアプリケーションを確認してください。

ここでは、基本的な seam-gen アプリケーションを、現存のデータベースをもとにした本格的な CRUD アプリケーションに拡張します。さらに Drools ベースのセキュリティも追加します。

上記で述べたように、ここでは usernamepassword のカラムを持つ User テーブルと、少なくとも一つのエントリを持つデータベースがあることを想定しています。もしデータベースがなければ、以下の authenticate メソッドを修正する必要があります。

authenticator クラスをステートレスセッション Bean にすることによって、User エンティティを Seam セキュリティにリンクします (OC4J は要するに EJB3 コンテナです!)。

  1. @Name("authenticator")
    
    @Stateless
    public class AuthenticatorAction implements Authenticator {
    @Local
    
    public interface Authenticator { 
      public boolean authenticate(); 
    }
  2. AuthenticatorAction クラスに以下の行を追加することによって EntityManager をインジェクトするのに@PersistenceContext を使用してください。

    @PersistenceContext private EntityManager entityManager;
  3. authenticate クラスを実装してください。

    public boolean authenticate() {
    
       List <User
    > users = entityManager .createQuery("select u from User u where
       u.username = #{identity.username} and 
       u.password = #{identity.password}") .getResultList();
       if (users.size() == 1) {
          identity.addRole("admin"); 
          return true; 
       } else {
          return false; 
       } 
    }
  4. web.xml に EJB3 参照を追加してください。

    
    <ejb-local-ref>
       <ejb-ref-name>
          oc4j_example/AuthenticatorAction/local
       </ejb-ref-name>
       <ejb-ref-type
    >Session</ejb-ref-type>
       <local>
          org.jboss.seam.tutorial.oc4j.action.Authenticator
       </local>
       <ejb-link
    >AuthenticatorAction</ejb-link>
    </ejb-local-ref>

前のようにビルドしてデプロイしてください、今は単に実際に入力されたユーザー名とパスワードが受け入れられることに注意してください。

以上で完成です。OC4J にデプロイする Seam アプリケーションの出発点として利用できる雛形を作成できました。