追加したユーザーは Kazuchika Sekiya です。最後に編集したユーザーは Kazuchika Sekiyaで、その日時は 2009-04-13 01:19:06 です。
原文: http://blog.springsource.com/2009/04/07/write-your-google-app-engine-applications-in-groovy/
翻訳: Kazuchika Sekiya

GroovyでGoogle App Engine用のアプリを書こう


Posted on April 7th, 2009 by Guillaume Laforge in Groovy/Grails, Java, Web.

先ほどGoogleが、彼らのGoogle App Engineクラウドホスティングプラットフォームで、 新たにPython以外の言語、すなわちJavaとGroovyをサポートすることを発表しました!

さてこれでGoogle App EngineアプリをGroovyで効率よく書くことができます!

数週間前、SpringSourceのGroovyチームとGoogle App EngineのJavaチームは、数々の賞を受賞した人気のJVM用動的言語Groovyが、このエキサイティングなプラットフォーム上でうまく実行できることを確実にするため、詳細を調整し、一致協力して働きました。制約された厳格なセキュリティマネージャのポリシーに関係した、Groovyのいくつかのパッチを共同で作成した後、Groovy開発チームはこれらのパッチを統合し、D-Day(訳注:新Google App Engineのリリース日)にあわせて最新のGroovy 1.6.1バージョンをリリースしました。この新しいリリースを使えば、WEB-INF/libディレクトリの"groovy-all" JARを直接利用して、今すぐにGroovyでアプリケーションを書き始め、それをGoogleのインフラ上でホストすることができるのです。

この記事では、初めてのGroovy製App Engine用webアプリを作るための、いくつかの簡単なステップを順を追って見ていきます。App Engineのドキュメントで十分に解説されているので、基本的なインストールステップは省略し、Groovyアプリケーションの構築という本質的な点により焦点を絞っていきます。この先で見ていくように、これはとても簡単です。

さあ始めよう


まずはじめに、当たり前ですが、Google App EngineでGoogleアカウントを登録する必要があります。そうすればこのプラットフォーム上でアプリケーションを作成でき、クラウドにアップロードすることができるのです。また、Google App Engine Java SDKをダウンロードしてインストールすることも必要です。これらのステップのためには、オンラインドキュメントをチェックするとよいでしょう。必要な詳細がすべて説明されています。

SDKをインストールしたら、このチュートリアルではもちろん、Groovy 1.6をダウンロードしてインストールしてください。本当にGroovyをインストールしておく必要があるのは、servletをコンパイルする必要があるこの記事の前半だけです。残りの部分では、Groovyランタイム自体によってコンパイルされるGroovletを使うので、不要になるでしょう。

Java、SDK、そしてインストールしたGroovyを使えば、次に進んで、このGroovy-readyなプロジェクトテンプレートをベースに、新しいプロジェクトを始めることができます。スケルトンをダウンロードして適当なディレクトリでunzipし、何が入っているか眺めてみましょう!クリスマスプレゼントを開けるみたいでしょ?


テンプレートプロジェクトをgaedemoというディレクトリでunzipしてみました。このディレクトリのルートには、コンパイルする必要があるすべてのGroovy/Javaソース(servlet、ドメインクラス、ユーティリティクラスなど)を入れるsrcディレクトリがあります。deployディレクトリは、基本的には展開したwebappに対応しています:コンパイルされたクラスを入れるclassディレクトリ、さまざまなJAR(Groovy JARやGoogle App Engine自体のAPI JAR)を入れるlib、そして、この記事の後半で開発するGroovletを入れるgroovyなどがあります。また、App Engine固有のディスクリプタである、appengine-web.xmlファイルにも気づいたと思います。servletやマッピングなどを定義する、標準的なweb.xmlファイルも存在します。

クラスをコンパイルする

上のプロジェクト構造の概要を念頭に置きつつ、キーとなるファイルそれぞれに何が含まれているか見ていきましょう。まずはbuild.groovyファイルから始めます。ここでは、Antのビルドではなく、軽量のDSLで、AntとAntタスクのスクリプトラッパーである、GroovyのAntBuilderを利用しました:

def ant = new AntBuilder().sequential {
    webinf = "deploy/WEB-INF"
    taskdef name: "groovyc", classname: "org.codehaus.groovy.ant.Groovyc"
    groovyc srcdir: "src", destdir: "${webinf}/classes", {
        classpath {
            fileset dir: "${webinf}/lib", {
                include name: "*.jar"
            }
            pathelement path: "${webinf}/classes"
        }
        javac source: "1.5", target: "1.5", debug: "on"
    }
}

AntBuilderのインスタンスを生成し、ターゲットのWEB-INFディレクトリのためのプロパティを作った後、groovyc(Javaクラスのコンパイルをjavacコンパイラに委譲することによって、相互依存するGroovyとJavaのクラスをまとめてコンパイルできるGroovyのジョイントコンパイラ)のAntタスクを定義しています(両言語のシームレスなインターオペラビリティのまた一つの証明です)。タスク定義の後、このタスクを呼び出し、WEB-INF/libの中のJARとコンパイル済みのクラスからなるクラスパスを使って、ソースコードをコンパイルすることができます。

このビルドファイルを呼び出してプロジェクトをコンパイルするには、(Groovyがすでにインストールされているとして)次のコマンドを使うだけです:

groovy build

プロジェクトディスクリプタを設定する

appengine-web.xmlファイルは、Google App Engineにアプリケーションをデプロイするために必要ないくつかのメタデータを含んでいます。具体的には、アプリケーションの名前やバージョン番号をここで定義します。自作のアプリケーションの名前を使うために、このファイルを修正する必要があるでしょう。今のところ、ディスクリプタは次のようになっています:

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>myowngroovy</application>
    <version>1</version>
