実行可能WARファイルの作り方

HudsonのWARはサーブレットコンテナに配備して動作するが、次のようにすることで単体で動作させることも可能になっている。

java -jar hudson.war

一体どういう風にしてこのようなことを実現しているのだろうと思い調べてみた。

結果:

  • 軽量サーブレットコンテナであるwinstoneのJARファイルが同梱されている
  • WARは実行可能JARファイルになっている(WARもJARの一種なので)
  • 実行されるとMainクラスのmainメソッドが呼び出され、次の処理が行なわれる
    • winstone.jarをファイルシステムにコピー
    • コピーしたwinstone.jarからURLクラスローダを構築
    • 構築したクラスローダからwinstoneのランチャメソッドを探索
    • 引数として「--warfile=自分自身」をつけてランチャメソッドを起動

同じことを自作アプリのWARでやるのも簡単そう。HudsonのMainクラスと同じような処理をするMainクラスを自作し、hudson.warを作るのと同じ方法でパッケージングしてやればよい。パッケージングの方法はHudsonのpom.xmlを参考にすれば簡単。

というわけで、Ymirのアプリケーションスケルトンでも簡単に実行可能WARが生成できるようにpom.xmlを整備する予定。T2でもやるかも。