AppFuse を使用する 7 つの簡単な理由

Java オープン・ソース・ツールを学んで作業効率を向上させる

Spring、Hibernate、あるいは MySQL などの Java™ プラットフォームを対象としたオープン・ソース・ツールを使い始めるのは難しい場合があります。Antや Maven、DWR を使った Ajax、そして Web フレームワーク (例えば JSF) を投入してみてください、アプリケーションを構成するだけで手一杯になってしまうことでしょう。そんなオープン・ソース・プロジェクトの統合につきものの悩みの種を取り除いてくれるのが、AppFuseです。AppFuse はまた、最上の機能のテストを行い、データベース・テーブルからUI 全体を生成することを可能にし、そして XFire での Web サービスをサポートします。その上、AppFuseのコミュニティーは健全で、さまざまな Web フレームワークのユーザーが実際に協調している数少ない場所でもあります。

Matt Raible (mraible@virtuas.com), Open Source Practice Leader, Virtuas Open Source Solutions

Matt RaibleMatt Raible はコロラド州デンバー在住で、ここでは Virtuas Open Source Solutions の Spring および Web フレームワーク実践の先導者です。ユーザーおよび開発者として、オープン・ソースにおける幅広い経験と専門知識を持つ彼は、著作には「Spring Live」(SourceBeat 出版) の著作者であり、「Pro JSP Third Edition」(Apress 出版) にも貢献しています。ApacheCon、MySQL User's Conference、OSCON などのオープン・ソース・コンファレンスで度々プレゼンターを務め、http://raibledesigns.com ではブロッガーとして活躍しています。Matt は電気もないモンタナ州の辺境で育った幼少時代も含め、人生の大半をコンピューターに囲まれて生活しています。余暇には夫人 Julie に尽くしているか、Abbie と Jack の良き父として子供たちと遊んでいます。



2006年 8月 08日

AppFuse は、Java プラットフォームで構築されたオープン・ソース・ツールを使用したオープン・ソース・プロジェクトおよびアプリケーションで、Webアプリケーションの開発時間を短縮し、開発の効率化を支援します。私がこれを開発した元々の目的は、カスタマーの新しいWeb アプリケーションを構築する際に費やすことの多い計画の立ち上げ時間を排除するためでした。基本的にはAppFuse はプロジェクトの骨組みで、新規 Web プロジェクトの作成ウィザードでクリックしたときにIDE によって作成される骨組みのようなものです。AppFuse でプロジェクトを作成する際には、まず使用するオープン・ソース・フレームワークを求めるプロンプトが出され、それからプロジェクトが作成されます。テスト、コードの生成、コンパイル、そしてデプロイメントにはAnt を使用します。AppFuse は、ディレクトリーとパッケージ構造、そして Java言語ベースの Web アプリケーションを開発するために必要なライブラリーも提供します。

ほとんどの「新規プロジェクト」ウィザードで作成されるものとは違って、AppFuseで作成されたプロジェクトには始めから多数のクラスとファイルが含まれています。これらのファイルは機能を実装するためだけでなく、アプリケーションの開発中にはサンプルとしても機能します。このため、AppFuseを使用して新しいプロジェクトを開始すれば、開発に通常費やす最初の 1、2 週間を省くことができます。複数のオープン・ソース・フレームワークがすでにまとめて構成されているため、この作業に煩わされることはありません。プロジェクトは事前構成ざれており、データベースと対話をし、アプリケーション・サーバーでデプロイし、そしてユーザーの認証を行うことができます。セキュリティー機能もすでに統合されているので、実装する必要はありません。

最初に開発した AppFuse では、Struts と Hibernate のみをサポートしていました。その後、Strutsより優れた Web フレームワークが見つかるごとに、そのためのオプションも追加していきました。現在AppFuse では、パーシスタンス・フレームワークとして Hibernate または iBATISをサポートします。Web フレームワークには、JSF (JavaServer Faces)、SpringMVC、Struts、Tapestry、または WebWork を使用できます。

以下の機能をはじめ、多くのアプリケーションに必要な機能を備えた AppFuseは、そのまますぐに使用できます。

  • 認証および許可
  • ユーザー管理
  • Remember Me (毎回ログインしなくても済むように、ログイン情報を保管します)
  • パスワード保管機能
  • サインアップおよび登録
  • SSL 切り替え
  • E メール
  • URL 再書き込み
  • スキン機能
  • ページ修飾
  • テンプレート化レイアウト
  • ファイル・アップロード

