クラスローダのアーキテクチャに問題はあるか

JBossのクラスローダアーキテクチャは,良くある階層型クラスローダではなく,フラットな統一型(Unified)クラスローダである.JBossサーバ起動時にロードされたライブラリも,デプロイした各アプリケーションモジュールも(ear/war/*-ejb.jar),それに含まれるライブラリも,全て同じクラスローダによってロードされる(正確にはクラスローダのレポジトリが共有される).

恥ずかしながら何故JBoss,Incがこのアーキテクチャを採用しているのかについては,まだ僕は理解できていない.なのでUnifiedクラスローダの利点がほんとのところどこにあるのかも,良く分かっていない.

ただ一点分かっているのは,一つのクラスローダ内に同じ完全修飾名を持つクラスは存在できない(ロードできない)ので,Unifiedクラスローダを使っている場合には,複数のEARファイル内とかに同じライブラリ(例えばCommons-Digester)とかをいれていると,デプロイ時にエラーとなることだ.この場合,先にデプロイした方が勝ち,後からデプロイしようとした方が負けとなる.これはちょっと不便だ.

しかしそもそも,同じライブラリをいくつもJVMのメソッドエリアに配置するなんて良くない,リソースの無駄遣いだ,という見方もあるわけなので,この点に言及してUnifiedクラスローダがダメだという話にすることは一概にはできない.(そもそもJBoss,Incが*敢えて*Unifiedクラスローダなんてマイナーなアーキテクチャを採用したのには強い理由とメリットがあるはずなんだが,相変わらず僕にはまだ分からず→ループ)

とはいうものの,あるライブラリに対してアプリケーションごと異なるバージョンのものを使用したいだとか,アプリケーションに現行バージョンと移行予定バージョンといった複数のバージョンがある場合などには,これは間違いなく問題となる.

といったところまで以前考えていたのだけれども,AdminDevel_323.pdfを読んでいたら解決した.まあ"org.jboss.mx.loading"パッケージを眺めていたときにちょっと気づいてはいたのだけど,JBossには実は階層型クラスローダも実装されている(正確には非共有型のレポジトリの使用が可能)

ということで,全然問題無し.非共有型(階層型)のレポジトリを使うように指定するには,META-INFフォルダのjboss-app.xmlにちょろちょろっと書け,と.

とりあえず,そんなところ.

参考:AdminDevel_323.pdf ページ72

                                                                                                                                                    • -

[続き]

早とちりとはこういうことを言うのですな,という感じです.もうちょいAdminDevelを読み進めると,JBoss,Inc側の見解が書いてあります.

現行のJBossのクラスローダアーキテクチャの長所と短所(意訳)

長所

  • ほとんど標準的に使用するライブラリなのに各アプリケーションごとにロードしなければならないといった事態を回避できる
  • これにより各アプリケーションをまたがるような様々な機能を開発できるようになる

短所

  • デプロイの際にクラスの競合が起きないように手筈を整える必要がある
  • 同じクラスで異なるバージョンのものを使用したいときには非共有型のレポジトリを使用するように指定する必要がある

例えば階層型クラスローダアーキテクチャを採用しているプロダクトであっても,各アプリケーションをまたがるような機能あるいはライブラリはしかるべき場所に置いてあげる(共有ライブラリ用のcommonフォルダみたいな感じのところ)という方法で実現できなくはない.

一方JBossも非共有型のレポジトリがあるわけだから,どっちのアーキテクチャならできる/できないといった大きな違いは無いと言って良いだろう.各アプリケーションをまたがるような機能というのが結構多い場合はUnifiedクラスローダでないと厳しいだろう(JBossの場合,マイクロカーネルアーキテクチャを採っていることにより各種サービスもデプロイの対象となる.そのためユーザが意識的にそういったアプリを作らなくとも,無意識にそのサービスの利用を通じてUnifiedクラスローダの恩恵に授かっている面はある.もしかしたらマイクロカーネルアーキテクチャを採用したことに事を発してUnifiedクラスローダアーキテクチャを設計したのかもしれないですね.).

まあとりあえずは納得いくところまで分かったので,ささ,次へ次へということで.

参考:AdminDevel_323.pdf ページ75