JBoss における VFS
VFS というと Virtual File System の略であって、Google 検索するとおそらく Linux だとかの仮想ファイルシステムの話が上位にくるんだと思いますが、JBoss にも同様の仮想ファイルシステムたる VFS が存在しています。 最近この JBoss の VFS 関連でトラブることが多かったので、VFS とはそもそも何ぞやという天について調べてみました。
参考文献
VFS 以前の問題
JBoss のコミュニティが抱えていた問題は、ソースツリーのそこかしこにリソースハンドリングの処理が散在していたことのようです。 JBoss の中の人、Ales Justin が以下のように書いています。
Here, at JBoss, we saw that a lot of similar resource handling code was scattered/duplicated all over the place.
(A Look Inside JBoss Microcontainer, Part 3 - the Virtual File System)
特に Windows だと hot-deploy 時の削除等の際に、OS としてのファイルロッキングの問題も絡んでくるので、リソースハンドリングは一箇所に集めないともはや制御できなくなる、というようなことが同エントリに記述されています。 また、Java のアプリケーションサーバの場合、ファイルやディレクトリだけでなく、jar/war/ear 等、ファイルがパッケージングされたファイルも絡んでくるため、それを統一的に扱いたい (Visitor パターンで扱えるようにしたい) というような目的意識で導入されているようです。
VFS
VFS という名前、および、API 仕様からも分かるように、JDK によるファイル等のリソースの扱いに対し、別の抽象化レイヤを切る形になっています。 JBoss は各種ファイルをこの抽象化レイヤを通してアクセスすることで、Visitor パターンで各種ファイルを統一的に扱うことができるようになっている (はず)。
もちろん、こういった抽象化レイヤの途中からの導入というのは諸刃の剣であり、それは JBoss のコミュニティも当然予想していたようです。 VFS は file:// と同じように vfsfile や vfszip 等の URL を別途定義しており、これに対応していないフレームワークは何らかのワークアラウンドが必要になります。今回はぼくたちもこの事象にハマってしまったわけで。