このような機能をすでに備えた AppFuse は、Ruby on Rails、Trails、Grailsなどの他の CRUD 生成フレームワーク (作成、取得、更新、および削除機能) とは一線を画しています。前述のフレームワークとAppFuse を使用すれば、データベース・テーブルや既存のモデル・オブジェクトからマスター/詳細ページを生成することも可能です。

図 1 に、標準的な AppFuse アプリケーションの概念設計を示します。

図 1. 標準 AppFuse アプリケーション
標準 AppFuse アプリケーション

リスト 1 に、devworks という名前のプロジェクトを作成するときに行われるコマンドラインでの対話と、その出力結果を示します。このプロジェクトのWeb フレームワークには、WebWork を使用しています (リンクについては、下記の 「参考文献」 セクションを参照してください)。

リスト 1. AppFuse での新規プロジェクトの作成
alotta:~/dev/appfuse mraible$ ant new
Buildfile: build.xml

clean:
     [echo] Cleaning build and distribution directories

init:

new:
     [echo] 
     [echo] +-------------------------------------------------------------+
     [echo] |    -- Welcome to the AppFuse New Application Wizard! --     |
     [echo] |                                                             |
     [echo] | To create a new application, please answer the following    |
     [echo] | questions.                                                  |
     [echo] +-------------------------------------------------------------+

    [input] What would you like to name your application [myapp]?
devworks
    [input] What would you like to name your database [mydb]?
devworks
    [input] What package name would you like to use [org.appfuse]?
com.ibm
    [input] What web framework would you like to use [webwork,tapestry,spring,js
f,struts]?
webwork
     [echo] Creating new application named 'devworks'...
     [copy] Copying 359 files to /Users/mraible/Work/devworks
     [copy] Copying 181 files to /Users/mraible/Work/devworks/extras
     [copy] Copying 1 file to /Users/mraible/Work/devworks
     [copy] Copying 1 file to /Users/mraible/Work/devworks

install:
     [echo] Copying WebWork JARs to ../../lib
     [copy] Copying 6 files to /Users/mraible/Work/devworks/lib
     [echo] Adding WebWork entries to ../../lib.properties
     [echo] Adding WebWork classpath entries
     [echo] Removing Struts-specific JARs
   [delete] Deleting directory /Users/mraible/Work/devworks/lib/struts-1.2.9
   [delete] Deleting directory /Users/mraible/Work/devworks/lib/strutstest-2.1.3
     [echo] Deleting struts_form.xdt for XDoclet
   [delete] Deleting directory /Users/mraible/Work/devworks/metadata/templates
     [echo] Deleting Struts merge-files in metadata/web
   [delete] Deleting 7 files from /Users/mraible/Work/devworks/metadata/web
     [echo] Deleting unused Tag Libraries and Utilities
   [delete] Deleting 2 files from /Users/mraible/Work/devworks/src/web/org/appfu
se/webapp
     [echo] Modifying appgen for WebWork
     [copy] Copying 12 files to /Users/mraible/Work/devworks/extras/appgen
     [echo] Replacing source and test files
   [delete] Deleting directory /Users/mraible/Work/devworks/src/web/org/appfuse/
webapp/form
   [delete] Deleting directory /Users/mraible/Work/devworks/src/web/org/appfuse/
webapp/action
     [copy] Copying 13 files to /Users/mraible/Work/devworks/src
   [delete] Deleting directory /Users/mraible/Work/devworks/test/web/org/appfuse
/webapp/form
   [delete] Deleting directory /Users/mraible/Work/devworks/test/web/org/appfuse
/webapp/action
     [copy] Copying 5 files to /Users/mraible/Work/devworks/test
     [echo] Replacing web files (images, scripts, JSPs, etc.)
   [delete] Deleting 1 files from /Users/mraible/Work/devworks/web/scripts
     [copy] Copying 34 files to /Users/mraible/Work/devworks/web
   [delete] Deleting: /Users/mraible/Work/devworks/web/WEB-INF/validator-rules-c
ustom.xml
     [echo] Modifying Eclipse .classpath file
     [echo] Refactoring build.xml
     [echo] ----------------------------------------------
     [echo] NOTE: It's recommended you delete extras/webwork as you shouldn't ne
