Applying org.jetbrains.kotlin.jvm within custom Gradle plugin not working

Viewed 490

I'm writing a custom Gradle plugin using Kotlin. The goal is to apply and configure certain plugins within this custom plugin. Consumers should only need to apply the custom plugin and be all set.

The problem: I want to apply these two kotlin plugins (and other plugins) in the custom plugin (which can be applied like this normally in a Gradle build script):

kotlin("jvm") version "1.4.10"
kotlin("plugin.spring") version "1.4.10"

But when applying them from within my own plugin a couple of things goes wrong.

  1. The jar task is not found. I get this complaint in the project consuming my plugin.
  2. The contents of the dependencies section, e.g api, implementation etc are also causing errors, like if Gradle doesn't understand what they are.

I can, in the consuming project however, simply add the line below to the build script to get the jar task back, and make dependencies work again:

kotlin("jvm") version "1.4.10"

I also wrote a sort of debug function in the consuming Gradle build, just to see what plugins are applied. They all print true when I apply only my own plugin (or add kotlin-jvm to the script manually). Which seems to me like my own plugin is doing its job.

open class GreetingTask : DefaultTask() {

    @TaskAction
    fun greet() {
        println("hello from GreetingTask")
        println(project.pluginManager.hasPlugin("org.springframework.boot"))
        println(project.pluginManager.hasPlugin("io.spring.dependency-management"))
        println(project.pluginManager.hasPlugin("com.github.ben-manes.versions"))
        println(project.pluginManager.hasPlugin("org.jetbrains.kotlin.jvm"))
        println(project.pluginManager.hasPlugin("org.jetbrains.kotlin.plugin.spring"))
        println(project.pluginManager.hasPlugin("java"))
    }
}

My apply method so far in my plugin:

override fun apply(project: Project) {
    configureRepositories(project)
    configureTesting(project)
    configureJava(project)
    configureSpringBoot(project)
    configureSpringDependencyManagement(project)
    configureKotlin(project)
    configureVersions(project)
    configurePublishing(project)
}

And for setting up Kotlin:

private fun configureKotlin(project: Project) {
    project.pluginManager.apply("org.jetbrains.kotlin.jvm")
    project.pluginManager.apply("org.jetbrains.kotlin.plugin.spring")

    project.tasks.withType(KotlinCompile::class.java).configureEach { task ->
        task.kotlinOptions.freeCompilerArgs = listOf("-Xjsr305=strict")
        task.kotlinOptions.jvmTarget = "11"
    }
}

All the other configureXYZ seems to work out fine.

1 Answers

I solved it. The problem was how I applied the plugin.

This does NOT work:

build.gradle.kts

buildscript {
    repositories {
        mavenLocal()
        gradlePluginPortal()
    }
    dependencies {
        classpath("com.praqma:demo:1.0.0")
    }
}

apply(plugin = "com.praqma.demo.DemoPlugin")

This does work:

settings.gradle.kts

pluginManagement {
    repositories {
        mavenLocal()
        gradlePluginPortal()
    }
}

build.gradle.kts

plugins {
    id("gradle.demoPlugin") version "0.0.1-SNAPSHOT"
}
Related