Grails の依存関係を Gradle で解決する

今日から12月で、Advent Calendar が各コミュニティで始まりました。どんなネタがあがってくるか楽しみですね。
私も Advent Calendar っぽくブログ更新をまめにしようかとか思ってますが…どうだか。

数カ月前に Grails をすこし触ったっきりで、まったく進展していませんでした。
ちょっとアプリを作る必要ができてたので Grails に再挑戦しています。

Grails アプリケーションはそのまま Eclipse プロジェクトになる

grails create-app」コマンドで Grails アプリケーションのひな形ができあがります。
このひな形の中身を見てみると、.project というファイルがあります。Eclipse のプロジェクト設定ファイルです。

ということで、Eclipse にそのままインポートすることができます。

引き続いて「grails create-controller」コマンドでコントローラのひな形を作ると困ったことになりました。
テストクラスで @TestFor アノテーションgrails.test.mixin.TestFor)を使っておりコンパイルエラーが発生します。

基本的に Grails コマンドでテストやアプリ実行をおこなうので、別にコンパイルエラーが発生していても良いらしいのです。
が、コンパイルエラー放置は健康的によろしくないので、jar を持ってきます。

Gradle を使って依存関係を解決する

依存関係の解決は Gradle を使っているので、次のような build.gradle を作って「gradle eclipse」を実行します。

apply plugin: 'groovy'
apply plugin: 'eclipse'

repositories {
    mavenCentral()
}

dependencies {
    groovy'org.codehaus.groovy:groovy:1.8.8'
    
    testCompile'junit:junit:4.11'
    testCompile'org.spockframework:spock-core:0.6-groovy-1.8'
    
    testCompile'org.grails:grails-plugin-testing:2.0.4'
}

大量の依存関係(jar ファイル)が追加されるのですが、依存関係漏れが発見されました。
org.springframework.uaa.client-1.0.1.RELEASE.jar が必要なようですが、依存関係に追加されていません。

testCompile 'org.springframework.uaa:org.springframework.uaa.client:1.0.1.RELEASE'

といった依存関係追加の指定をしてみましたが、意味なし。

レポジトリの指定を追加する

色々と調べてみた結果、Grailsレポジトリで該当ライブラリが公開されていることを突き止めました。
「これはもしかして、repositories に URL を追加するパターンか!?」と思いつき、次のように build.gradle を修正すると依存関係に
org.springframework.uaa.client-1.0.1.RELEASE.jar が追加されました。

apply plugin: 'groovy'
apply plugin: 'eclipse'

repositories {
    mavenCentral()
    
    maven {
        url'http://repo.grails.org/grails/core/'
    }
}

dependencies {
    groovy'org.codehaus.groovy:groovy:1.8.8'
    
    testCompile'junit:junit:4.11'
    testCompile'org.spockframework:spock-core:0.6-groovy-1.8'
    
    testCompile'org.grails:grails-plugin-testing:2.0.4'
}

org.springframework.uaa.client-1.0.1.RELEASE.jar は Maven セントラルレポジトリにはなかったので、Grailsレポジトリから取得する必要があったということです。
今まで Maven レポジトリだけで事足りていたので、今回はじめて別のレポジトリを使う機会となりました。

今後の展開

Grails を使う際の依存関係の設定はこれだけではないと思います。(まだ始めたところなので)
必要になったら、追々更新していきます。

とはいえ、もっといい方法があるはずと内心おもってます。
Grails と Gradle は相性いいはずなので…