Tech Sketch Bucket of Technical Chips by TIS Inc.

SAStrutsをJBossAS7で動かそう(体験談)

Pocket

techsketch-banner-OSS+startingblock(700x65).jpg

JBossAS7でのアプリケーション開発

JBossのアプリケーションサーバ JBossAS7 は、RedHat社による商用サポート版の JBossEAP6 (バージョン番号は異なっていますがAS7に基づいています)もリリースされ、使用できる機運が高まってます。以前、 新しくなったJBossASを使ってみよう で運用管理面を中心にJBossAS7の技術紹介を行いましたが、今回はアプリケーションの稼働に着目して紹介します。

JBossAS7でアプリケーションを新規開発するならば、フレームワークとしてJavaEE6を採用するのが自然です。JavaEE6のサンプルとしては、従来はJBossAS7のダウンロードサイトにQuickstartsがありましたが、現在は JBoss Developer Framework として独立しています(内容はJavaEE6の技術紹介になるので割愛します)。

一方、既存のアプリケーションサーバを保守切れ等でJBossAS7に切り替える場合、稼働させていたアプリケーションがJBossAS7に移植できるかが大きな課題となります。以下、フレームワークとして SAStruts を対象にJBossAS7へ移植できるかを確認していきます。


何はさておきそのままデプロイすると

JBossAS5.1.0で稼働させていたSAstrutsのサンプルアプリケーション Super Agile Strutsチュートリアル を、 JBossAS7.1.1.Final にそのまま移植できるかを確認します。
なお、JBossAS5.1.0でSAStrutsを稼働させるために、チュートリアルのWARファイルからはgeronimoのライブラリを削除しています。
JBossAS7にWARファイルを展開型でデプロイしますと、ワーニングはいろいろ出ますが、デプロイは正常に完了します。ところが、ブラウザからアクセスすると404のエラーになります。デプロイ時のワーニングを確認しますと、

のように、何かが見つからなかったため404が発生したと見られます。

何が原因なの?

Seasar2がJBossAS5に対応した時の情報 http://ml.seasar.org/archives/seasar-user/2009-February/016880.html を参考にします。Seasar2のソースファイルの"org.seasar.framework.util.ResourcesUtil"のコメントを見ますと、

のように、Seasar2内でJBossAS5独自のプロトコル(vfsfile,vfszip)を取り扱っています。実際にJBossAS5でResourcesUtilの動きを確認しますと、WARファイルのデプロイ方法により、

展開型では

vfsfile:/opt/jboss-5.1.0.GA/server/default/deploy/sa.war/WEB-INF/classes/tutorial/

vfszip:/opt/jboss-5.1.0.GA/server/default/deploy/sa.war/WEB-INF/lib/s2-tiger-2.4.44.jar/

WAR型では

vfszip:/opt/jboss-5.1.0.GA/server/default/deploy/sa.war/WEB-INF/classes/tutorial/

vfszip:/opt/jboss-5.1.0.GA/server/default/deploy/sa.war/WEB-INF/lib/s2-tiger-2.4.44.jar/

のようなurlを取り扱っています("/opt/jboss-5.1.0.GA"がJBossAS5のインストールディレクトリ、"sa.war"がチュートリアルのWARファイルです)。

JBossAS7では、デプロイ時のワーニングメッセージより、JBossAS5とは異なり vfs というプロトコルが引き渡されていると見られ、ResourcesUtilでこれへの対応が行われていないため、404の結果になったと見られます。

どんな対策をとればよいのでしょうか?

JBossAS7で、ResourcesUtilに引き渡されるurlを確認します。WARファイルを展開型でデプロイした場合は

vfs:/opt/jboss-as-7.1.1.Final/standalone/deployments/sa.war/WEB-INF/classes/tutorial/

vfs:/opt/jboss-as-7.1.1.Final/standalone/deployments/sa.war/WEB-INF/lib/s2-tiger-2.4.44.jar/

のようなurlになります("/opt/jboss-as-7.1.1.Final"がJBossAS7のインストールディレクトリ、"sa.war"がチュートリアルのWARファイルです)。
そこで、ResourcesUtilでプロトコル vfs を取り扱うため、プロトコル file の所を習い、プロトコル vfsFileSystemResources で処理させます。

