Как использовать вновь определенное делегированное свойство в сборке Gradle в Kotlin 1.4 без ошибки NoSuchMethodError?

#kotlin #gradle

#kotlin #gradle

Вопрос:

Gradle 6.6.1, похоже, несмотря ни на что, использует версию stdlib 1.3.72, что означает, что новые методы, добавленные для свойств в 1.4, не работают. Как ни странно, свойство lazy действительно работает.
Если я просто создам новый проект Gradle, добавьте простой buildSrc с build.gradle вот так:

 plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.4.0'
}
repositories {
    mavenCentral()
}
  

И я определяю и использую делегированное свойство в buildSrc следующим образом:

 class TestPlugin : Plugin<Project> {
    override fun apply(p0: Project) {
        val x by Delegate()
    }
}
class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>) {
    }
}
  

И примените плагин в проекте верхнего уровня: apply plugin: TestPlugin я получаю предупреждения, касающиеся как версии stdlib 1.3.72, так и версии 1.4, находящейся в пути к классу, и этой ошибки:

 Caused by: java.lang.NoSuchMethodError: kotlin.jvm.internal.PropertyReference0Impl.<init>(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V
    at TestPlugin.<clinit>(TestPlugin.kt)
  

Я пытался это сделать:

 configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'org.jetbrains.kotlin') {
            details.useVersion '1.4.0'
        }
    }
}
  

Но это не помогло. Итак, я могу убедиться, что Gradle использует Kotlin 1.4?

Ответ №1:

В принципе, вы не можете изменить среду выполнения Gradle для использования Kotlin 1.4.0. Одной из веских причин этого является то, что Gradle (6.6) был протестирован в целом с Kotlin 1.3.72, и это может привести к непредвиденным внутренним сбоям, если вы замените среду выполнения. Gradle в конечном итоге объединит Kotlin 1.4.0 (https://github.com/gradle/gradle/issues/12660).