我一直在玩在Android Studio 3.3(新空项目)中创建的“Hello World”项目,并决定在该项目中添加一个库(ktor)。我按照README说明,简单地将所需的东西添加到gradle文件中。当我使用web套接字时,以下行已添加到应用程序的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 只是添加不完全理解的东西是不专业的, 希望它能解决问题。
所以,我尽力去理解这个问题。就我根据其他答案所理解的情况而言,问题来自于这样一个事实,即我的项目中有一个库的两个实例(?),所以Gradle不知道该选哪一个。但那我就不明白怎么了?(我没有添加任何其他“外部依赖项”)
对于解决方案,最常见的答案是添加'META-INF/kotlinx-io。kotlin_module'
转换为excludePath
打包选项,但我不明白为什么它应该是正确的。对我来说,这听起来像是在告诉构建系统“请从我的项目中排除这些路径/不要扫描它们以查找库”。但我不确定这是否是一种正确的方法,因为在这种情况下,我有效地从项目中排除了几个库/依赖项,这可能会导致运行时异常NoClassDefFoundError
或将来类似的情况。
第二个最常见的答案是将pickFirst'META-INF/kotlinx-io.kotlin_module'
添加到打包选项中,这看起来更好一些,因为它告诉构建系统“当你有多个库的条目时,请拿走你找到的第一个”,即库将被包含在我的项目中,所以我是安全的, 但是作为一个来自C / C / Rust / System_Programming世界的人,我仍然对这个解决方案感到担忧:就C(简化)而言,让我们想象一下,我最终拥有2个不同版本(1.1,1.2)的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包的< code>META-INF目录中的任何这些文件。
META-INF
目录中的这些重复文件源自引用的库-
除了使用packagingOptions
之外,没有其他事情可做。
另请参见:META-INF的目的是什么?(AndroidAPK
!=JavaJAR
)。
这些确实是类似的包格式,但仍然不完全相同。
我有Android应用程序,我使用谷歌翻译API当我建立,我得到错误:错误:执行失败的任务:应用程序:转换资源与MergeJavaResForDebug。发现多个文件与操作系统独立的路径META-INF/LICENSE
问题内容: 我正在Java中使用Selenium制作应用程序。我一直收到此错误,并且我一直在互联网上搜索以找出问题所在,但找不到任何东西。请帮忙。 这是我的build.gradle: 问题答案: 首先,尝试添加以下行:排除“ META-INF / DEPENDENCIES”,然后运行“ app” 如果继续发生错误:“ META-INF / INDEX.LIST”,请继续添加排除项“ META-IN
当我构建我的应用程序时,我得到以下错误: 错误:任务“:app:TransformResourcesWithMergeJavaResforDebug”执行失败。找到多个具有操作系统独立路径“meta-inf/license”的文件 这是我的build.gradle文件: 当我将此代码添加到build.gradle文件中时, 这个错误会被解决,但是另一个问题会发生。像这样: 谁有想法怎么解决这个?
在Android项目中。我使用 我遇到了 发现多个文件具有独立于操作系统的路径“META-INF/atomicfu”。kotlin\u模块“” 甚至 不起作用
我正在尝试构建我的应用程序,但出现以下错误: 我很确定这是两个Gradle依赖之间的冲突,但我不知道如何解决它。
我正在尝试okhttp,但出现下一个错误:\ 找到多个具有操作系统独立路径“meta-inf/proguard/okhttp3.pro”的文件 有人知道发生了什么吗?它说‘发现了一个文件’但不确定它在说什么。我是android的新手 谢谢 更新按@vivek请求显示的proguard-rules.pro代码 找到多个具有操作系统独立路径“okhttp3/internal/publicsuffix/