Seamアプリ+JBoss AS 5.1で自動再デプロイが繰り返される
Seamに付属しているDVDStoreというアプリケーションをJBoss AS 5.1.0にexploded形式でデプロイしたところ、アプリケーションの起動直後から勝手に再デプロイが繰り返されるという問題が発生しました。earファイルやwarファイルを作ってデプロイする方式では発生しないのですが、これではホットデプロイができず、生産性に問題ありです。
調査したところ、皆さんいろいろ苦労されているようですが、基本的にJBoss ASが展開形式でデプロイを行う際に更新を認識するしくみにバグがあるようで、今のところ根本的な解決策はないようです。
http://seamframework.org/Community/InfiniteLoopOfRedeploymentsJBoss5xOfProjectFromSeamgen
http://community.jboss.org/message/562096
JBoss AS 5.1は当然Seamともっとも相性がよいはずと思っていたのですが、かなり残念なバグです。 (なお、ANTやmavenを使った展開形式のデプロイで問題が起こるので、JBossToolsからのデプロイでは同様の問題が再現するかとうか今のところ未検証)その後、ANTベースのseam-genアプリやexamplesフォルダー配下のアプリだけでなくJBossToolsからデプロイするアプリでも同様の無限再デプロイ現象が発生することが確認されました。
問題が発生するトリガーは今ひとつはっきりとしないのですが、pages.xmlを編集した後に、デプロイ先のフォルダーの中に.pages.xml.spdiaというファイルが生成されると確実に発生するようです。問題が発生したら、とりあえず.pages.xml.spdiaを削除すると一旦収まりますが、またすぐに再発します。上記のスレッドを参考にして、今のところのところ、とり得る最良のワークアラウンドは以下の通りです。
- 修正箇所1
[サーバーフォルダー]\conf\bootstrap\profile.xml]
を編集して以下のように修正する。
<!-- The default deployment repository factory --> <!-- <bean name="DefaultDeploymentRepositoryFactory" class="org.jboss.system.server.profileservice.repository.DefaultDeploymentRepositoryFactory"> <property name="deploymentFilter"><inject bean="DeploymentFilter" /></property> <property name="checker"><inject bean="StructureModificationChecker" /></property> </bean>--> <bean name="DefaultDeploymentRepositoryFactory" class="org.jboss.system.server.profileservice.repository.DefaultDeploymentRepositoryFactory"> <property name="deploymentFilter"><inject bean="DeploymentFilter" /></property> <property name="checker"><inject bean="MetaDataStructureModificationChecker" /></property> </bean>
- 修正箇所2
[サーバーフォルダー]\deployers\seam.deployer\META-INF\seam-deployers-jboss-beans.xml
を編集して、以下の行をコメントアウトする。
<bean name="SeamMTMatcher" class="org.jboss.seam.integration.microcontainer.deployers.SeamTempModificationTypeMatcher"/>
修正の意味がまったくわかっていないので、どんな副作用があるのか見当がつかないのですが、この修正でデプロイの無限ループ問題は回避できるようです。(少なくとも、この対応をするとサーバを起動したままwar全体を再公開できなくなるようなので、全体を再デプロイしたい場合は、サーバを再起動するか、一旦モジュールをアンデプロイしてから再びデプロイするという操作が必要になります。ホット再デプロイはメモリーリークの問題もあるため、一応許容範囲だと思います。)
開発環境としてはJBoss AS 4.2.3かJBoss6.0.xのプレビュー版を使うということを考えるべきでしょうか?ただし、JBoss4はJava EE5完全準拠ではないし、JBoss6はJavaEE 6準拠ということで、Seamの最新CR版を使うなどしないと動作しません。あるいは、開発環境としては、Tomcat+埋め込みJBossかGlassfishなどを使うという方がベターでしょうか。
Seamは設計思想というか、マニュアルや書籍を読んだ限り理論上は非常に優れたフレームワークだと思うのですが、開発ツールの品質や複雑さで実装する作業まで含めて考えると問題が多いようで、ノウハウの無い状態でプロジェクトに導入する際には注意が必要だと感じました。