JBossToolsで生成した雛形アプリをGlassfish v2で動作させるのに必要な手順

JBossTools3.1のSeamWebプロジェクト作成ウィザードで生成したアプリケーションをGlassfish2.1.1にデプロイして動作可能にするのに必要な追加手順について、以下にメモします。

1. log4jのセットアップ

http://weblogs.java.net/blog/schaefa/archive/2007/08/to_the_hell_wit_1.html
を参考にして、Glassfishlog4jが使えるようにします。要するにlog4jのjarファイルと設定ファイルをサーバーのクラスパスに通すだけです。原始的な方法ですが、これで一応log4jを使って標準出力やファイルにログを出力できるようになります。

2.jarファイルのインストール

主にHibernate関連のjarファイルを

[Glassfishインストール先]\domains\domain1\lib

にコピーします。少なくとも Seamのインストールアーカイブに含まれるlibディレクト配下の以下のライブラリをコピーしました。

antlr.jar
cglib-nodep.jar
commons-collections.jar
dom4j.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate-core.jar
hibernate-entitymanager
hibernate-validator.jar
hibernate-search.jar 
lucene-core.jar
javassist.jar
gwt-servlet.jar
slf4j-api.jar
slf4j-log4j12.jar

(実際にはmavenやivyを使って依存関係を自動的に解決するほうがベター)

3.Derby用のHibernateDialectのインストール

[Seamインストール先]\examples\jpa\resources-glassfish\WEB-INF\classes

にあるGlassfishDerbyDialect.classを

[Glassfishインストール先]\domains\domain1\lib\classes

にコピーします。もちろん、Glassfish付属のDerbyを利用しないなら不要です。

4.JPA用のpersistence.xmlを置換

[Seamインストール先]\examples\jpa\resources-glassfish\META-INF

にあるpersistence.xmlでプロジェクトのsrc/main/META-INFにある同名のファイルを置換します。persistece-unitタグのname属性で指定されているbookingDatabaseは適当に置き換えます。(ここではseamhelloとしました。)

5.web.xmlでpersistence-unit-refを追加

JBossの場合は不要ですが、GlassfishではWebアプリから参照するために以下を追加します。

<persistence-unit-ref>
<persistence-unit-ref-name>seamhello</persistence-unit-ref-name>
<persistence-unit-name>seamhello</persistence-unit-name>
</persistence-unit-ref>

6.component.xmlでコンテナーが管理しているEntityManagerFactoryを参照できるようにする

WEB-INF配下のcomponent.xmlを以下のように修正します。

   <!-- 
   <persistence:entity-manager-factory name="entityManagerFactory"
                      persistence-unit-name="seamhello"  /> --> ⇒コメントアウト
   <persistence:managed-persistence-context name="entityManager" auto-create="true"
                          entity-manager-factory="#{entityManagerFactory}" 
                          persistence-unit-jndi-name="java:comp/env/seamhello" /> ⇒追加

これでHelloWorldは動作するようになりました。
さらに、EJBを利用する場合は
http://docs.jboss.org/seam/2.1.0.GA/reference/ja-JP/html/glassfish.html
を参考にして、EJB参照やJNDI名の解決方法の修正をしなくてはいけません。結構大変ですが、一度設定してしまえばJBossより軽量で、開発生産性を上げられるかもしれません。JBossToolsはJBoss AS専用というわけではないようです。
なお、別の機会に記事を書きたいと思いますが、Seamを使ったアプリにはクラスローダーリークの問題が潜んでおり、ホット再デプロイを繰り返すとPermGen領域を使いつくしてしまいOutOfMemoryErrorが発生します。開発PCのメモリー要領にもよりますが、メモリーエラーの頻度を下げるには以下のように大きめの値を設定する必要があります。

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