VMwareの一部門SpringSourceのGrails開発チームは先頃Grails 2.0のリリースを発表した。このリリースはGrailsのユーザビリティをRooコンソールに似た形に改善した。クラスリローディングは進歩し、GroovyとJavaに対応している。Grailsの永続レイヤであるGORMはGroovy 1.8でのAST変換によって最大限DSLをサポートしている。
Grailsの主要開発者で考案者であるGraeme Rocher氏は昨日(2011年12月15日)公式のアナウンスを発表した。
このアナウンスの中で氏は、このリリースが一年の活動の最高峰である、と言っている。このリリースでは、よりクリーンなデバッグのサポートとRooを思わせるようなコード補完機能つきコンソールアプリケーションにより、ユーザエクスペリエンスが強化されている。Rooは別のSpringSourceのプロジェクトで同様のゴールを持つが、よりJavaに焦点をあてたプロジェクトである。
以下のような新機能が含まれる:
- タブ補完とカラー出力が追加されたコンソール
- より信頼性の高いクラスローディング機構。これにより、Grailsはページの更新に関してこれまでよりもPHPのような感じを与え、すべてが簡単に機能する
- 強化されたエラーレポートと、より正確な問題診断によるデバッグサポートの向上
- ライブラリの更新 Groovy 1.8、Spring 3.1、Hibernate 3.6、および、Servlet 3.0
- Graisのプラグイン開発の助けとなる、静的リソース(CSSやJavascriptなど)をデリバリするためのフレームワーク。それによって、例えば同じJavaScriptライブラリは同じページでは複数の異なるGraisプラグインから複数回インクルードされなくなる。
- リンク生成とページレンダリングの新API
- GORMの新機能: detached criteria、Whereクエリ、複数データソースなど、Groovy ASTを利用して、型チェックサポートを使った手動タスクの要求に応じてDSLを提供するもの
- 改善されたユニットテスト。Spock、JUnit、TestNGが利用可能に
- データベースマイグレーションプラグイン
- 改善されたデータベースリバースエンジニアリング
- その他多数
意見:GORMによる分離されたQuery DSLとwhereメソッドクエリDSL(detached Query DSL and the where method queries DSL)を見ると、Groovy AST変換によって、Groovy DSL開発が容易になっていることはほとんど疑いの余地がない。Groovy 1.8リリースによって、Groovyは第一級のDSL対応言語となっている。GORMはGroovyのDSLサポートを十分に顕示している。
InfoQはGrailsの支持者であるPeter Ledbrook氏に話をうかがう機会を得た。Peter氏はGrails企業G2oneで、SpringがG2oneを買収する以前に働いていた、尊敬すべき支持者である。Peter氏はGrailsがGroovy on Railsと呼ばれていた2006年からGrailsに関わり続けている。
InfoQ: 1つ前のバージョンからの主な変更は何でしょうか?
みなさんがまず最初に気づくであろう変更は新しいインタラクティブなコンソールです。そのいくつかのスクリーンショットもあります。具体的には、自動タブコード補完、履歴バッファ、シンタックスハイライトなどの機能があり、すべてのコマンドが実行されるのは実行中のJVMなので、各コマンドのためにJavaをロードしたり、Groovyを初期化したりする必要がなく、ずっと高速になります。もう1つのメリットはクラスリロードがJVMエージェントによって行われるということです。これまでもリロードはありましたが、ずっと信頼性が高くなり、多くのものに対応しています。いまやドメインクラスに対しても対応しています。ユーザがサーブレットコンテナを再起動することはずっと少なくなるでしょう。
氏は続いて、Grailsプラグイン開発をシンプルにする、テストフレームワークと静的リソースデリバリの改善について語った。ユニットテストに柔軟性が備わったことで、JUnit、Spock、TestNGやそれ以外のフレームワークにもずっと簡単に対応できる。そして、ユニットテストではデータベースを実際にたたくことなくデータベースアクセスをテストできる、GORMエミュレーションも利用できる。RooとGrailsの両方のコンソールサポートとクラスリロードサポートはSpring Sourceツールスイートの一部であるJVM利ローディングエージェントの恩恵を受けている。
InfoQ: GrailsはCloudFoundry、Amazon EC2、Google App Engine (GAE)といったクラウドに対してどのようなサポートを提供していますか? 追加設定なしにEC2をサポートしていますか?
コアではクラウドのサポートはありません。しかし、さまざまなプラグインを利用して追加することはとても簡単です。たとえば、CloudFoundryに対して第一級のサポートを提供しています。デプロイのためのVMCツールが存在しますが、VMCツールができることのほとんどすべてを可能にし、さらに、Grailsレプリケーションを感知するプラグインがあります。MongoDB Grailsプラグインがインストールされているかどうかが判断でき、デプロイしたときには、CloudFoundryにプロビジョニングされ、そのアプリケーションに結合されたMongo DBサービスがあるかどうかをチェックします。さらに、Mongo DBインスタンスをプロビジョニングしたいかどうか、結合したいかどうかを確認します。あなたのアプリケーションがCloudFoundryを感知できるようにする必要はありません。
氏はさらにAmazon WS (EC2, S3など)プラグインがメッセージング、ストレージなどのAmazonサービスの簡単なアクセスをサポートすると語った。Amazonへのデプロイについてはサポートしていないとのこと。続けて、Groovyコンフィグファイルを使ってAmazon BeanStalk内に設定されたプロパティにアクセスし、AmazonへのBeanStalkを使った高速デプロイを容易にする方法について語った。
その後、氏はGoogle App Engineのサポートについて語った。GAE Grailsプラグインは存在し、GAEへのデプロイは可能である。しかし、GORMがGoogle流のJPAをサポートできるようにするには、まだいくつかやるべき作業がある。そのプラットフォームへのデプロイについてもやるべき作業が残っている、とのことだ。
氏は、少し脱線して一般的なJPAサポートのためにGORMに必要な作業があることに言及した。現在のGORM JPAアダプタはJPA 1.0をサポートする。JPA 2.0をサポートするためにアップデートが必要になっている。JPA 2.0をサポートすることによって、GORMはJPA 2.0上に構築されたずっと多くの永続ソリューションをサポートすることになるだろう。
InfoQ: GORMの主な変更について聞かせて下さい。GORMはスタンドアローンプロジェクトなのでしょうか? 非GrailsプロジェクトでGORMをつかうことができるのでしょうか?
かなりの強化が行われています。もっとも注目すべきものの1つが、GORMをいくつかの代替データストア、NoSQLデータストアに対して利用できる、ということです。私たちはMongoDBとRedisプラグインの最新バージョンをリリースしました。ほかにも出てきます。みなさんはこのデータストアにアクセスするための標準のAPIを利用することができます。
また、私たちは新しいクエリ文法を導入しました。私はこれが動的ファインダやクライテリアAPIを引き継ぐものになると期待しています。私たちはそれをwhereクエリと呼んでいます。メソッドwhereを使いますが、標準的な記法を使うことになるため、JavaやGroovy開発者にとってとてもよいものになっています。Groovy/Javaの等価演算子やequalsやgreater thanを、論理演算子(&&, || など)をコード内で使うのと同じような方法で使うことができます。
whereメソッドはSQL/Java/GroovyカスタムDSLのように見える。InfoQではPeter氏にこれがどのように実現されているかを詳細にわたってたずねた。それを要約すると、whereメソッドの文法はGroovy AST変換を利用しており、それにより、コンパイラが型チェックやそれ以外のコンパイル時チェックを自然な形で行うことができるDSLクエリ言語が実現されている。単なる文字列以上のものなのだ。それはAST変換を利用した言語の一部なのである。非常にクールであり、魔法のようにすばらしい。Peter氏はGroovy AST変換を使うことで可能になるいくつかの非常に興味深いことについても話してくれた。
Grails 2.0とともに提供されるGORMはRedis、Riak、MongoDBのNoSQLサポートがある。また、Neo4jに対してはコミュニティの貢献によるものがある。
InfoQ: GORMはスタンドアローンプロジェクトですか?
はい、とも、いいえ、ともいえます。現状、その多くはGrailsデータマッピングプロジェクトの一部として実装されています。Grailsデータマッピングプロジェクトは基本的にSpring Dataプロジェクトの上につくられています。それらを直接使うことはできます。GORMをGrailsアプリケーションの外でMongoDBに対して使うことは可能です。
GORM for Hibernateはさらに作業が必要だと思います。いくつかのGORMコードがGrailsそのものの中にあります。GORMをGrailsの外で使うことを語る人がいますが、その場合彼らはGORM for Hibernateについて語っていると思います。私たちはもう少しやるべきことがあります。たいていの新しいGORMの機能は分離されたプロジェクトにあるのですが。
InfoQ: どのように古いアプリケーションをGrails 2.0にアップデートするのでしょうか?
いくつかのプロジェクトでは、単にgrails upgradeコマンドを実行するだけで十分です。いくつか修正が必要な変更がありますが、それは文書化されていますし、非常にわかりやすいものです。もしかすると、設定を追加する必要があるかもしれません。テンプレートを追加する必要があるかもしれません。Grails 2.0ユニットテストフレームワークを利用したいのであれば、すべてを新しいテストに合わせる必要があるでしょう。これはかなりの作業が必要かもしれません。
より重要なのはGrailsコアの外の方で、私たちは重要なプラグインがアップデートされていることを確かめるためかなりの作業を行いました。が、それ以外にまだアップデートが必要なプラグインが数多くあります。私たちは必要ならGrailsプラグインの作者とともにGrailsプラグインをGrails 2.0対応にするよう働きかけていくつもりです。
InfoQ: Grailsの浸透度合はどのようでしょうか? 採用数の増加は見られますか? 使う人は増えているように感じていますか?
もちろんです。メーリングリストのトラフィックは増えています。人々がGrailsを使っているという事例としての証拠も増えています。twitterなどでの言及も増えています。Grailsについて語る人が増えているようなのです。
私が見た興味深いことの1つがPHPバックグラウンドの人々がGrailsに移っていることがあるということです。こういうことは私たちがものの見方を変える手助けになります。GrailsはJava開発者だけのものではなく、JavaプラットフォームをJavaバックグラウンドを持たない人々にもアクセスしやすいものにしているはずです。
Indeed.comを見ると、Grails開発者に対する求人は増加しているようにみえる。この2年間で10倍になっているようだ。
InfoQ: Roo、Rails、Play frameworkといった類似のプロジェクトについての考えを教えて下さい。最近、アイデアレベルでの交流はありましたか? 類似点を見いだしている部分は? 関連するフレームワークについてどんなことでもよいので聞かせて下さい。
しばらくの間、交流がありました。そして、確かにRailsはGrailsに当初から強い影響を与え続けています。ただ、最近何かあるかについては私は詳しくありません。例えば、私たちの静的リソースサポートはRailsにおける同様の機能とは関係なく行われました。私たちがそれを実装して、その後でRailsが同様のものを実装したことを知ったのです。それは興味深いことであり、おそらく私たちがそのアイデアを借用したと思っている人もいるかもしれません。
しかしながら、私たちは、よいアイデアを借用することを嫌っているわけではないのです。たしかにSpring Rooインタラクティブコンソールは私たちのものに対しても大きな影響を与え、そのメリットを示してくれました。特に、Javaベースのシステムを扱う場合には、です。私たちは他のフレームワークも見続けています。RESTサポートがどのように行われたか、というようなことについて、何が積極的な借用なのか、何が単にそれらのことに気づいていただけだったのかを分けるのは難しいことです。そういうとき、それらのことは明示的になることなく進んでいきます。多くの新機能はまったくGrails固有のものです。GORM機能については特にそうです。ユーザからの機能の要求には他のフレームワークからくるものも確かにあるでしょうが、私たちはそのことを知る必要がないのです。