GlassFish Embedded Serverの注意点

この記事は GlassFish Advent Calendar 2014、3 日目です。前日は「失われた GlassFish の未来を求めて」と題して、GlassFish の当初計画にあったものの主に政治的理由によりドロップされた機能について取り上げました今回は GlassFish Embedded Server を使用する上での注意点を 2 つばかり取り上げます。

この記事は 2014 年 2 月に執筆した未公開記事に最新の情報を補足したものとなります。一部記述が執筆当時のままですがご了承ください。

注意点 1 : 最新版はソースからビルドする必要がある

先日 GlassFish 4.0.1 build 4 が公開されましたが、Embedded Server である glassfish-embedded-all および glassfish-embedded-web は含まれていません(インストール済み GlassFish を Embedded モードで動かすための glassfish-embedded-shell と glassfish-embedded-statil-shell は含まれています)。Maven Central リポジトリには 4.0 GA といくつかのプレビュー版はアップロードされていますが、4.0.1 はすべてのビルドについてアップロードされていません。従って、現状では GlassFish のソースからビルドする必要があります。

GlassFish のビルド手順については、以前このブログでも紹介していますが、プレビュー版の場合はフル・ビルドの際になぜか Embedded Server が抜け落ちてしまうことがあります。その場合は、appserver/extras/embedded/all/pom.xml (Web Profile の場合は appserver/extras/embedded/web/pom.xml)で個別にビルドする必要があります。

本来は注意点とすべきではない事柄ですが、GlassFish 4.0 GA は JAX-RS などに致命的なバグを抱えており実用に耐えないため、開発中の Promoted Build である GlassFish 4.0.1 を使わざるを得ない状況にあります。

JAX-RS に関して言えば、Build 3 の段階で致命的なバグを一通り修正した Jersey 2.2 がマージされ、大きな不具合は出なくなっています。

2014-12-03 補足

現在の最新安定版は GlassFish 4.1 GA (GlassFish 4.1 build 13) です。4.1 GA のEmbedded Server は既に Maven Central Repository にて公開されています。開発版 (4.2-SNAPSHOT) についてはビルド済みのものが公開されていないため、ソースからビルドする必要があります。構成管理についてはほぼ同一ですので上記の手順はそのまま利用することができます。

注意点 2 : Embedded Server は Java SE と同じクラスローダーを使う

これは GlassFish に限らずすべての埋め込みサーバについて言えることですが、Embedded Server は、それを起動した Java SE アプリケーションと同じクラスローダーで動作します。GlassFish について言えば、デプロイした WAR も同じクラスローダーで動作しているようです。

これが何を意味しているのかというと...

  • Java SE 側とデプロイした WAR で同じライブラリのバージョン違いを使用している場合など、同じ名前でバージョンの違うクラスが同時に出現して、ややこしいことになる。端的に言うと、動かない。

これにより、GlassFish Embedded Server と Weld SE (Java SE で動作する Weld のサブセット)は併用できない、ということも明らかになります。そもそも GlassFish 側の Weld と Weld SE のバージョンを合わせないと目も当てられない状況になるのですが、バージョンを合わせても、クラスローダーが同じ場合は両者がコンフリクトしてやはり動きません。

例えば WAR 側でインジェクションを行う際に、CDI が実装として Weld でなく Weld SE のモジュールを呼び出してしまった場合には、Weld SE が扱えない @RequestScoped や @SessionScoped をインジェクトしようとしたところで落ちます。Web アプリケーションでは Request のスコープを回避しきれないので、正直お手上げです。

この他にも、GlassFish やそれにデプロイしたアプリケーションに含まれているライブラリと同じものを Java SE 側でも使用する場合には、何らかの問題が発生する可能性があります。それらは基本的にクラスローダーが関連しており、生半可な知識では事象の追跡はほぼ不可能です。

Embedded Server は手軽に使えてとても便利、個人的にもお勧めしているものなのですが、それなりの副作用や落とし穴があることはご承知置きください。

明日は「これだけは知っておきたい asadmin の使い方」と題して、最低限覚えておきたい asadmin のサブコマンドと、最初に asadmin 経由で設定した方がよい事柄についてご紹介します。