OSGiベースのWebモジュールへの移行

ではこのWARファイルをOSGiベースのWebモジュールへと変更し、SSAPで実行してみよう。そのために最低限知っておいた方が良い知識は以下の通りだ。

  • 拡張子は「.jar」となる
  • JARファイルではあるが、内部のディレクトリ構造はWAR形式で良い(WEB-INFディレクトリ以下に様々なファイルを持てる)
  • 依存関係は全てOSGiに準拠した形式(META-INF/MANIFEST.MFのヘッダで指定)により管理する。WEB-INF/libディレクトリにJARファイルを格納することはしない
  • web.xmlに記述する情報の多くを、MANIFEST.MFに指定する
  • Webモジュールならではの追加情報をMANIFEST.MFに記述する(後述)

つまり、SSAPにおけるWebモジュールとは、「依存関係や各種の設定をMANIFEST.MFで管理する、WARのディレクトリ構造に乗っ取ったJARファイル」だと言えよう。

以上のことを踏まえて、先のサンプルをWebモジュールへと変換すると、以下のようなファイル構造となる。

hello.jar/
  hello.jsp
  META-INF/
    MANIFEST.MF
  WEB-INF/

web.xmlが不要になったことと、拡張子がjarになったのはすぐわかるだろう。肝心なのはMANIFEST.MFである。その内容は以下の通りだ。

Manifest-Version: 1.0
Bundle-Name: HelloWebBundle Bundle
Bundle-SymbolicName: HelloWebBundle
Bundle-Version: 1.0.0
Import-Library: org.springframework.spring;version="[2.5.4,3.0.0)"
Platform-ModuleType: Web
Web-ContextPath: helloWebModule
Web-WelcomeFiles: hello.jsp

Bundle-Name、Budle-SymbolicName、Bundle-VersionはOSGi仕様で定義されているヘッダであり、それぞれ「名称」「シンボル名(バンドルを一意に定義する文字列)」「バージョン」となっている。

次のImport-Libraryでは、Springフレームワークのパッケージを一括してインポートしている。バージョンの範囲は「2.5.4以上、3.0.0未満」となる。

SSAPのWebモジュールは、最低でも「Platform-ModuleType: Web」(モジュールタイプがWebであることを表す)というヘッダが必要だ。モジュールタイプというのは、SSAPが扱えるアーカイブの種類のことを表す(現状Web以外はサポートされていないが、将来的にはバッチやWebサービスなどもサポートする)。

また、Web-ContextPathヘッダによるコンテキストパスの設定、Web-WelcomeFilesヘッダによるウェルカムファイルの指定を行っていることなどにも注意したい。

このJARファイルを、先ほどのWARと同様に「SSAPのルートディレクトリ/pickup」にコピーすれば自動的にデプロイが行われ、MANIFEST.MFで指定したコンテキストパスでアクセスすることができる(http://localhost:8080/helloWebModule)。