“Unresolved reference: implementation” by using subprojects in kotlin-gradle

你离开我真会死。 提交于 2021-01-02 05:56:06

问题


I want to split my project into subprojects. The default gradle setting from the Intellij IDE is:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.3.50"
}

group = "project"
version = "0.0.1-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib-jdk8"))
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

That setting compiles. ButI don't want repeat that code in every subproject. So I changed the build.gradle.kts to

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

subprojects {
    plugins {
        kotlin("jvm") version "1.3.50"
    }

    group = "project"
    version = "0.0.1-SNAPSHOT"

    repositories {
        mavenCentral()
    }

    dependencies {
        implementation(kotlin("stdlib-jdk8"))
    }

    tasks.withType<KotlinCompile> {
        kotlinOptions.jvmTarget = "1.8"
    }
}

but I get the Exception:

e: C:\[...]\build.gradle.kts:1:12: Unresolved reference: jetbrains
e: C:\[...]\build.gradle.kts:16:9: Unresolved reference: implementation
e: C:\[...]\build.gradle.kts:19:20: Unresolved reference: KotlinCompile
e: C:\[...]\build.gradle.kts:19:35: Type mismatch: inferred type is () -> Unit but Class<TypeVariable(S)!>! was expected
e: C:\[...]\build.gradle.kts:20:9: Unresolved reference: kotlinOptions

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\[...]\build.gradle.kts' line: 1

* What went wrong:
Script compilation errors:

  Line 01: import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
                      ^ Unresolved reference: jetbrains

  Line 16:         implementation(kotlin("stdlib-jdk8"))
                   ^ Unresolved reference: implementation

  Line 19:     tasks.withType<KotlinCompile> {
                              ^ Unresolved reference: KotlinCompile

  Line 19:     tasks.withType<KotlinCompile> {
                                             ^ Type mismatch: inferred type is () -> Unit but Class<TypeVariable(S)!>! was expected

  Line 20:         kotlinOptions.jvmTarget = "1.8"
                   ^ Unresolved reference: kotlinOptions

5 errors

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1s

I think there is an easy syntax error, but I can't find it...

Big Thanks!


回答1:


Not sure how you're not also getting an error by nesting the plugins { } block under subprojects { } As stated in Limitations of the plugins DSL:

The plugins {} block must also be a top level statement in the buildscript. It cannot be nested inside another construct (e.g. an if-statement or for-loop).

So to fix your issues, move the plugins {} to the top and imperatively apply the plugins in the subprojects {} block:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.3.50" apply false
}

subprojects {
    apply {
        plugin("org.jetbrains.kotlin.jvm")
    }

    group = "project"
    version = "0.0.1-SNAPSHOT"

    repositories {
        mavenCentral()
    }

    val implementation by configurations

    dependencies {
        implementation(kotlin("stdlib-jdk8"))
    }

    tasks.withType<KotlinCompile> {
        kotlinOptions.jvmTarget = "1.8"
    }
}

You can read more about the apply false part in the Method details of PluginDependenciesSpec which is the type/scope of the plugins {} block.

You can read more about the val implementation by configurations part in the Understanding what to do when type-safe model accessors are not available




回答2:


The submodules do not have to define the plugins explicitly, but who must do it is the parent module and it is also important to define the repositories in settings.gradle.kts (project) so that the dependencies of the submodules are recognized

settings.gradle.kts (project)

pluginManagement {
    repositories {
        maven("https://dl.bintray.com/kotlin/kotlin-eap")
        mavenCentral()
        maven("https://plugins.gradle.org/m2/")
    }
}
rootProject.name = "project"

include("app")

build.gradle.kts (project)

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

        plugins {
            java
            kotlin("jvm") version "1.4-M3" apply false
        }

subprojects {
    apply {
        plugin("org.jetbrains.kotlin.jvm")
    }

    repositories {
        maven("https://dl.bintray.com/kotlin/kotlin-eap")
        mavenCentral()
    }

    val implementation by configurations

    dependencies {
        implementation(kotlin("stdlib-jdk8"))
    }

    tasks.withType<KotlinCompile> {
        kotlinOptions.jvmTarget = "1.8"
    }
}

build.gradle.kts (:app)

dependencies {
    implementation(kotlin("stdlib-jdk8"))
}

GL



来源:https://stackoverflow.com/questions/58669082/unresolved-reference-implementation-by-using-subprojects-in-kotlin-gradle

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!