[seasar-dev:415] Re: hotdeployについて

Koichi Kobayashi koichik @ improvement.jp
2006年 6月 4日 (日) 18:00:33 JST


小林 (koichik) です.

Date:    Sun, 04 Jun 2006 16:21:23 +0900
From:    arkw <e1.arkw @ gmail.com>
To:      seasar-dev @ ml.seasar.org
Subject: [seasar-dev:414] hotdeployについて

> 現象として、
> singletonのコンポーネントが、hotdeploy対象のコンポーネントにAutoBindされ
> ません。
> ・singletonのコンポーネントは、app.diconで、定義しています。
> ・hotdeploy対象のコンポーネントは、Autodeployを使って定義しています。

おそらく,singleton のコンポーネントが hotdeploy 対象となる
ルートパッケージ (s2container.dicon で定義してるもの) の
サブパッケージ以下に存在するものと思われます.

そのため,app.dicon に定義したコンポーネントまで
H★O★T Deploy のように扱われているのだと思います.

> 154 if (container.hasComponentDef(propName)) {
> 155 Object value = container.getComponent(propName);
> 156 if (propType.isInstance(value)) {
> 157 setValue(componentDef, propertyDesc, component, value);
> 158 return true;
> 159 }
> 160 }
> 
> この155行目では、ちゃんとコンテナから値を取得しているみたいです。
> この156行目の条件分岐がfalseになってしまいます。
略
> value.getClass()で、取り出せるクラスと、propTypeのクラスが異なるみたいで
> す。

異なったクラスローダーからロードされたクラスは,元になる
class ファイルが同一でも全く別物のクラスとして扱われます.
そのため,それらの間での代入は不可能です.

これを回避するには,H★O★T Deploy 非対象のコンポーネントは,
H★O★T Deploy のルートパッケージ以下に配置しないように
パッケージ構成を変更してください.

同じように dicon に記述してあっても,DataSource などで
問題が起きないのはそれらがルートパッケージ以下にないためです.

プロジェクト標準などでパッケージ構成を自由に変更することが
難しい場合もあるかと思うので,ルートパッケージ以下にあっても
H★O★T Deploy の対象とならないパッケージを指定できるように
した方がいいかもしれませんね.


-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>koichik @ improvement.jp</e-mail>
</signature>



Seasar-dev メーリングリストの案内