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

BuildshipでdefaultOutputDirを指定していたがEclipseを2019-03から2019-09に更新すると、エラーが出るようになった。

Eclipseの仕様変更が原因のようなのでメモ。

環境

Eclipse 2019-09、Buildship 3.1.2で確認。

状況

前回の記事の設定だと、Eclipse 2019-09ではビルドできなくなった。

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

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

調査と対応

Eclipse上にて、Javaプロジェクトのプロパティから設定を確認すると、 src/main/javasrc/test/java の出力フォルダを同じフォルダにした場合、設定の保存や反映ができなくなった模様。

Eclipse側での、ドキュメントの類は見つけられなかったため、挙動からの推測。まあ、普通mainとtestの出力先を同じにしたりはしないだろうし。

作業

とりあえず、mainとtestの出力先を分けたらビルドできるようになった。また、テスト用の場合、 entryAttributes.test がtrueになるようなので、それも設定。

eclipse {
  classpath {
    file.whenMerged {
      entries.each { entry ->
        if (entry.kind == 'src') {
          if (entry.path ==~ /src\/main\/(java|resources)/) {
            entry.output = 'classes'
          }
          else if (entry.path ==~ /src\/test\/(java|resources)/) {
            entry.output = 'test-classes'
            entry.entryAttributes.test = true
          }
        }
      }
    }
  }
}

これ書きながら、そもそも defaultOutputDir を使う意味がなくなったので、単純に sourceSets.main.output.classesDir などを設定してやるのと変わらないんじゃないかと思った、後で試す。

2019/11/1 追記

試してみたがダメだった。結局、 .classpathbin/mainbin/test で出力されてしまう。

とりあえず、無理矢理デフォルトの build/ 配下に出力するよう設定してみた。

eclipse.classpath.file.whenMerged.entries.each { entry ->
  // kind == 'src' で判定すると、プロジェクトのディレクトリ自体もtrueになるので、クラス名を指定
  if (entry.class.simpleName == 'SourceFolder') {
    def paths = entry.path.split('/').drop(1)
    entry.output = "build/${paths[1] == 'resources' ? '' : 'classes/'}${paths.reverse().join('/')}"

    if (paths[0] == 'test') {
      entry.entryAttributes.test = true
    }
  }
}

振り返り

Eclipseのバージョン上げたらビルドできないと聞いた時の驚き!

今さらEclipseのビルド設定で問題が起こるとは思っていなかった。

仕事で使う分には、Mavenのほうが楽かなと思う。