CoolDeployに失敗する件

デプロイモードをHotDeployからCoolDeployにしたら、DIコンテナの初期化に失敗する。とりあえず解決しているが、なんだか変なことをしている気がして落ち着かない。

問題

今作っているアプリケーションではコンポーネントの自動登録を行っているのだが、そこで落ちる。

org.seasar.framework.beans.IllegalPropertyRuntimeException: [ESSR0059]クラス(org.seasar.framework.container.autoregister.ComponentAutoRegister)のプロパティ(customizer)の設定に失敗しました。理由はorg.seasar.framework.container.TooManyRegistrationRuntimeException: [ESSR0045]interface org.seasar.framework.container.ComponentCustomizerに複数のコンポーネント(org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain, org.seasar.framework.container.customizer.CustomizerChain)が登録されています

カスタマイザがたくさんあって、どれを使っていいかわからないらしい。

customizer.diconは空っぽなのだが、そこからincludeしているdefault-customizer.diconでいくつかカスタマイザが登録されている。複数のカスタマイザを登録しているのだから、どれを使ってよいものやら、となるわけである。しかし、それならなぜHotDeployでは問題無く初期化できるのだろうか。

同様の問題については、メーリングリストのログに一つだけ触れているものがあった。

[Seasar-user:14040] [teeda] JarファイルのDaoを自動登録しようとしているのですがうまく行きません

しかし、別のやり方が提示されて解決になっており、根本的な原因については触れられていない。

一番核心に迫っているのは、これだろうか。

[Seasar-user:9026] Re: CoolDeploy 時に登録されないコンポーネント

このログによると、そもそもエラーになるべきところがHotDeployだとならないケースがある、ということらしい。うーむ。

とりあえず解決編

で、どうやって解決したかというと、空っぽだったcustomizer.diconに、カスタマイザを追加したのである。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
  <include path="default-customizer.dicon"/>
  
  <!-- コレを足した。名前はデフォルトカスタマイザのものを適当に。 -->
  <component name="serviceCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"/>
</components>

これで初期化できるようになる。ただ、これだとカスタマイザを複数登録した場合に問題が再発する。

または、ComponentAutoRegisterのcustomizerプロパティに適当なカスタマイザ、ないしnullを渡してもいい。

  <component class="org.seasar.framework.container.autoregister.ComponentAutoRegister">
    <property name="customizer">null</property>
    <property name="instanceDef">
      @org.seasar.framework.container.deployer.InstanceDefFactory@OUTER
    </property>

とにかく、どのカスタマイザを使うのか明確にしてやればよいわけだ。

しかし、これはなんかトリッキーな対処っぽいなぁ。SMART Deployを使う場合は自動登録はcreatorにでも任せて自分ではやるなということだろうか。それだとcreatorやらcustomizerやらを自作することになって面倒なのだが。よくわからん。