Niel de Wet
Niel de Wet

Reputation: 8398

Using gradle convention plugin to set kotlin jvmTarget option

Using a Gradle convention plugin to share common configuration between subprojects, what is the correct way to set Kotlin compiler options, like jvmTarget?

This plugin setup results in a working build, but IntelliJ doesn't understand it, which leads me to think this isn't the correct approach:

plugins {
    id 'org.jetbrains.kotlin.jvm'
}

repositories {
    jcenter()
}

dependencies {
    // shared dependencies
}

tasks.named('test') {
    useJUnitPlatform()
}

tasks {
    compileKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
    compileTestKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
}

This plugin is applied in subprojects like this:

plugins {
    id 'my.kotlin-conventions'
    id 'java-library'
}

I'm using Gradle 6.7, Kotlin 1.4.20.


Edit: More info regarding IntelliJ problem

In IntelliJ, in sub-projects, I am seeing the warning Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper '-jvm-target' option. In the root project I don't see the warning, only in sub-projects. Building and running the project produces no problems (or warnings) at all.

Sample: https://github.com/nieldw/IntelliJ_Gradle_Convention_Plugin_Issue

Upvotes: 3

Views: 1253

Answers (1)

Chriki
Chriki

Reputation: 16338

IntelliJ seems to not like the buildSrc/settings.gradle file. When I remove it and “Reload All Gradle Projects”, then the errors that you’ve described disappear.

Commenting the rootProject.name=… line in the buildSrc/settings.gradle file works, too. Interestingly, uncommenting the line later (and reloading the Gradle configuration) is possible without breaking the IntelliJ configuration. So this should be your fix, I suppose.

Your build configuration looks correct to me. This rather sounds like a bug in IntelliJ’s Gradle support.

Upvotes: 3

Related Questions