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
を参考にして、Glassfishでlog4jが使えるようにします。要するに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