将库添加到Android项目后发生错误(使用操作系统独立路径“ META-INF / kotlinx-io.kotlin_module”找到了多个文件)
作者:互联网
我一直在玩在Android Studio 3.3中创建的“ Hello World”项目(“新建空白项目”),并决定将add a library (ktor)添加到该项目.我按照自述文件的说明进行操作,只是将所需的内容添加到了gradle文件中.当我使用websockets时,以下行已添加到应用程序的gradle构建文件中:
implementation "io.ktor:ktor-client-websocket:$ktor_version"
implementation "io.ktor:ktor-client-cio:$ktor_version"
implementation "io.ktor:ktor-client-android:$ktor_version"
implementation "io.ktor:ktor-client-cio:$ktor_version"
添加完这些后,项目立即停止编译,并且我收到以下错误:
More than one file was found with OS independent path 'META-INF/kotlinx-io.kotlin_module'
有人可以解释为什么我会出现此错误吗?我没有做任何非法的事情,我只是将库添加到了在Android Studio中创建的简单,标准的空项目中,并在添加新的依赖项后以某种方式停止运行.
我在StackOverflow和GitHub Issues上找到了一些类似的问题,但是没有找到很好的解释为什么会发生这种情况以及如何防止此类错误.我只是找到了许多快速简短的答案/解决方案,它们的编写方式是“将其添加到您的项目配置中,它将起作用,相信我,我是专家”,但是我对此并不满意认为作为一名开发人员,我必须了解我在做什么,以及为什么这样做会如此,而且IMO仅添加一个人们尚未完全理解的内容,并希望它能够解决问题不是专业的.
因此,我尽力理解了这个问题.据我根据其他答案所知,问题出在以下事实:我最终以某种方式在我的项目(?)中拥有一个库的2个实例,因此Gradle无法理解该选择哪一个.但是那我已经不明白怎么了? (我没有添加任何其他“外部依赖项”)
对于解决方案,最常见的答案是将“ META-INF / kotlinx-io.kotlin_module”添加到excludePath打包选项中,但是我不明白为什么它应该是正确的.对我来说,这听起来像是在告诉构建系统“请从我的项目中排除这些路径/不要在库中扫描它们”.但是我不确定这是否是正确的方法,因为在这种情况下,我实际上从项目中排除了几个库/依赖项,这可能会导致运行时异常NoClassDefFoundError或将来出现类似情况.
第二个最常见的答案是在包装选项中添加pickFirst’META-INF / kotlinx-io.kotlin_module’,它看起来更好一些,因为它告诉构建系统“当您在某个库中有多个条目时,请采用第一个“您已经找到了一个”,即该库将包含在我的项目中,所以我很安全,但是作为一个来自C/C++ / Rust / System_Programming世界的人,我仍然对此解决方案感到担忧: C的术语(简化),让我们想象一下,我最终拥有2个具有2个不同版本(1.1、1.2)的库,并且我有一个头文件,如果我选择了一个库,则期望我链接到库的v.1.2.版本库(1.1)错误,但使用了较新版本的标头,并希望它能正常工作,…显然不起作用,并且我认为在Android上可能会发生相同的问题(但我不确定(因为我不是专家),即pickFirst似乎是一个很好的解决方案,只要我们可以保证我们正在使用的库具有相同的版本.
所以我现在尝试使用pickFirst方法,最终在gradle构建文件中增加了一个部分:
packagingOptions {
pickFirst 'META-INF/kotlinx-io.kotlin_module'
pickFirst 'META-INF/atomicfu.kotlin_module'
pickFirst 'META-INF/kotlinx-coroutines-io.kotlin_module'
}
哪一个做的很好,但是我仍然不确定这是否是最好的解决方案.我认为正确的方法是理解为什么会发生错误并解决错误的根本原因,而不是尝试使用其他打包方法来解决它.
解决方法:
Android不需要APK包的META-INF目录中的任何这些文件.
并且META-INF目录中的这些重复文件源自引用的库-
除了使用PackagingOptions之外,没有其他事情要做.
另请参阅:What is the purpose of META-INF?(Android APK!= Java JAR).
这些确实是相似的软件包格式,但仍不完全相同.
标签:android-gradle,android-studio,gradle,kotlin,android 来源: https://codeday.me/bug/20191108/2006806.html