ed it anymore.
     [echo] ----------------------------------------------
     [echo] Repackaging info written to rename.log
     [echo] 
     [echo] +-------------------------------------------------------------+
     [echo] |           -- Application created successfully! --           |
     [echo] |                                                             |
     [echo] | Now you should be able to cd to your application and run:   |
     [echo] | > ant setup test-all                                        |
     [echo] +-------------------------------------------------------------+

BUILD SUCCESSFUL
Total time: 15 seconds

なぜ WebWork なのか

Struts コミュニティーでは最近、WebWork を受け入れ、この組み合わせによってJava プラットフォームのための素晴らしい Web フレームワーク、Struts 2 が新たに誕生しました。もちろんSpring MVC はリクエスト・ベースの優れたフレームワークですが、Struts2 のようにはJSF をサポートしません。一方、JSF やTapestry などのコンポーネント・ベースのフレームワークもありますが、私の結論としては、WebWorkのほうがより直感的で操作も簡単です。(Struts 2 および JSF の詳細については、「参考文献」を参照してください。)

プロジェクトを作成すると、図 2 に示すようなディレクトリー構造になります。Eclipseおよび Intellij IDEA プロジェクト・ファイルは、このプロセスの一環として作成されます。

図 2. プロジェクト・ディレクトリー構造
プロジェクト・ディレクトリー構造

このディレクトリー構造は、Sun が J2EE (Java 2 Platform, Enterprise Edition)Web アプリケーションに推奨している構造と非常によく似ています。AppFuse バージョン2.0 では、この構造を Apache Maven プロジェクトの標準ディレクトリー構造に合わせて変更する予定です(両方のディレクトリーのガイドラインについては、「参考文献」にリンクが記載されています)。また、AppFuse は IDE プロジェクト・ファイルを生成するための推移的従属関係のダウンロードとサポート機能を備えるため、Antから Maven 2 に移行する予定です。現在の Ant ベースのシステムではコミッターがプロジェクト・ファイルを維持する必要がありますが、Maven2 では単にプロジェクトの pom.xml ファイルを使用するだけで、IDEA、Eclipse、そしてNetBeans プロジェクト・ファイルを生成できます。 この pom.xml ファイルはプロジェクトのルート・ディレクトリーにあり、Mavenでアプリケーションを構築する際に必要となるメイン・コンポーネントです。このファイルは、Antで使用する build.xml ファイルと非常に良く似ています。

AppFuse が何であるかが分かったところで、この記事では AppFuse を使用する単純な7 つの理由を説明していきます。AppFuse を使用しないでプロジェクトを開始する場合でも、AppFuseによって Java 言語ベースの Web アプリケーションで使用可能なボイラープレート・コードのほとんどが提供されることが分かるでしょう。AppFuseは Apache のライセンス交付を受けているため、独自のアプリケーションでぜひ、このコードを再利用してみてください。

理由その 1: テスト

ソフトウェア開発プロジェクトでは、テストに十分な信頼が置かれていることはめったにありません。ソフトウェア開発についての出版物で、テストの功績が認められていないと言っているわけではありません。多くの記事や事例研究で、テスト先行による開発と幅広いテスト対象範囲によってソフトウェアの品質が改善される例を説明しています。それでもなお、テストはプロジェクトが完成するまでの時間を長引かせるだけのものとして捕らえられることが多々あります。実際には、テスト先行型の方法を用いてコードより先にテストを作成すると、開発時間が短縮されることが分かるはずです。さらに、テストを先に行うことによって、メンテナンスとリファクタリングがはるかに簡単になります。コードをテストするためのコードを作成しておかないと、いちいちクリックしてアプリケーションをテストすることになります。これは、あまり効率的とは言えません。鍵となるのは、自動化です。

初めて AppFuse を使い始めるときには、おそらく、プロジェクトの Web サイトで入手できるQuickStart ガイドやチュートリアルを読むことでしょう (「参考文献」にリンクを記載しています)。これらのチュートリアルでは最初にテストを作成することを前提としているため、インターフェースやインプリメンテーションを書き込むまではコンパイルを行いません。私だったらコードを書き始める前に必ずテストを作成します。こう言うしか、本気でテストを作成しようという動機を与える方法はありません。インプリメンテーションを先に作成して、それが機能するとどうにかして確認できた場合、あなたはこう思うでしょう「やっぱりテストは必要ないじゃないか。この調子でコードを作成しよう!」。このシナリオの不幸な点は、そのコードを何かしらの方法でテストしたはずですが、テストの自動化という部分は省いてしまったことです。

