cds*_*sap 5 kotlin gradle-kotlin-dsl
I\xe2\x80\x99m 使用 Kotlin 构建 Gradle 插件,其中一项功能是使用 Ktor 和协程 I\xe2\x80\x99m。该插件必须作为类路径包含在第三方项目中。
\n\n当我\xe2\x80\x99m 尝试在另一个项目中使用插件时出现问题,我得到:
\n\nCaused by: java.lang.NoClassDefFoundError: kotlin/coroutines/Continuation
关于消费者项目。
我尝试隔离协程依赖项并为 Ktor 应用传递依赖项,但没有成功。
\n\n我见过太多不同的解决方案(https://github.com/Kotlin/kotlinx.coroutines/issues/430),比如应用 ShadowJar 来构建 FatJar,但也许我\xe2\x80\x99m 在配置中缺少一些东西。一旦我应用 Shadow Plugin,jar 大约是 62Mb,即使应用minimize
jar 的大小也是 12MB。
该插件的基本配置(基于 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)
归档时间: |
|
查看次数: |
1398 次 |
最近记录: |