Gradle Eclipseプラグイン(Buildship)でdefaultOutputDirを上書きさせない

古いGradleプロジェクトをEclipseで開いたら、クラスファイルの出力先が変わっているという相談を受け調べたのでメモ。

追記

Eclipse 2019-09だと、この方法が使えない模様。以下参照。

Eclipse 2019-09にしたらGradle(Buildship)でdefaultOutputDirの指定ができなくなった - 毎日へっぽこ

環境

Eclipse 2019-03、Buildship 3.0.1で確認。

状況

build.gradleには以下の記述で、ソースフォルダの出力先がclassesに指定してある。

eclipse {
  classpath {
    defaultOutputDir = file('classes')
  }
}

古いEclipseだと、 classes 配下にclassファイルが出力されていたそうだが、Eclipse 2019-03を使うとメインの出力先が bin/main 、テストの出力先が bin/test に変わっていた。

出力される .classpath を見ると、 <classpathentry output="bin/main" kind="src" path="src/main/java"> のように、classpathentry タグに output 属性が追加され、デフォルト出力先が上書きされている。

調査

issueがあった。

github.com

Gradleはソースフォルダの出力先を指定するようになったので、デフォルト出力先は使われなくなった模様。

出力先は固定で、変更したければ classpath.file.whenMerged 使えというのが残念。

プロパティ設定で変更できるように、というissueもあるけど、取り込まれてはいない模様。

github.com

対応

whenMerged 使わないといけないのはともかく、ソースフォルダごとに classes を指定しないといけないのもいまいちと思っていたら、以下の記事を見つけた。

www.gwtcenter.com

output 属性に null を設定すると属性自体が消えるため、以下の記述でデフォルト出力先を有効にできた。

eclipse {
  classpath {
    defaultOutputDir = file('classes')

    file.whenMerged {
      entries.each { entry ->
        if (entry.kind == 'src' && entry.hasProperty('output')) {
          entry.output = null
        }
      }
    }
  }
}

感想

Gradle、まだまだ枯れてないのかな?

このプロジェクトでは、ライブラリの依存性管理ツールとしてしか使われていなかった。Gradleを使う必要がなければ、枯れたMaven使っておくのが無難かと思う。

いざとなったら、GradleからMavenプラグイン使えばいいわけですし。