AppFuse の資料では、アプリケーションのすべての層をテストする方法を説明しています。テストはまずデータベース層から開始し、DbUnit(「参考文献」を参照) を使用してデータベースにデータを事前入力してからテストを実行します。DAO(データ・アクセス) 層では、Spring のコンテキスト・ファイルを簡単にロードできるようにSpring のAbstractTransactionalDataSourceSpringContextTests クラス (実際のクラス名です) を使用します。さらに、このクラスは各testXXX() メソッドを中心にトランザクションをラップし、テスト・メソッドの終了時にトランザクションをロールバックします。この機能によって、データベース内のデータに影響を及ぼすことなく、DAOロジックを簡単にテストできます。

サービス層では、jMock (「参考文献」を参照) を使用して、DAO 従属関係を真似た実際の単体テストを作成します。これにより、ビジネス・ロジックが正しいものであることを検証する、簡単で素早いテストが可能になります。基礎となるパーシスタンス・ロジックを意識する必要はありません。

HtmlUnit サポート

HtmlUnit チームは、Prototype や Scriptaculous などの人気の高い Ajax フレームワークでパッケージが機能することを確実にするため、1.8リリースにかなりの変更を加えています。

Web 層では、操作 (Struts/WebWork)、コントローラー (Spring MVC)、ページ(Tapestry)、そして管理対象 Bean (JSF) が期待通りに機能することをテストで検証します。Springの spring-mock.jar には Servlet API の擬似インプリメンテーションが含まれているため、すべてのフレームワークのテストに役立ちます。この便利なライブラリーがなかったら、AppFuseの Web フレームワークのテストはやっかいな作業になっていたことでしょう。

Web アプリケーションでは通常、UI の開発が最も困難な部分です。これは、見映えがよくない、期待通りに機能しないなどの理由で、カスタマーの苦情が最も集まる部分です。さらに、カスタマーを面前にしたデモの途中でうまく働かなくなることほど、悲惨な事態はありません。アプリケーション自体は素晴らしいとしても、カスタマーは完全性について疑問を持つはずです。そのような事態はどうしても避けなければなりません。そこで、UIをテストする Canoo WebTest の出番です。ここには HtmlUnit が採用されており、UIをウォークスルーしてエレメントが存在しており、フォーム・フィールドに収まっていること、また、手の込んだAjax 対応 UI が正常に機能することまで検証します。(「参考文献」に、WebTest と HtmlUnit 両方のリンクを記載しています。)

Web テストをさらに実行しやすくするため、Cargo (「参考文献」を参照) が WebTest テストの実行前後に Tomcat を自動的に起動および停止します。


理由その 2: 統合

この記事の冒頭で述べたように、AppFuse には多数のオープン・ソース・ライブラリーが事前に統合されています。これらのライブラリーは、次のカテゴリーに分けられます。

  • ビルド、レポート、およびコード生成: Ant、Ant Contrib Tasks、Checkstyle、EMMA、Java2Html、PMD、および RenamePackages
  • テスト・フレームワーク: DbUnit、Dumbster、jMock、JUnit、および Canoo WebTest
  • データベース・ドライバー: MySQL および PostgreSQL
  • パーシスタンス・フレームワーク:Hibernate および iBATIS
  • IoC フレームワーク: Spring
  • Web フレームワーク: JSF、Spring MVC、Struts、Tapestry、および WebWork
  • Web サービス: XFire
  • Web ユーティリティー: Clickstream、Display Tag、DWR、JSTL、SiteMesh、Struts Menu、および URLRewrite Filter
  • セキュリティー:Acegi Security
  • JavaScript および CSS: Scriptaculous、Prototype、および Mike Stenhouse の CSS Framework

