yojikのlog

yojikのブログです

Winstone + Embeddable EJB

id:winebarrelさんの所で紹介されていたWinstone Servlet Containerがシンプルで面白い。java -jar winstone-0.8.1.jar --warfile といったコマンド一発でServletコンテナ(+Webサーバ)をアプリ感覚で起動できる*1Clickのサンプルなんかも、こんな感じで動かせるし。Webフレームワークを配布するときは、これ込みで配布して欲しいかんじ。
そこで思いついたのは、Embeddable EJBWinstoneを組み合わせれば、最小のJ2EEサーバが出来るかもという事。実際やってみたら、さっくり成功した。

  • JBoss Embeddable EJB(以下E-EJB)をダウンロードしてくる。*2
  • 解凍して、docs/embedded-tutorial/embedded-warに移動
  • winstone-0.8.1.jarをそのディレクトリに配置(ちなみにliteバージョンでは動かない)
  • toollib(とか適当なディレクトリ)を作成して、以下のファイルを並べる(JSPエンジンを内蔵してないため、Tomcatあたりからもってくる)
    • ant.jar (なぜか必要)
    • commons-el.jar
    • commons-logging-api.jar
    • jasper-compiler.jar
    • jasper-runtime.jar
  • src/EmbeddedEJB3.jsp内のEJBをルックアップしているコードを書き換える。これはE-EJBのバグ修正でWinstoneとは関係無い。

InitialContext ctx = getInitialContext();
CustomerDAOLocal local = (CustomerDAOLocal) ctx.lookup("CustomerDAOBean/local");
CustomerDAORemote remote = (CustomerDAORemote) ctx.lookup("CustomerDAOBean/remote");

  • ant war にてビルド(当該ディレクトリにあるbuild.xml)
  • 起動して実行

java -jar winstone.jar --commonLibFolder=toollib --useJasper=true --warfile=build/standalone.war --javaHome="%JAVA_HOME%" --debug=9

  • あとは普通にアクセス

http://localhost:8080/EmbeddedEJB3.jsp

WinestoneはArgs over Configurationという感じで設定周りはほとんど引数で表現する。だから単体ではデータソースの設定等が面倒だけど、この構成だとE-EJB側で面倒を見てくれるので楽チン。ちょっとしたJPAのサンプルを作る時に便利そう(いつだ)。
ちなみに合計サイズは14MBぐらいだった。実際はE-EJBがほとんどを占めているんだけど。

*1:JSPを動かすときはちょっと追加手順が必要

*2:http://www.jboss.org/products/list/downloads