Ktor和Kotlin多平台的胖子罐问题

时间:2019-03-21 23:03:29

标签: gradle ktor kotlin-multiplatform gradle-shadow-plugin

我有一个针对Android和iOS的kotlin跨平台项目,最近集成了ktor,以便共享库可以加载Web资源。它可以在iOS上运行,但是在Android上却出现此错误:

java.lang.NoClassDefFoundError: Failed resolution of: Lio/ktor/client/HttpClientJvmKt

我猜我的构建管道正在创建一个不包含ktor需要的所有依赖项的jar。因此,我正在尝试使用gradle shadow插件(com.github.jengelman.gradle.plugins:shadow:2.0.4)制作一个胖子。这是我的任务:

task shadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
    from kotlin.targets.android.compilations.main.output
    def runtimeClasspath = kotlin.targets.android.compilations.main.runtimeDependencyFiles
    configurations = [runtimeClasspath]
    baseName = 'myproject-android-shadow'
    exclude 'META-INF/*'
    exclude '*.kotlin_metadata'
}

广口瓶从300Kb跃升至8.5Mb。

结果是一个新错误:More than one file was found with OS independent path 'kotlinx/coroutines/CoroutineExceptionHandler.kotlin_metadata'

您会注意到我已经尝试从shadowJar中排除文件,但是它不起作用。

1 个答案:

答案 0 :(得分:0)

尽管可以构建胖子罐,但更简单的解决方案是将缺失的依赖项(ktorkotlinx)直接包含在应用程序中。然后,我不得不在exclude 'META-INF ...中添加一堆packagingOptions语句。