まっつんです。今回のテーマは Spring Roo (以下、Roo) です。Roo とはどんなものなのでしょうか?

MATSUFUJI Hideharu

Roo とは?

Roo のプロジェクトリード Ben Alex 氏はブログ記事「Jump into Roo for extreme Java productivity」で以下のように説明されています。

Roo is a sophisticated round-tripping code generator that makes it quicker and easier than you've ever imagined to create and evolve Spring applications. Even if you have reservations about code generation, it will still be worth taking a look at Roo. It contains significant innovation that addresses all major objections to code generation, whilst still delivering best practice Spring applications and remaining useful throughout the application lifecycle.

RooSpring を使用したアプリケーションのコードを生成するツールであり、アプリケーション開発のあらゆる段階でベストプラクティスを提供するツールとのことです。

それでは、具体的にどういった機能を Roo は提供しているのでしょうか?

Roo のサイト の説明ではわかりにくいので、Ben Alex 氏のブログ記事「Exploring Roo's Architecture」の「Roo Core versus Roo Add-Ons」を参考に、Roo のコアが提供する機能を列挙してみましょう。

  • a shell
  • file system manager
  • file system monitor
  • file undo capability
  • classpath abstraction
  • Abstract Syntax Tree (AST) parsing and binding
  • project build system interface
  • metadata model
  • process management
  • bootstrap and utility services

最後に Roo のミッションについて見てみましょう。Ben Alex 氏はブログ記事「Jump into Roo for extreme Java productivity」で以下のように書かれています。

Roo's mission is to fundamentally and sustainably improve Java developer productivity without compromising engineering integrity or flexibility.

理論と実装の両方が大事だと考えている筆者にとって、工学的手法を損なうことなく開発者の生産性を改善していこうという Roo の姿勢はとても共感できるものです。

インストール

Roo は以下のサイトからダウンロードできます。

http://www.springsource.org/download

Roo の動作環境は以下のとおりです。

それでは、アーカイブに含まれている readme.txt を参考に Roo をインストールしましょう。最初に、Java, Apache Maven をインストールします。

sudo aptitude install sun-java6-jdk
sudo aptitude install maven2

次に Roo を展開し、コマンドラインシェルへのシンボリックリンクを作成します。

unzip spring-roo-1.0.0.M1.zip
sudo ln -s /path/to/roo/bin/roo.sh /usr/bin/roo

続いて、Apache Tomcat をインストールします。Ubuntu のパッケージ管理システムからインストールを行うと、設定ファイルと実行ファイルが異なるディレクトリに保存されるため Web Standard Tools が Apache Tomcat を認識できず、Eclipse から起動することができません。この問題に対処するために今回は Apache Tomcat のサイト からダウンロードしたものを使うことにしました。

unzip apache-tomcat-6.0.20.zip

次に、開発環境として Eclipse をインストールします。

ノート: Roo はいかなる開発環境にも依存していません。

まず、Eclipse のサイト から Eclipse IDE for Java EE Developers をダウンロードします。次に、以下の更新サイトを利用して AspectJ Development Tools (AJDT) のすべてのフィーチャをインストールします。

http://download.eclipse.org/tools/ajdt/34/dev/update

最後に、Eclipse のクラスパス変数に Apache Maven のリポジトリのパスを登録します。

NamePath
M2_REPO/path/to/.m2/repository
roo-m2-repo.png

以上でインストールは完了です。

Roo を使ってみる

では Roo を使ってみましょう。readme.txt では clinic.roo スクリプトを使用した例が示されていますが、筆者が試したところいくつかの JSP ファイルが作成されず上手く動作しなかったため、今回は vote.roo スクリプトを使用することにします。

まず、プロジェクトのディレクトリを作成し、Roo のコマンドラインシェルを起動します。

mkdir vote
cd vote
roo

bash, zsh などの Unix シェルと同じく、コマンドラインで タブ (TAB) を押すことで利用可能なコマンドの一覧が表示されます。

roo-shell.png

次に、vote.roo スクリプトを実行し、プロジェクトを作成します。

script vote.roo
exit

vote.roo スクリプトの内容を見ると、Roo の各種コマンドによってプロジェクトおよびドメインモデル Choice, Vote の作成が行われていることがわかります。

spring-roo-1.0.0.M1/samples/vote.roo
create project -topLevelPackage com.springsource.vote

install jpa -provider HIBERNATE -database HYPERSONIC_PERSISTENT

new persistent class jpa -name ~.domain.Choice -testAutomatically
add field string namingChoice -notNull -sizeMin 1 -sizeMax 30
add field string description -sizeMax 80
new controller automatic ~.web.ChoiceController

