Kotlin Gradle 插件中的协程依赖关系

cds*_*sap 5 kotlin gradle-kotlin-dsl

I\xe2\x80\x99m 使用 Kotlin 构建 Gradle 插件,其中一项功能是使用 Ktor 和协程 I\xe2\x80\x99m。该插件必须作为类路径包含在第三方项目中。

\n\n

当我\xe2\x80\x99m 尝试在另一个项目中使用插件时出现问题,我得到:

\n\n

Caused by: java.lang.NoClassDefFoundError: kotlin/coroutines/Continuation关于消费者项目。

\n\n

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

\n\n

我见过太多不同的解决方案(https://github.com/Kotlin/kotlinx.coroutines/issues/430),比如应用 ShadowJar 来构建 FatJar,但也许我\xe2\x80\x99m 在配置中缺少一些东西。一旦我应用 Shadow Plugin,jar 大约是 62Mb,即使应用minimizejar 的大小也是 12MB。

\n\n

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

\n\n
    plugins {\n        `kotlin-dsl`\n        `maven-publish`\n        kotlin("jvm") version "1.3.10"\n        id("com.github.johnrengelman.shadow") version "4.0.3"\n    }\n\n    gradlePlugin {\n       plugins {\n          register("greet-plugin") {\n             id = "greet"\n             implementationClass = "GreetPlugin"\n          }\n       }\n\n      dependencies {\n         api("io.ktor:ktor-client-okhttp:1.0.1")\n      }\n    }\n\n    val sourcesJar by tasks.registering(Jar::class) {\n       classifier = "sources"\n       from(sourceSets.main.get().allSource)\n    }\n\n    val shadowJar: ShadowJar by tasks\n        shadowJar.apply {\n           baseName = "test"\n           classifier = ""\n           minimize()\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

更详细的错误

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

我希望该插件能够在 Ktor 中正确构建协程依赖项,并且不会有大 jar 作为依赖项。

\n

小智 0

就我而言,shadowJar插件尚未生成 fat jar。kotlin/coroutines/Continuation包似乎是第一个没有解决的。

您可以使用jar实用程序检查这一点:

jar tf app/build/libs/app-all.jar
Run Code Online (Sandbox Code Playgroud)

Fat jar 包含很多类,不仅仅是你的。

就我而言,build.gradle.kts包含错误的配置:task.jar已配置而不是task.shadowJar

正确配置build.gradle.kts

jar tf app/build/libs/app-all.jar
Run Code Online (Sandbox Code Playgroud)