ソフトウェア開発において、コンパイル、ビルド、テストのサイクルは、開発者の生産性を大きく左右するものである。開発者がアプリケーションの再コンパイル、再ビルド、デプロイをしなければならないときに、サーバを再起動しなければならず、開発作業がスローダウンしてしまう。
動的なスクリプト言語を使用するような、Webアプリケーションのプラットフォームの場合は特に、開発者がアプリケーション(ソースコード、テンプレート、設定など)を修正した時に、その結果を即座に見ることができる。
このような機能は、自動リロード機能、インクリメンタルなホット・デプロイなどと呼ばれている。プラットフォームやフレームワークが、この種の機能をサポートするということは、開発者が、Webアプリケーションの開発や保守をスムーズに行うことができるという点でインパクトのあるものと言える。
Javaの自動リロード機能
ほとんどのJavaのWebフレームワークが、自動リロード機能をなんらかの形でサポートしており、大抵の場合、ページテンプレート言語からサポートを始めている。例えば、JSPファイルが変更されると、アプリケーションサーバがそれを検知し再表示することができる。
Webアプリケーションのサイズが大きくなるにつれて、ほとんどの場合、サーバの再起動時間も長くなる。自動リロードに関しては、特にRuby on Railsと比較すると、多くの時間を要し、多くの制限があることが多い。
ここ最近、いくつかのJavaのWebフレームワークにおいて、自動リロードの機能が強化されたと発表されている。InfoQでは、ちょうど良い機会であるとして、有名なJavaのWebフレームワークのいくつかをキャッチアップし、その結果をまとめた。
Grails
Grailsは、いくつかの制限付きで自動リロードをサポートしている。
Grailsのアーティファクト(コントローラクラス、タグリブクラス、サービスクラス等)は、リロード可能ですが、いくつかの例外もあります。
- サービスクラスは、'transactional'プロパティーが、falseの時のみリロードされます。
- ドメインクラスは、実行時にデータベースに再マップされます。但し、データソースにデータベース自動生成を設定('dbCreate'プロパティーの値に'update'に設定する)した場合、データソースの場合は可能な限りデータベースをアップデートします。この処理は常にスムーズに動作するわけではない上に、ドメインクラスを変更した時に、アプリケーションの再起動が必要な場合もあります。
Seam
Seam 1.2.1では、"incremental hot-deployment"と呼ばれる機能が取り込まれている。
但し、Seamの場合、JavaBeanコンポーネント限定のサポートとなります。entity beanは、未対応です。さらに、EJB3コンポーネントについても同様です。EJB3コンポーネントに対するサポートも予定していますが、JavaOne以降の対応になると思われます。
Spring MVC & Web Flow
Spring 2.0.4では、Spring MVC dispatcherがリロード可能になる。Springでは動的言語サポートとして、コントローラとバリデータをBeanShellとGroovyで記述できるようにし、アプリケーションの再起動無しでリフレッシュされる。
Spring Web Flowは、Spring MVC、Struts1と2、JSFで使用可能であり、Webアプリケーションのナビゲーションと状態管理に使用することができる。Spring 2.0.4では、サーバの再起動なしにフローの再ビルドが可能となる。
このことに加えて、Keith Donald氏は、Spring Web FlowにおけるSpring IDE 2.0のサポートについて次のように語っている。
Spring IDE 2.0を使用することで、ナビゲーションのロジックを視覚的に(ドラック&ドロップで)変更することができます。そして、これらの変更をコンテナの再起動なしに行います。フローの定義を保存する必要すらありません(ツールが変わりにやってくれます)。
Struts 2
Struts 2では、変更された際のアクションがリロードされる。但し、Patrick Lightbody氏は、次のように警告している。
最終的には、オブジェクトのチェーン(例えば、ステートフルアクションからステートレスなSpringサービスへのチェーン)が複雑になる場合、何がリロードできて、何ができないかを知ることが難しくなるという問題があります。
Tapestry 5
Tapestry4では、開発モードでHTMLテンプレートとページのプロパティのリロードをサポートした。一方、Tapestry5では、クラスとテンプレートのリロードに大きなサポートを加えている。
他のフレームワークと同様に、いくつかの制限事項がある。
- 現時点で、自動リロードは、JARファイルのリソースに対してサポートしていません
- クラスローダを使用したリロードとなるので、リロードしていないクラスを操作するとClassCastExceptionsが発生します
- リロードしたクラスを参照したままにしておくと、メモリリークの可能性があります