[Seasar-user:8347] Re: [S2Struts]コンポーネントが見つかりませんについて教えてください。

suga [E-MAIL ADDRESS DELETED]
2007年 6月 15日 (金) 09:36:40 JST


suga です。

On 6/15/07, 田中 修 <[E-MAIL ADDRESS DELETED]> wrote:
> アプリのWEB-INF/libにjarを置くと
> tomcatの配備処理で、
> OSにWINDOWSを使っているとjarがオブジェクトを掴んだままになり
> jarの削除ができなくなります。
> アプリが完全に削除できずに配備が失敗し
> 中途半端なエイリアスのみが残る状態が発生します。

これは「Windows だから」ではない可能性があります。
アプリケーションまたはフレームワークのいずれかのクラスが jar の中のファイルを
参照している場合、そのクラスがアンロードされる前のタイミングで参照されている
方の jar ファイルを削除しようとして失敗することがあります。
この場合は jar 削除の順番の都合で削除されませんが、Web アプリの undeploy 処理
で正しく解放するようにすれば解決できます。
(ただしフレームワークに手を入れないと解決できない場合もあります)


また、アプリケーションまたはフレームワークの造りによっては、システムクラス
ローダーでロードされたクラスから Web アプリのクラスローダーでロードされた
クラスを参照されることがあり、その場合には Web アプリのクラスローダーが
解放されなくなります。
こうなるとファイルは削除されたとしても、オブジェクトはメモリ上に残り続ける
ことになり、もしこの中のオブジェクトが外部のファイルなどを掴んでいる場合、
そのファイルはアプリケーションサーバを終了するまで手放されないことになります。


> 中途半端なエイリアスを削除するために、
> サーバー止めエイリアスをリモートで削除し起動しなおさなければならない。
> リリースは頻繁に発生しますし、かといってその度にリリースに関係ない他のアプリは止めたくない。
>
> shared/libに置いて動くように、解決方法を見つける必要がありそうです。

正しく undeploy されるようにしたいということが目的であれば、shared/lib に
置いて動くようにすることだけが解決策ではありません。
おそらく前述の問題を調査する方が、shared/lib に置けるようにすることよりも
比較的簡単だと思います。(それでも大変ですが)

shared/lib に置けるようにするには、Seasar 関連に限らず、全ライブラリが
static フィールドにアプリケーション固有の情報を持たないようにする必要が
あります。
これはパフォーマンスのためにキャッシュを static フィールドに持つように
しているライブラリが軒並み使えない、あるいは変更する必要があるため、
ほとんどの場合現実的ではないと思います。


# 手っ取り早いのは Tomcat を複数立ち上げるとか……。

-- 
suga ( [E-MAIL ADDRESS DELETED] )



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