mike-neckのブログ

Java or Groovy or Swift or Golang

GradleでJDK8u60の-parametersオプションがうまく渡ってないっぽかった件の顛末

一昨日のエントリーがなんかすごいバズってしまって、((((;゚Д゚))))ガクガクブルブルしてるのですが、Gradleでビルドした時にテストがコケると言っていました。

mike-neck.hatenadiary.com

これをGradle Forumで質問して回答をもらいました。

discuss.gradle.org

回答曰く、

ライブラリーをコンパイルしたのと同じコンパイルオプションを渡さないと、利用者の方でも同じ機能を利用することができない

とのことでした。僕のビルドスクリプトではテストの方のコンパイルオプションには-parametersが渡っていないために、リフレクションでラムダのパラメーター名を取得する機能が利用できていなかったということですね。


ついでにDSLのアドバイスも貰いました。

tasks.withType(JavaCompile).each {
    targetCompatibility = jdkLevel
    sourceCompatibility = jdkLevel
    options.encoding = encoding
    options.compilerArgs << '-parameter'
}

って書くよりも、

tasks.withType(JavaCompile) {
    targetCompatibility = jdkLevel
    sourceCompatibility = jdkLevel
    options.encoding = encoding
    options.compilerArgs << '-parameter'
}

って書くほうがいいよ、とのこと。

で、確かにドキュメントを読んでいると、二つのメソッドがあって、

  • DomainObjectCollection<S> withType(Class<S> type)
  • DomainObjectCollection<S> withTYpe(Class<S> type, Closure configuration)

僕は前者の方を使っていたけど、前者はライフサイクル上のある特定の時点でそのタイプを持っているものに対して適用される(場合によっては適用されないものもあるかもしれないのでビルドが不安定になる)けれど、後者は特定の時点とか関係なく適用されるので、後者のほうがよいとのこと。

なるほど…φ(..)

Gradle Forum参考になります。


おわり