Kotlin Gradle插件中的协程依赖

时间:2018-12-31 19:01:21

标签: kotlin gradle-kotlin-dsl

我正在使用Kotlin构建Gradle插件,这是我使用Ktor和Coroutines的功能之一。该插件必须作为类路径包含在第三方项目中。

当我尝试在另一个项目中使用该插件时,出现问题:

Caused by: java.lang.NoClassDefFoundError: kotlin/coroutines/Continuation在使用者项目上。

我试图隔离Coroutines依赖项,并为Ktor应用传递依赖项,但没有成功。

我看到了太多不同的解决方案(https://github.com/Kotlin/kotlinx.coroutines/issues/430),例如应用ShadowJar构建FatJar,但也许我在配置中缺少了一些东西。一旦我应用了影子插件,罐子的大小约为62Mb,甚至应用minimize罐子的大小也为12MB。

该插件的基本conf(基于Kotlin-DSL的示例)为:

    plugins {
        `kotlin-dsl`
        `maven-publish`
        kotlin("jvm") version "1.3.10"
        id("com.github.johnrengelman.shadow") version "4.0.3"
    }

    gradlePlugin {
       plugins {
          register("greet-plugin") {
             id = "greet"
             implementationClass = "GreetPlugin"
          }
       }

      dependencies {
         api("io.ktor:ktor-client-okhttp:1.0.1")
      }
    }

    val sourcesJar by tasks.registering(Jar::class) {
       classifier = "sources"
       from(sourceSets.main.get().allSource)
    }

    val shadowJar: ShadowJar by tasks
        shadowJar.apply {
           baseName = "test"
           classifier = ""
           minimize()
    }

完整的示例在这里: https://github.com/cdsap/testPluginCoroutinesProblem

更详细的错误

    java.lang.NoClassDefFoundError: kotlin/coroutines/Continuation
            at io.ktor.client.engine.okhttp.OkHttp.create(OkHttp.kt:8)
            at io.ktor.client.HttpClientKt.HttpClient(HttpClient.kt:36)
            at io.ktor.client.HttpClientKt.HttpClient$default(HttpClient.kt:33)
            at GreetPlugin.apply(GreetPlugin.kt:26)
            at GreetPlugin.apply(GreetPlugin.kt:12)

我希望插件可以在Ktor内正确构建coroutines依赖关系,并且没有太大的jar作为依赖关系。

0 个答案:

没有答案