我正在使用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作为依赖关系。