上記のライブラリーの他、AppFse はロギングに Log4j を、E メールおよびメニュー・テンプレートの構成にはVelocity を使用します。Tomcat は開発にすぐに使用できるようにサポートされていて、コンパイルとビルドにはバージョン1.4 または 5 の Java プラットフォームを使用できます。AppFuse は任意の J2EE1.3 対応アプリケーション・サーバーにデプロイできます。これはテスト済みで、すべての主要なJ2EE サーバーとすべての主要なサーブレット・コンテナーで正常に機能することが分かっています。

図 3 に、前に作成した devworks プロジェクトの lib ディレクトリーを示します。このディレクトリーに含まれるlib.properties は、従属関係ごとにバージョン番号を管理します。つまり、これらのパッケージの新しいバージョンは、このディレクトリーにドロップして、anttest-all -Dspring.version=2.0 のようなコマンドをコマンドラインで実行することによって簡単にテストできます。

図 3. プロジェクトの従属関係
プロジェクトの従属関係

上記のオープン・ソース・ライブラリーがすべて事前に統合されているため、プロジェクト開始時の作業効率は大幅に改善されます。これらのライブラリーの統合についての資料は大量にありますが、作業サンプルをカスタマイズして、それをそのままアプリケーションの開発に使用するほうがずっと簡単です。

AppFuse によって Web アプリケーションの開発が簡易になるだけでなく、Webサービスをプロジェクトに統合するのも簡単になります。AppFuse ダウンロードにはXFire が含まれていますが、必要に応じて Apache Axis を統合することもできます(Axis 統合のチュートリアルについては、「参考文献」を参照)。Spring フレームワークと XFire はともに、サービス指向アーキテクチャーの開発を可能にするため、サービス層を簡単にWeb サービスとして公開できるようにします。

さらに、AppFuse では特定の API に縛られることはありません。AppFuse では、使用できる最適なオープン・ソース・ソリューションが再パッケージ化され、事前統合されているだけのことです。AppFuse内にあるコードがこの統合を処理し、AppFse の基本的なセキュリティー機能とユーザビリティー機能を実装します。可能な場合はコードが除去され、代わりにAppFuse のいずれかの従属フレームワークに機能が追加されます。例えば、AppFuse独自の Remember Me と SSL 切り替え機能は最近除去されて、Acegi Securityによる同様の機能がこれに代わっています。


理由その 3: 自動化

コンパイル、ビルド、デプロイに至るまでの自動化は、Ant によって簡易化されています。Antは AppFuse の最上の機能で、その第 1 の理由は、コマンドラインから実行するほうがIDE から実行するより簡単だと思ったからです。Ant を使用すれば、あらゆるコード生成タスクをビルド、テスト、デプロイ、実行できます。

この機能は一部の人々にとっては素晴らしいものですが、すべての人に当てはまるとは限りません。多くのAppFuse ユーザーは現在、Eclipse または Intellij IDEA を使用してプロジェクトのビルドとテストを行っています。Antはこれらの IDE から実行できますが、IDE の組み込み JUnit サポートを使用してテストを実行する場合に比べると、まったく効率的ではありません。

幸い AppFuse はIDE 自体からのテストの実行をサポートしていますが、AppFuse開発者にとって、この機能を保守することは容易なことではありませんでした。最大の悩みの種は、XDocletを使用して Web フレームワークの Hibernate マッピング・ファイルおよび一部の成果物(Struts の ActionForms や struts-config.xml など) を生成するという点です。Antでビルドするように IDE を構成するか、あるいは何らかの XDoclet 対応プラグインをインストールしない限り、IDEはコードを生成する必要があるかどうかを認識しないのです。

この認識不足を理由の 1 つとして、AppFuse 2.0 は JDK 5 および Maven 2 に移行することになりました。JDK5、アノテーション、そして Struts 2 によって、ついに XDocle から解放されます。Maven2 が IDE プロジェクト・ファイルを生成し、生成されたこれらのファイルと動的クラスパスによってプロジェクトの管理が一層簡単になります。現在のAnt ベースのビルド・システムはすでに異なる層を対象とした成果物 (dao.jar、service.jar、およびwebapp.war を含む) を作成するため、Maven のモデルへの移行は当然の結果と言えます。

Ant (およびビルド、テスト、デプロイ、レポート用の豊富なターゲット・セット)に加え、CruiseControl のサポートも AppFuse に組み込まれます。CruiseControlは Continuous Integration (継続的統合) アプリケーションで、これを使用すると、ソース・コード・リポジトリー内でコードが変更されたときには必ず、すべてのテストが自動的に実行されるようにできます。extras/cruisecontrolディレクトリーには、AppFuse ベース・プロジェクト用 Continuous Integrationを簡単にセットアップするために必要なファイルが含まれています。

