[gradle] Eclipse Gradle STS Support と gradle-gae-plugin

はじめに

Gradleが気になっていたので使ってみたメモ。
Eclipseと統合されているのがよいので、Eclipseの拡張機能(Gradle STS Support)を試してみた。
ついでにGoogle App Engineのアプリケーションをgradleからデプロイする方法も試してみた
今回試したのは下記のバージョン。

セットアップ

Gradleのサイトによると、SpringSourceのSTS(Spring Tools Suite)にGradleサポート機能があり、Gradle機能だけを個別にインストールできるとのこと。Springを使うわけではないのに(いや、使うにしても)重量級のSTSを入れなくてもすむのは助かる。

Gradle STS Supportのインストール方法はGradle STS Support — 2.9.0 — Installation(英語)の通り。一緒に gradle-1.0-mileston-7 もプラグインとしてインストールされるので、gradle自体のインストールは不要(※単なるJavaプロジェクトならこれでも十分だと思うが、実際は gradle-gae-pluginが動かなくて結局別のバージョンを使った。詳しくは後述する)

まずはeclipseでプロジェクト構成を作る。デフォルトのディレクトリ構造にしておくと(もちろん変更できるが)面倒が少ない。webアプリケーションのファイル(jspなど)はwarプラグインのデフォルトディレクトリ構造にしておく。

で、build.gradleを書いて、プロジェクトのディレクトリ直下に置く。GAEとslim3を使う場合はこのような例に。

build.gradle
apply plugin: 'java'

def gaeVersion = '1.6.4'
def slim3Version = '1.0.15'

repositories {
    mavenCentral()
    mavenRepo(url: 'http://maven.seasar.org/maven2/')
}

dependencies {
    compile 'javax.servlet:servlet-api:2.5'
    compile 'javax.servlet:jsp-api:2.0'
    compile "com.google.appengine:appengine-api-1.0-sdk:$gaeVersion"
    compile "com.google.appengine:appengine-api-labs:$gaeVersion"
    compile ("org.slim3:slim3:$slim3Version") {
        exclude group: 'com.google.appengine', module: 'appengine-api-1.0-sdk'
    }
}

Gradle STS Support — 2.9.0 — Tutorial(英語)に使い方は書いてあるが、下記に簡単に書く

  • (チュートリアルではImportを使っているが、)プロジェクトの右クリックメニュー→[Configure]→[Convert to Gradle Project]をすると、Gradleプロジェクトとして認識される。チュートリアルに出てくるような「G」マークがプロジェクトに付くようになる
  • build.gradleを右クリックメニュー→[Gradle]→[Enable Dependency Management]を選ぶと、ビルドパスに[Gradle Dependencies(persisted)]というLibraryが追加され、build.gradleに書いた依存関係にあるjar(dependencies {…}に書いたslim3-1.0.15.jarなど)が追加される。
    • なお、build.gradleのdependenciesの記述を更新しても自動的には反映されない。手動で[Gradle]->[Refresh Dependencies]を実行する必要がある
  • Gradle Tasks Viewを開き、[Project]を選択すると、タスク一覧が表示される。たとえば compileJava をダブルクリックすればGradleによってコンパイルが動作する
  • もちろん、Eclipseのビルドパスにjarが追加されているのでEclipseでのコンパイルもできる

Google Eclipse Pluginでのデプロイには、warディレクトリを構成しなくてはいけないので、そういうCopyなどのタスクを定義するというやり方もあるだろう。
しかしもう少しスマートに gradleから Google App Engineに Deployする方法を書く。この方法だとGoogle Eclipse Pluginは特に不要である。

gradle-gae-plugin

gradleは汎用的に設計されたビルドツールであり、例えば javaをビルドしたいときは apply plugin: 'java' と記述して、 java プラグインを適用する。javaやscalaなどの標準で組み込まれているプラグインが多数あるが Google App Engineのプラグインは標準にはない。今回使用するgradle-gae-pluginはbmuschko氏のサードパーティ製プラグインである。
使い方は簡単で、readmeにあるとおり下記をそれぞれ追加するだけである。(7/7 0.7.3時点のreadmeに修正。今はグループIDがorg.gradle…になり、maven central repositoryから取得可能となった)

pluginを指定する

apply plugin: 'gae'

buildscriptを記述する

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'org.gradle.api.plugins:gradle-gae-plugin:0.7.3'
    }
}
ちなみに:

