Я создаю плагин Gradle с Kotlin, в одной из функций я использую Ktor и Coroutines.Плагин должен быть включен как classpath в проектах третьей части.
Проблема возникает, когда я пытаюсь использовать плагин в другом проекте, я получаю:
Caused by: java.lang.NoClassDefFoundError: kotlin/coroutines/Continuation
напотребительский проект.
Я пытался изолировать зависимости Coroutines и применять транзитивные зависимости для Ktor, но безуспешно.
Я видел слишком разные решения (https://github.com/Kotlin/kotlinx.coroutines/issues/430), такие как применение ShadowJar для создания FatJar, номожет быть, я что-то упускаю в конфигурации. После применения Shadow Plugin размер банки составляет около 62 МБ, даже размер банки minimize
составляет 12 МБ.
Основной файл 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 и не иметь большой jar в качестве зависимости.