Tuesday, May 6, 2014

spring-bootと組み込みTomcatが便利すぎて鼻血でそう

Tomcat embeded - 組み込み型Tomcat - が正式にサポートされたのは2011年5月のTomcat7.0.14の前後あたりのようです。もう3年も前です。 一方で2014年4月、Spring frameworkはSpring Boot 1.0.0を正式にリリースしました。

この二つのニュースを別個に見ると「ふーん」としか思えません。時間軸もズレすぎですし。 しかし、最近、某所でSpring-Bootとtomcat-embededを組み合わせて使ってみたら、便利すぎて鼻血出そうになりました。

便利さがうまく伝わるかどうかわかりませんが、せめてメンテついでにMixer2のサンプルアプリで使ってみるか、と思いまして、 mixer2-fruitshop-springbootを作りました。 動かし方はこちらのページとほぼ同じ。

SpringFrameworkと組み込み型Servletコンテナをうまいこと組み合わせてくれる、という機能はspring-bootの数多くの機能のうちのひとつにすぎませんが、 とにかくここでは組み込みTomcatとの連携機能の話だけにします。

とりあえずmixer2-fruitshop-springbootをざっくりご覧いただきつつ ポイントを挙げます。

  • src/main/webapp/WEB-INF/web.xml のようなフォルダやxml設定ファイルはもはや存在しません。こうした旧来型のWebアプリケーションとしての構造は分業開発の妨げになりやすいのですが、これは普通の単純なjavaライブラリとまったく同じ構造です。もちろんこれは、Servlet3.0準拠であることや、あるいは、ビューエンジンとしてjspではなくMixer2を使っているおかげでビューのテンプレートをwebappとかWEB-INFとかそういうところに置く必要が無い、ということによる効果でもあります。
  • pom.xmlのbuildタグ周辺を見てください。実質的にはmaven-jar-pluginとmaven-dependency-pluginが使われているだけです。特別なビルド方式は必要ありません。spring-bootにはmaven用のプラグインもあれこれ用意されているのですが、ビルド方式までもが特定のフレームワーク提供のプラグインに縛られるのは個人的には好みではないのでこの方法を採用しました。これにあとmaven-assembly-pluginを追加して、アプリ本体のjarとlibフォルダ配下に集められるjarをまとめてzip化するようなセッティングをすれば、リリース成果物の生成も簡単です。
  • pom.xmlのpackaging指定はwarではなくjarです。このwebアプリケーションはmvn packageするとjarファイルになります。いわゆるfat-jarではなく純粋なjarです。tomcat-embeded-x.y.z.jar等の組み込みtomcatライブラリの助けを得ながらwebアプリケーションとして起動します。コマンドラインで言えば java -jar mixer2-fruitshop-springboot-1.0-SNAPSHOT.jar -classpath "lib/*" で起動できます。
  • サンプルアプリではServerクラスにmain()メソッドを置いてあります。eclipse等での開発作業中はこのserverクラスを通常のjavaアプリとして起動し、ブラウザで8080ポートを見て動作確認をします。繰り返しますがwebアプリではあるものの構造上は単なるjavaアプリなので、eclipseでWTPのようなプラグインは必要ありません。tomcatも別途用意する必要がありません。だって組み込みtomcatだから。ただのjavaアプリだから。
  • tomcatのcontext.xmlやwebアプリとしてのWEB-INF/web.xmlにあたるものは全てjavaコードとして記述します。サンプルアプリではMvcConfigurationSessionTrackingConfigListenerにあたります。もちろんここのコード上で設定されている値はspringの種々の機能を使えば、他の設定ファイルやコマンドライン引数等で外側から上書きすることが可能となります。Springのprofile機能も使いこなせるでしょう。

こんな話だけでは便利さが伝わらないかもしれません。とにかくこれはちょっとしたパラダイムシフトですね。 これからは、「tomcatを用意してそこにSpringMVCによるwebアプリケーション(*.warファイル)をdeployする」のではなくて、 「webアプリケーションとtomcatをSpringFramework上で起動する」という感覚になります。もう、webアプリとtomcatを別々に用意する必要はないのです。これらは、ひとつです。

No comments:

Post a Comment