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/java
と src/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 追記
試してみたがダメだった。結局、 .classpath
に bin/main
や bin/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のほうが楽かなと思う。