Gradle の依存関係を使いこなしてみる

Gradle でも Maven や Ivy と同じように簡単にライブラリの依存関係を解決することができます。
内部的に Ivy を利用しているようなので同じことができて当然なのですが...

まずは リポジトリの設定から...
ライブラリの取得先の Maven リポジトリのパスを 以下のように列挙しておくだけでよいです。

repositories {
    mavenCentral()                                                       // Maven セントラル
    mavenLocal()                                                         // ローカル
    mavenRepo url: [
        "http://repository.jboss.org/nexus/content/groups/public-jboss", // JBoss
        "http://repository.apache.org/content/groups/public",            // Apache
        "http://repository.springsource.com/maven/bundles/release",      // SpringSource
        "http://repository.codehaus.org",                                // Codehaus
        "http://download.java.net/maven/2",                              // Java.NET
        "http://download.java.net/maven/glassfish",                      // Glassfish
        "http://maven.seasar.org/maven2",                                // Seasar
        "http://m2repo.spockframework.org/snapshots",                    // Spock スナップショット
        "http://bluepapa32.github.com/maven"                             // おまけ...
    ]
}
上記には代表的な Maven リポジトリを列挙してあります。
Maven セントラル と ローカルリポジトリについては メソッドが用意されています。
将来的には 他のリポジトリもメソッド化されるかも...

リポジトリの設定が終わったらいよいよ依存関係の設定です。

まずは 基本的な設定から...
依存関係は

dependencies {
    compile 'javax.servlet:servlet-api:2.5'
    compile group: 'javax.servlet', name: 'servlet-api', version: '2.5'
}
のように dependencies クロージャに設定します。
上記はどちらも全く同じ設定ですので、どちらの形式で設定してもよいです。
依存関係はコンフィグレーションに割り当てます。
コンフィグレーションを使えば、そのコンフィグレーションに割り当てられた依存関係を使うことができます。
例えば、上記の場合 compile コンフィグレーションに servlet-api を割り当てています。
compileJava や compileTest では compile コンフィグレーションに割り当てられた servlet-api をクラスパスに設定します。

通常、一つのコンフィグレーションには複数の依存関係を割り当てます。
複数の依存関係を割り当てる場合は

dependencies {
    // 列挙
    compile 'javax.servlet:servlet-api:2.5'
    compile 'javax.servlet:jsp-api:2.1'

    // リスト
    compile [ 'javax.servlet:servlet-api:2.5',
              'javax.servlet:jsp-api:2.1' ]

    // リスト カッコなし
    compile 'javax.servlet:servlet-api:2.5',
            'javax.servlet:jsp-api:2.1'
}
のように列挙するか もしくは リスト形式で書けばよいです。

ごくまれに classifier を JAR ファイル名に付与して管理しているライブラリがあります。
例えば、Json-lib がそうです。その場合は

dependencies {
    compile 'net.sf.json-lib:json-lib:2.3:jdk15'
    compile group: 'net.sf.json-lib', name: 'json-lib', version: '2.3', classifier: 'jdk15'
}
のように dependencies クロージャに設定します。
これもどちらも全く同じ設定です。

ローカルにあるライブラリに依存する場合もあります。

dependencies {
    runtime files('libs/a.jar', 'libs/b.jar')
    runtime fileTree(dir: 'libs', include: '*.jar')
}
上記は それぞれ Ant の filelist と fileset と ほぼ同じです。

Gradle は デフォルトでは 推移的に依存関係を解決します。
推移的な依存解決とは 例えば

dependencies {
    compile 'commons-logging:commons-logging:1.1'
}
という依存関係を設定した場合、commons-logging だけではなく commons-logging が依存する も依存関係に設定してくれるという便利な機能です。
しかし、これは 非常に便利な反面 大きなお世話と言うときがたまにあります。
上記の例で言えば commons-logging の SimpleLog を使う場合、他のライブラリは必要ないので commons-logging だけを依存関係に設定したいです。 その場合は
dependencies {
    compile('commons-logging:commons-logging:1.1') { transitive = false }
    compile group: 'commons-logging', name: 'commons-logging', version: '1.1', transitive: false
}
のように推移的依存解決を無効できます。
上記はどちらも全く同じ設定ですので、どちらの形式で設定してもよいです。

更に 何かの事情で logkit だけは必要ないという場合もあります。
別に logkit なら必要なくてもそのままそっとしておけば良いのですが、実際使うことのないライブラリに限って Maven リポジトリに公開されていなくて ローカルリポジトリにインストールしないといけなかったり… その場合は

dependencies {
    compile('commons-logging:commons-logging:1.1') {
        exclude module: 'logkit'
    }
}
のように推移的依存関係から logkit だけ除外することもできます。