Continuous Integration のセットアップは、ソフトウェア開発サイクルにおいて最初に行わなければならないことの1 つです。これは、プログラマーにテストを作成しようという動機を与えるだけでなく、「ビルドを壊したのは誰だ!」というゲームを通してチームワークと団結を強めることにもなります。


理由その 4: セキュリティー機能と拡張性

AppFuse は当初、Apress に関する私の著書のためのサンプル・アプリケーション、ProJSP の一部として開発されました。このサンプル・アプリケーションは、さまざまなセキュリティー機能と、Struts開発を簡単にする機能を実演するもので、このアプリケーションに含まれるセキュリティー機能の多くは、J2EEのセキュリティー・パラダイムにはなかったものです。CMA (コンテナー管理認証)による認証は簡単でしたが、Remember Me、パスワード・ヒント、SSL 切り替え、サインアップ、そしてユーザー管理はまだ存在していませんでした。さらに、役割ベースでメソッドを保護する機能は、EJB以外の環境では不可能でした。

最初、AppFuse には、これらの機能のすべてが独自のコードと CMA の次善策とともに実装されました。AcegiSecurity について耳にしたのは、2004 年の初めに初めて Spring を学び始めたときです。Acegiに必要な XML の行数 (175) と CMA が web.xml 内に必要な行数 (20) を比較したところ、Acegiはあまりにも複雑だったためにすぐに却下しました。

私の気が変わったのはその 1 年半後 (別の「Spring Live」という本のためにAcegi Security の使用方法に関する章を書いた後) です。Acegi には (今でも変わらず)かなりの量の XML が必要ですが、一度理解してしまえば非常に簡単です。ついに思い切ってすべてのAppFuse 独自の機能を Acegi Security の機能に置き換えた結果、多くのコードが削除されました。クラスの上に重なったクラスは、CVSの Attic に含まれる「Acegi が代わって処理する」大量の処理のなかに消え去りました。

Acegi Security は、J2EE のセキュリティー・モデルに起きた今まで最高の出来事です。これによって、ServletAPI のセキュリティー・モデルには含まれていない数多くの便利な機能 (認証、許可、役割保護メソッド、RememberMe、パスワード暗号化、SSL 切り替え、ユーザー切り替え、そしてログアウト)を実装することが可能になります。また、ユーザーのクレデンシャルを XML ファイル、データベース、LDAP、あるいはYale の CAS (Central Authentication Service) や SiteMinder といったシングル・サインオン・システムに格納することもできます。

AppFuse に多くのセキュリティー関連の機能が実装されていたことは、最初は素晴らしいことでした。現在AppFuse は、Acegi Security を使用するので、これらの機能 (そして、はるかに多くの機能)を簡単に実装できます。Acegi には多数の拡張点があり、それが XML 構成ファイルのサイズを大きくしている理由ですが、昨年Acegi を統合する過程で多くの Bean 定義がカスタマイズされ、AppFuse にさらに密接に組み込まれることになりました。

一体化された開発の容易さ、簡単にテスト可能なコード、そして Spring IoC コンテナーとAcegi Security による疎結合が、AppFuse での開発をこの上なく快適なものにしている主な理由です。これらのフレームワークは押し付けがましくなく、簡潔でテスト可能なコードを実現します。AppFuseは多くのオープン・ソース・プロジェクトを統合しているため、従属関係を注入することによってアプリケーションの各層を簡単に統合できます。


理由その 5: AppGen によるコード生成

コード生成はうさん臭いものだと言う人がいます。彼らの意見によると、コードを生成しなければならない場合、それは何かが誤った方向で行われているに違いないということです。私の意見では、コードで使用するパターンを識別し、その生成を自動化できるということは素晴らしいものです。同様のDAO、マネージャー、そして操作やコントローラーを作成しているときに、そのためのコードを生成していないとしたら、それこそ怪しいものです。もちろん言語が総称文などの機能で助けてくれる場合はいいのですが、通常はコードの生成は必要な(しかも非常に効率的な) タスクとなります。