</appengine-web-app>

最初のservletを作る

Groovletに進む前に、まず古き良きServletから始めましょう!Google App EngineはServlet 2.5仕様をサポートしているので、簡単なHello World! servletを書くことができます。srcディレクトリに、以下のコードが入ったHelloServlet.groovyという名前のファイルを作ります:

import javax.servlet.http.*

class HelloServlet extends HttpServlet { void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.contentType = "text/plain" resp.writer.println "Hello Google App Engine Groovy!" } }

これは一見、ごく普通のJava servletのように見えますが、Groovyがもたらす簡潔な構文(セミコロンや"public"キーワードの省略、ゲッター/セッターのためのプロパティ記法)に気づくと思います。

さて次に、下記のようにweb.xmlでこのservletを参照するようにする必要があります:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

servletの設定ができたら、先ほどの短いビルドファイルを使ってservletをコンパイルすることを忘れないでください:

groovy build

アプリケーションをクラウドにアップロードする!

Google App Engine SDKが正しく設定できていれば、プロジェクトのルートで次のコマンドを実行できるはずです:

appcfg.sh update deploy/
このコマンドは初回起動時には認証のための入力を要求し、次からは以下のような出力行を表示するでしょう:

Reading application configuration data…
Beginning server interaction for myowngroovy…
0% Creating staging directory
5% Scanning for jsp files.
20% Scanning files on local disk.
25% Initiating update.
28% Cloning 5 application files.
40% Uploading 1 files.
52% Uploaded 1 files.
90% Deploying new version.
95% Will check again in 1 seconds
98% Closing update: new version is ready to start serving.
99% Uploading index definitions.
Update complete.
Success.
Cleaning up temporary files...

"Success"の文字が見えたら、すべてがとても順調に進んだことが確実で、アプリケーションのアクセス準備は完了です!次のようなURL(あなたがつけたアプリケーション名に依存します): http://myowngroovy.appspot.com/hello からservletにアクセスすれば、素敵な"Hello Google App Engine Groovy!"メッセージが表示されるでしょう!

Groovletの出番だ!


古典的なJava servletをGroovyで書くのはエキサイティングですか?初めてservletを書いて動かしたあの日を思い出すでしょうか?実際はそうでもないですよね。今ではだいぶ古くさい感じがします。幸運なことに、GroovyにはGroovletという武器が備わっています!

簡単に言うと、Groovletは単にWEB-INF/groovyに置かれたGroovyスクリプトのことで、Groovyのservletディスパッチャによってコンパイルされ、表示されます。

まず、GroovyServletの設定と、*.groovyというパターンを持つすべてのURLをそれにリダイレクトするようなURLマッピングを追加するために、web.xmlを修正しましょう:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
        <servlet-name>GroovyServlet</servlet-name>
        <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>GroovyServlet</servlet-name>
        <url-pattern>*.groovy</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

これができたら、WEB-INF/groovyの下にhello.groovyという名前の最初のGroovletスクリプトを作ります:

html.html {
    head {
        title "Hello"
    }
    body {
        p "Hello Groovy World!"
    }
}

このGroovyスクリプトは、スクリプトのバインディングに設定されているhtml変数を使っています。これはMarkupBuilderのインスタンスで、XMLやHTMLのようなマークアップを生成するための簡単で便利なDSLです。println文を使って生のHTMLを文字列の形式で出力するかわりに、MarkupBuilderによってより明確でGroovyな構文が実現されています。もちろん、ループや条件文などを一緒に使えば、このマークアップを好きなだけ動的にすることもできます。

アプリケーションを再アップロードした後、次のURL http://myowngroovy.appspot.com/hello.groovy からこのGroovletにアクセスすることができます。GroovletスクリプトのコンパイルはGroovyServletがやってくれるので、今回は何もコンパイルする必要はありません。

簡単でしたか?

さてお次は?


ここまで、まだごく表面的なところしか説明していませんが、Groovyを使い始めるには十分でしょう。Google App Engine APIにはまだまだ面白いサービスがたくさんあり、Groovletやservletから利用することができます:
  • オブジェクトの保存を可能にするデータストアAPI(低レベルのスキーマレスAPIまたはJDOを使って)
  • イメージの変換やフィルタリングを行うイメージAPI
  • emailを送信するメールAPI
  • 高価なデータ構造や計算結果をキャッシュするmemchache API
  • リモートURLのコンテンツを取得するURL fetcher API
  • Googleユーザアカウントを使った認証のためのユーザAPI

もちろん、これらすべてのサービスはGroovletスクリプトから使用可能です。また、サードパーティ製のライブラリをWEB-INF/libに置いて使うこともできます。薄いGroovyレイヤを上に設けることで、より簡潔で気の利いた使い方ができないか、もっといろいろなAPIを調べたら面白いでしょう。

現時点では、Groovletと標準servletは完全にサポートされていますが、例えばGrailsアプリケーションはGoogle App Engineの現在のバージョンでは使えません。私たちは引き続きGoogle App Engineチームと協力していく予定なので、より本格的なアプリケーションのために将来Grailsが使えるようになるかもしれません。

GroovyやGrails自体、GroovyでApp Engineアプリをどう作るか、といったことに興味があるなら、GR8カンファレンスに参加することも考えてみてはどうでしょう。これはGroovy、Grails、Griffon専門のカンファレンスで、これらの技術のエキスパートや開発者をスピーカーに迎え、実践的なハンズオンセッションもあります。そして、このApp EngineでのGroovyサポートの発表で、私たちがこのカンファレンスでそれについて話すことも確実になりました!

App EngineでのGroovyについて、フィードバックをいただけることを楽しみにしています。クラウド用のGroovyアプリ開発をより良くするための提案は何でも大歓迎です。
子ページ 追加

©2008-2009 grails.jp