読者です 読者をやめる 読者になる 読者になる

GradleでEclipseの設定ファイルを生成するときにlib直下のjarを相対パスにする

GradleでEclipseの設定ファイルを生成するときにクラスパス変数GRADLE_REPOを使う - 豆無日記では、Gradleのローカルリポジトリ(キャッシュ)への絶対パスをGRADLE_REPOのような変数に置換して、Eclipseの設定ファイルを複数人で共有するための方法を考えました。

で、id:Hirohiroさんが書かれてたように、現在の最新Gradle1.0ではそれはすごく簡単になってて

eclipse {
    pathVariables 'GRADLE_USER_HOME': gradle.gradleUserHomeDir
}

でOKです。(どうやらGRADLE_REPOじゃなくてGRADLE_USER_HOMEの方が多数派みたい)


今回のはちょっと違ってて、プロジェクトディレクトリの直下にあるlibに対するクラスパスの話。

gradle eclipseを実行するとlibは以下のjarも全部.classpathに列挙されるんだけど、やっぱりそれも絶対パスになってしまい、せっかく相対パスで書きやすいはずのlib直下なのに残念な感じです。

で、それを回避する方法はどうにも見つからなくて

eclipse {
    pathVariables '.': projectDir
}

とやってみると、パスそのものは相対パスっぽくなるんですが、.classpath上の内部のエントリ種別としてクラスパス変数を利用するタイプのものとして認識されてしまい、Eclipse君がjarを見つけることができませんでした。

結局、以前にやったようにフックを使って書き換えることで回避しました。

    eclipse.classpath.file {
        whenMerged { classpath ->
            classpath.entries.findAll { entry -> entry.kind == 'lib' }.each {
                it.path = it.path.replaceFirst("${projectDir.absolutePath}/", '')
                it.exported = false
            }
        }
    }

以前使ったフックであるeclipseClasspath.whenConfigured はdeprecatedだったのでまだ生きてる別のフックを使ってます。