Gradle 2.0 以降と IDEA プラグインで Configuration として provided を定義して idea.module のスコープに追加すると ClassCastException が発生する

  • 12
    Like
  • 0
    Comment

注意

Gradle 2.12 で、Maven の provided スコープに当たる compileOnly という configuration が追加されたため、以下の記述は 2.11 以下で有効な方法になる。Gradle 2.12 以降を使っている場合は素直に compileOnly を使うべし。

参考

経緯

Gradle では war プラグインなどを使わない限り、標準では provided スコープは存在しない。そのため lombok などの様にコンパイル時のみクラスパスを追加するような際は、カスタムコンフィグレーションとして provided を定義して、クラスパスを別途定義する。IntelliJ IDEA でもクラスパスを通したい場合には更に IDEA プラグインのコンフィグレーションにも追加する必要がある。

apply plugin: 'java'
apply plugin: 'idea'

sourceCompatibility = 1.8
version = '0.0.1-SNAPSHOT'

repositories {
    mavenCentral()
}

configurations {
    provided
}

sourceSets {
    main.compileClasspath += configurations.provided
    test.compileClasspath += configurations.provided
    test.runtimeClasspath += configurations.provided
}

dependencies {
    provided 'org.projectlombok:lombok:1.16.2'
    testCompile 'junit:junit:4.11'
}

idea {
    module {
        scopes.PROVIDED.plus += configurations.provided
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.2.1'
}

この時、Gradle 2.0 以降では Error:Cause: java.io.File cannot be cast to org.gradle.api.artifacts.ConfigurationClassCastException が発生する。

原因

Gradle が使っている Groovy のバージョンが 1.8.9 以降(つまり Gradle 2.0 以降)でコレクションを追加する場合は、右辺も同様にコレクションである必要があるため。

対応

具体的には、

idea {
    module {
        scopes.PROVIDED.plus += [configurations.provided]
    }
}

とする必要がある。

参考

この事象について

provided コンフィグレーションに関してよくまとまっている記事