new persistent class jpa -name Vote -testAutomatically
add field reference jpa choice -type Choice
add field string ip -notNull -sizeMin 7 -sizeMax 15 
add field date jpa registered -type java.util.Date -notNull -past
new controller automatic ~.web.VoteController

new controller manual ~.web.PublicVoteController

configure logging -level DEBUG -package WEB

install security

list finders for -class com.springsource.vote.domain.Vote -depth 2 -filter reg,betw,IpEq

これらのコマンドではディレクトリやファイルが指定されていません。このことは、ディレクトリやファイルが Roo によって決定されていることを示唆しています。これは Roo によるベストプラクティスの提供方法のひとつといえるでしょう。

次に、作成されたプロジェクトを、Apache Maven を使用して Eclipse のプロジェクトに変換します。

mvn eclipse:eclipse

それでは Eclipse でプロジェクトをインポートしてみましょう。

roo-vote-project.png

vote.roo スクリプトに記述されているドメインモデル Choice, Vote が作成されています。

Roo はプロジェクト作成時にドメインモデルのユニットテストも作成します。プロジェクトを右クリックして、[Run As...] -> [JUnit Test] をクリックするとテストを実行することができます。

roo-junit.png

最後に、Apache Tomcat を起動して vote アプリケーションを実行してみましょう。

プロジェクトを右クリックして、[Run As...] -> [Run on Server] をクリックし、Tomcat v6.0 Server を起動します。

Apache Tomcat が正常に起動したことを確認し、http://localhost:8080/vote/ へアクセスして動作確認を行います。

roo-vote-web.png

Roo によるモデル変更の反映

ここで Roo の最大の特徴であるモデル変更の反映について見てみましょう。今回はドメインモデル Choice に投票者の年齢を表す age プロパティを追加することにします。

まず、vote ディレクトリで Roo を起動しておきます。

cd /path/to/vote
roo

次に、age プロパティを追加します。このとき Eclipse に依存しないことを確認するため、テキストエディタを使用しましょう。

src/main/java/com/springsource/vote/domain/Choice.java
--- a/src/main/java/com/springsource/vote/domain/Choice.java 2009-06-24 22:07:46.000000000 +0900
+++ b/src/main/java/com/springsource/vote/domain/Choice.java    2009-06-24 21:57:13.000000000 +0900
@@ -19,4 +19,7 @@
 
     @Size(max = 80)
     private String description;
+
+    @NotNull
+    private Integer age;
 }

Choice.java を保存した時点で、Roo は変更を検知し、関連するファイルを自動的に変更します。このように Roo のモデル変更の反映は Eclipse やテキストエディタなどの環境に依存していないことがおわかりいただけるでしょう。

roo-detection.png

再び、Apache Tomcat を起動して、http://localhost:8080/vote へアクセスし、Create New Choice リンクをクリックすると、新たに追加した age プロパティが Web ページに反映されていることが確認できます。

roo-add-age.png

おわりに

Roo を評価した当初、筆者はこのソフトウェアをコード生成ツールとして認識しましたが、それは誤りでした。

確かに Roo のコード生成部分だけをみれば、Rails のジェネレータと大きな違いはありません。しかし、今回ご覧いただいたように、Roo はユーザが行った変更を検知し、関連するモデル (ここでは .aj および .jsp のファイル) を自動的に変更します。

この機能は Roo を単なるコード生成ツールではなく、アプリケーション開発のあらゆる段階で活用できる基盤ツールにしているといえるでしょう。

あるモデルの変更を自動的に他のモデルに反映する仕組みは Martin Fowler 氏による記事「言語ワークベンチ」でも言及されています。

このような「コード生成後も面倒をみるツール」には技術的な課題もありますが、筆者が考える最大の課題は「ユーザに受け入れられるかどうか」という点です。

自分が知らない間に勝手にコードが変更されることに嫌悪感を持つ方もおられるでしょう。特に IDE を使う機会が少ない LL (Lightweight Language) のユーザには、そのように感じられる方が多いのではないでしょうか。

「コード生成後も面倒をみるツール」としては EclipseEMF があり、これは徐々に受け入れられつつあります。Roo がどのようにユーザに受け入れられるか、非常に興味深いところです。

使用したソフトウェアのバージョン

Spring Roo1.0.0.M1
Apache Maven2.0.9
Java1.6.0_13
AspectJ Development Tools (AJDT)2.0.0
Eclipse (Eclipse IDE for Java EE Developers)3.4.2
Apache Tomcat6.0.20

参考文献

トラックバック(0)
  • このブログ記事のトラックバックURL:
コメント