GradleでEclipseの設定ファイルを生成するときにクラスパス変数GRADLE_REPOを使う

2012/3/21追記

id:Hirohiroさんによれば、Gradle 1.0-milestone-9から後述の方法がdeprecatedになってるそうです。最新の方法は↓を参照ください。他にもEclipseでGradleを使うための素敵なTipsが紹介されてます。

以降はオリジナルのエントリ本編(参考として残しておく)

Maveneclipse:eclipseをやって生成させた.classpathもそうなんですけど、とりあえずデフォルトで生成するとソースディレクトリのパスとして、コマンド実行したユーザ環境のフルパスが入ってしまったりします*1Mavenの設定でそれを回避しようとしたこともありましたが、結局よくわからなくてあきらめました。頑張ればできるのかな?


さて、Gradleでもeclipseプラグインを導入するためにbuild.gradleに1行書けば

apply plugin:'eclipse'

あとは、gradle eclipseコマンドによって.projectと.classpathを生成できます。


で、Gradleの場合、デフォルトではバイナリjarもソースjarもどちらもフルパスで出力されてしまいます。これでは、他の開発者の環境でイヤんなことになりますし、ローカルのユーザ名が恥ずかしい感じの人は重大なセキュリティ事故になってしまいます。

というわけで、M2_REPOのような感じでGRADLE_REPOクラスパス変数を使ってもらうようしたいんですが、調べてみたらとても簡単でした。

build.gradleにさらにもう1行追加するだけ。

apply plugin:'eclipse'
eclipseClasspath.variables = [ GRADLE_REPO: file(System.properties['user.home'] + '/.gradle/cache') ]

これで、GRADLE_REPOを使ったパスになってくれます。

これで各開発者はEclipse上でクラスパス変数としてGRADLE_REPO=$HOME/.gradle/cache *2を登録しておけばよいことになります。

あと、$GRADLE_REPO配下に実際にjarが存在しないとだめなので、Eclipse世界しか知らない開発者も一度はGradleでビルドして各種依存jarをダウンロードしておく必要がありますのでご注意。

おまけ

よくわからないので、フックを使って

eclipseClasspath {
    whenConfigured { classpath ->
        // TODO 2回実行するとエントリが重複するのは何故?
        // jarファイルへのパスをEclipse上のクラスパス変数GRADLE_REPOを使った記述に置換する。
        def replaceByVariable = { it.replaceFirst('.*/.gradle/cache', 'GRADLE_REPO') }
        classpath.entries = classpath.entries.collect { entry ->
            if (entry.kind == 'lib') {
                def path = replaceByVariable(entry.path)
                def sourcePath = replaceByVariable(entry.sourcePath)
                return new org.gradle.plugins.ide.eclipse.model.Variable(
                    path,
                    entry.exported,
                    entry.nativeLibraryLocation,
                    entry.accessRules,
                    sourcePath,
                    entry.javadocPath
                )
            }
            return entry
        }
    }
}

とか努力してハマった後に、よくドキュメントを読んでみたらあっさりvariablesプロパティがみつかったという訳です。というわけでドキュメントはよく読みましょう。

*1:確かバイナリのjarのパスはM2_REPO変数が使われていたような...うろ覚えですが

*2:実際には絶対パスで展開して指定します