AppFuse には、AppGen という名前の Ant および XDoclet ベースのコード生成ツールが付属しています。デフォルトでは、汎用DAO とマネージャーによって、POJO (従来の Java オブジェクト) の CRUD (作成、読み出し、更新、および削除)を行うことができますが、それを Web 層で行うのは困難です。AppGen には、以下のタスクを実行するための機能が備わっています。

  • データベース・テーブルから (Middlegen および Hibernate ツールを使用して)POJO を生成
  • POJO から UI を生成
  • DAO、マネージャー、操作/コントローラー、および UI のテストを生成

AppGen を実行すると、データベース・テーブルまたは POJO から生成するように求めるプロンプトが出され、AppGenがコードを生成します。コマンドラインでant install-detailed を実行すると、AppGen が POJO 固有の DAO とマネージャーをそれぞれのテストとともにインストールします。ant install を実行すると、Web 層クラスは、デフォルトで存在する汎用 DAO とマネージャーを再利用します。

AppGen がどのように機能するかを説明するため、リスト 2 に示すテーブルをdevworks MySQL データベースに作成しました。

リスト 2. cat データベース・テーブルの作成
    create table cat (
      cat_id int(8) auto_increment,
      color varchar(20) not null,
      name varchar(20) not null,
      created_date datetime not null,
      primary key (cat_id)
    ) type=InnoDB;

extras/appgen ディレクトリーから、ant install-detailed を実行します。このコマンドの完全な出力はリストするには長すぎるので、最初の部分だけをリスト3 に示します。

リスト 3. AppGen の install-detailed ターゲットの実行
$ ant install-detailed
Buildfile: build.xml

init:
    [mkdir] Created dir: /Users/mraible/Work/devworks/extras/appgen/build
     [echo] 
     [echo] +-------------------------------------------------------+
     [echo] |             -- Welcome to the AppGen! --              |
     [echo] |                                                       |
     [echo] | Use the "install" target to use the generic DAO and   |
     [echo] | Manager, or use "install-detailed" to general a DAO   |
     [echo] | and Manager specifically for your model object.       |
     [echo] +-------------------------------------------------------+

    [input] Would you like to generate code from a table or POJO? (table,pojo)
table
    [input] What is the name of your table (i.e. person)?
cat
    [input] What is the name, if any, of the module for your table (i.e. organization)?

     [echo] Running Middlegen to generate POJO...

cat テーブルに新しく生成されたコードを使用するには、src/dao/com/ibm/dao/hibernate/applicationContext-hibernate.xmlに Hibernate の Cat.hbm.xml マッピング・ファイルを追加する必要があります。リスト4 に、変更後の sessionFactory Bean を示します。

リスト 4. sessionFactory Bean への Cat.hbm.xml の追加
    <bean id="sessionFactory" class="...">
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingResources">
        <list>
            <value>com/ibm/model/Role.hbm.xml</value>
            <value>com/ibm/model/User.hbm.xml</value>
<value>com/ibm/model/Cat.hbm.xml</value>
        </list>
    </property>
    ...
</bean>

ant setup deploy を実行すると、デプロイされたアプリケーションから cat テーブルのCRUD を実行することが可能になります。

図 4. Cat リスト
Cat リスト
図 5. Cat フォーム
Cat フォーム

上記の 2 つのスクリーンショットに表示されたレコードは、コード生成プロセスの一部として作成されているので、テスト対象のデータがあります。


理由その 6: 資料

AppFuse のフレーバーごとに、中国語、ドイツ語、英語、韓国語、ポルトガル語、スペイン語の6 ヶ国語のチュートリアルが用意されています。フレーバーとは、Spring MVCと iBATIS、Spring MVC と Hibernate、あるいは JSF と Hibernate など、各種のフレームワークの組み合わせのことです。5つの Web フレームワークと 2 つのパーシスタンス・フレームワークをさまざまに組み合わせることができます。上記の翻訳からもわかるように、AppFuseはデフォルト機能として 8 ヶ国語の翻訳で出荷されます。選択可能な言語は、中国語、オランダ語、ドイツ語、英語、フランス語、イタリア語、ポルトガル語、スペイン語です。

中心的なチュートリアルに加え、各種のデータベース、アプリケーション・サーバー、そしてその他のオープン・ソース技術(JasperReports、Lucene、Eclipse、Drools、Axis、および DWR など) との統合を説明する多数の補足チュートリアル(「参考文献」を参照) も追加されています。