buildscriptdependenciesには、このgradleビルドスクリプトを動作させるために必要なライブラリへの依存関係を解決するためのもので、サードパーティのプラグインをここで定義する。先に述べたdependenciesのcompileなどに定義しても動くと思うが、compileに定義したjarは war/WEB-INF/libの下に含まれてしまう。gradle pluginや、例えば slim3-gen.jarのようなビルドスクリプト動作時にのみ必要なライブラリはここに書くのがよい。

さてここで EclipseのGradle Tasks Viewを更新する。(矢印が回転しているアイコンのボタンをクリック。ツールチップに「Refresh task list」とでる)
すると、下記のエラーになって止まってしまう。

org.gradle.internal.service.ServiceRegistry
Could not fetch model of type 'EclipseProject' using Gradle distribution 'http://repo.gradle.org/gradle/distributions/gradle-1.0-milestone-7-bin.zip'.

ここでEclipseのメニューバー[Window]→[Preferences]→[Gradle]のGradle DistributionのURIに

と入力したところ、うまく動作した。

現象的にはGRADLE-2185の問題に近いと思われる。
実際、いろいろ調べている間、milestone-9で上記同様の指定をしたのだがうまく動かなかった。そのうちrc-1がリリースされて試してみたらうまくいった。

Gradle Tasks Viewに gaeXxxというタスクが並んで見えるようになるはず。
デプロイの場合は、その中のgaeUploadというタスクを実行し、appspotのログインID(emailアドレス)やパスワードを入れるとデプロイができる。他のタスクについては、readmeを参照のこと。

gaeDownloadSdkについて

Google App EngineのSDKをどこかに展開している人は、環境変数のAPPENGINE_HOME または システムプロパティの google.appengine.sdk にパスをしていしておけばよいが、gradle-gae-pluginにはSDKをダウンロードしてくるタスクもある。これでどの環境でも同じSDKのバージョンを使用することになるし、SDKのバージョンアップもGradleのビルドスクリプトだけで完結する。

依存関係として、gaeSdk configurationに、GAEのSDKを指定する。

dependencies {

    //compile .......
    //  ..... 

    gaeSdk "com.google.appengine:appengine-java-sdk:$gaeVersion"
}

gae.downloadSdk = trueを指定する

gae {
    downloadSdk = true
}

それから、gradle-gae-pluginのバグなのか、二回目以降のビルドで gaeDownloadSdkがUP-TO-DATEの時にSDKパスがAPPENGINE_HOME にも google.appengine.sdkにも指定されていないというエラーとなってしまうので、自分はこのように設定している
(7/7訂正 0.7.3で確認したところsystem propertiesの設定は不要になっていた。バグだったのがFIXされた模様)

gae {
    downloadSdk = true
    System.properties['appengine.sdk.root'] = gaeDownloadSdk.explodedSdkDirectory.getPath() + File.separator + "appengine-java-sdk-$gaeVersion"
}

4/18追記
gaeUploadの途中でemailとpasswordを聞かれ、Eclipseのコンソールに入力すると動作していたのだが、最近うまく動かなくなったので回避策を。

build.gradleのgae{}にappcfg{}を定義して、emailとpassIn=trueを設定。
※ここにpassword=xxxxxxxと入れてもよいが、build.gradleはリポジトリに入れてるので外だしにする。

gae {
    appcfg {
        email = 'your_email_address@gmail.com'
        passIn = true
    }

    downloadSdk = true
    System.properties['appengine.sdk.root'] = gaeDownloadSdk.explodedSdkDirectory.getPath() + File.separator + "appengine-java-sdk-$gaeVersion"
}

~/.gradleディレクトリ(Windows 7の場合は C:\Users\ryo-murai\.gradleなど)にgradle.propertiesファイルを置いて、下記のように書く。

gradle.properties

gaePassword=your_google_password

これで、指定したemail/passwordが使用される模様。
追記おわり

まとめ

  • EclipseとGradleの統合に、EclipseプラグインであるGradle STS Supportを使ってみた
  • Google App Engineへのデプロイにgradle-gae-pluginを使ってみた
    • Gradle STS Support同梱の gradle-1.0-milestone-7では動かないので、1.0-rc-1を指定する
  • gaeDownloadSdk使ってもSDKへのパス設定が必要だった。(オレだけ?)

補足

この記事のリンクは
gradle-1.0-rc-1のマニュアルやGradle STS Support 2.9.0のドキュメントを参照しているが、GradleはURLの /docs/1.0-rc-1/userguide//docs /current/userguide/に、またSTSは/sts/docs/2.9.0/reference//sts/docs/latest/reference/に変更すると、最新のバージョンのドキュメントへのURLとなる。

広告