BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JavaのWebフレームワークが自動リロードのサポートを強化

JavaのWebフレームワークが自動リロードのサポートを強化

ソフトウェア開発において、コンパイル、ビルド、テストのサイクルは、開発者の生産性を大きく左右するものである。開発者がアプリケーションの再コンパイル、再ビルド、デプロイをしなければならないときに、サーバを再起動しなければならず、開発作業がスローダウンしてしまう。

動的なスクリプト言語を使用するような、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が発生します
  • リロードしたクラスを参照したままにしておくと、メモリリークの可能性があります
(原文は2007年4月25日にリリースされた記事です)

この記事に星をつける

おすすめ度
スタイル

BT