理由その7: コミュニティー

Apache Software Foundation には、オープン・ソースについての興味深い見解があります。その最大の関心事は、オープン・ソース・プロジェクトを中心としたコミュニティーの発展です。コミュニティーのメンバーは、コミュニティーが強力になれば、その自然な成り行きとしてコードの品質が高くなると信じています。以下は、Apacheのホーム・ページからの引用です。

「我々は自分たちのことを、サーバーを共有するプロジェクトの単なる 1 グループというより、開発者とユーザーが構成するコミュニティーだと思っています。」

AppFuse コミュニティーは 2003 年に SourceForge プロジェクト (struts.sf.netの一部) として発足して以来、飛躍的に成長しました。2004 年 3 月、java.netへの移行によってプロジェクトの人気は高まり、2005 年 1 月から 3 月にかけて最も高いアクセス数を記録しています。今日でも人気の高いプロジェクトであることに変わりはありませんが(「参考文献」にjava.net のプロジェクト統計のリンクを記載)、サイトの Sun 後援プロジェクトの多くに支持基盤の一部を奪われています。

2004 年後半、私の他に Nathan Anderson がコミッターとして加わりました。それ以降、BenGill、David Carter、Mika Göckel、Sanjiv Jivan、そして Thomas Gaudinをはじめとする多数のコミッターが加わっています。現在のコミッター全員がいろいろな点で貢献し、その全員の尽力により、AppFuseコミュニティーは活気のある面白い場所になっています。

メーリンク・リストはフレンドリーなものであり、私たちは「質問には、愚かな質問というものはない」という信念を持ち続けるよう心掛けています。メーリング・リスト・アーカイブにある唯一の「RTFM」はユーザーから寄せられたものであって、開発者のものではありません。私たちはApache オープン・ソース哲学を絶対的に信じています。友人の Bruce Snyderの言葉を借りれば、「コードを求めて訪れて、人々を求めてそこに残る」ということです。現在、ほとんどの開発者はユーザーでもあり、コミュニティーでは楽しい時間を過ごしています。さらに、資料のほとんどはコミュニティーで作成しているため、コミュニティーは知識の宝庫でもあります。


まとめ

ぜひ、AppFuse での開発を試してください。AppFuse を使用すると、Web アプリケーションのテスト、統合、自動化、セキュリティー保護、そして生成が簡単になります。また、資料は豊富で、コミュニティーはフレンドリーです。AppFuseに力を与えるフレームワークが改良されるにつれ、AppFuse も改善し続けていくでしょう。

AppFuse 2.0 では、JDK 5 (同時に 1.4 へのデプロイのサポートを継続) およびMaven 2 に移行する予定です。これらのツールによって AppFuse での開発、インストール、アップグレードが単純化されることになります。Maven2 については、その推移的従属関係の処理機能を利用する予定です。これにより、appfuse-hibernate-2.0.jarや appfuse-jsf-2.0.jar などの成果物が作成されます。これらの成果物は、pom.xmlファイルで参照され、残りの関連従属関係を取得します。プロジェクトで AppFuseの基本クラスを使う代わりに、通常のフレームワークでの場合と同じように JARでクラスを拡張するだけなので、アップグレードが一層簡単になり、より多くのユーザーがカスタマイズしたものをプロジェクトにサブミットできるようになります。

他のことはともかく、AppFuse を使用すれば、Java Web 開発の最先端にいられることに間違いありません。

参考文献

学ぶために

製品や技術を入手するために

  • AppFuse on java.net: AppFuse の各種フレーバーをダウンロードしてください。
  • WebWork: この使いやすい Web フレームワークを試してみてください。
  • DbUnit: この JUnit 拡張機能の詳細を調べてください。
  • jMock: 動的擬似オブジェクトを作成して、実際の単体テストを簡易化できます。
  • Canoo WebTest: Web アプリケーションの UI テストを自動化できます。
  • HtmlUnit: WebTest の優れたJavaScript サポートを支える力となっています。
  • Cargo: コンテナーの起動と停止を自動化できます。
  • Greenbox: コード生成フレームワークです。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology, Web development, Open source
ArticleID=218922
ArticleTitle=AppFuse を使用する 7 つの簡単な理由
publish-date=08082006