これを、コマンド"mvn -Dmaven.test.skip=true package"でコンパイルします。すると

などのエラーが発生します。これは、コンパイル時にJDK6を用いたためで、Seasar2のコンパイルはJDK5が前提です(MockResultSetはインターフェース定義java.sql.ResultSetを実装しますが、メソッドupdateNClob()などはJDK6からの機能なので)。そこでSeasar2をJDK5でコンパイルし、SAStrutsのチュートリアルのWARファイル内の s2-framework-2.4.44.jar を作成されたjarに置き換えます。
この新たなWARファイルを展開型でデプロイすると先ほどのワーニングは解消され、ブラウザからアクセスしても404は出ずチュートリアルが正常稼働します。

DBアクセスも確認しよう

次にもう少し複雑なサンプルとして、S2JDBCの動作確認を行います。これには、Super Agile StrutsチュートリアルでS2JDBCのサンプルを含んだ、 http://sastruts.seasar.org/download/2008-08-15/sa-struts-tutorial-1.0.4.zip を用います(SPが出る前の最初のものです)。このWARファイル内のSeasar2,SAStrutsのライブラリは、先ほどのSAStrutsのSP9のチュートリアルに合わせます。

デプロイを行いますと次のエラーが出て、チュートリアルのS2JDBCの機能のみ稼働しません。

暫定の対応としては、WARファイル内のライブラリの s2-tiger.jar を"WEB-INF/classes"に展開し、jarを削除すれば、デプロイ時のエラーは解消され、S2JDBCの機能も稼働します。
これでは汎用性が欠けますので、ResourcesUtilでvfsのプロトコルでjarファイルが引き渡された場合の対応が必要です。これには次のように、urlが .jar/ で終わる場合は JarFileResources を用いるようにします。

これにより、ライブラリs2-tiger.jarがそのままでも、S2JDBCの機能が正常稼働します。

WAR型で確認すると

SAStrutsのチュートリアルをWARファイルを展開型でデプロイした場合は正常稼働することが確認できましたので、次にWAR型でデプロイした場合を確認します。
デプロイを行うと、ResourcesUtilで次のエラーが発生します。

ResourcesUtilに引き渡されるurlを確認すると、次のように実際のファイルシステム上のパスではないことが分かります。

vfs:/content/sa.war/WEB-INF/classes/tutorial/

vfs:/content/sa.war/WEB-INF/lib/s2-tiger-2.4.44.jar/

従って、urlが vfs:/content/ で始まる場合は、それを実際のファイルシステム上のパスに変換する必要があります。この処理はurlからVFSを求めることで可能で、コードを抜粋します。

これにより、urlが"vfs:/content/sa.war/WEB-INF/classes/tutorial/"の場合は、fnameに"/opt/jboss-as-7.1.1.Final/standalone/tmp/vfs/temp9061d1391d501ff0/sa.war-fc93187cd19118b4/WEB-INF/classes/tutorial/"のようなJBossAS内でVFSが展開されているパスが取得できます。

この処理をResourcesUtilに組み込めばWAR型でのデプロイも可能となります。

注意点:
コンパイルのためには、pom.xmlに次の jboss-vfs の追加を行います。ところがこのライブラリはJDK6で作成されているため、この対応部分だけはJDK6でコンパイルする必要があります。

最後に

以上のように、SAStrutsをそのままJBossAS7で稼働させることはできませんが、Seasar2内のResourcesUtilに手を加えることで対応可能な模様であることが確認できました(本検証はSeasar2のResourcesUtilの役割およびJBossASのVFSの構造を理解せずに場当たりに対応したもので、動作保証をするものではありません)。

なお、本対応だけでOKという訳ではなく、まだ

というワーニングが出力され、SAStrutsの利点であるホットデプロイが機能してないと思われます。本番環境ではホットデプロイは使わないからこれへの対応は不要と割り切るか、JBossAS7のクラスローダ(前バージョンまでの階層型クラスローダーとは異なりモジュール型というのが新たに採用されています)とSAStrutsのホットデプロイの関連を調査し対応することが課題として残っています。

エンジニア採用中!私たちと一緒に働いてみませんか?