Unity3d Android构建错误:kotlinx-coroutines-core与jvm版本冲突
Android构建冲突:kotlinx-coroutines-core两个jar包的处理方案
问题背景
更新AdMob插件后,构建时出现如下错误:
Execution failed for task ':unityLibrary:mergeReleaseJavaResource'. > A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction > 2 files found with path 'META-INF/kotlinx_coroutines_core.version' from inputs: - .../Library/Bee/Android/Prj/IL2CPP/Gradle/unityLibrary/libs/org.jetbrains.kotlinx.kotlinx-coroutines-core-jvm-1.7.1.jar - .../Library/Bee/Android/Prj/IL2CPP/Gradle/unityLibrary/libs/org.jetbrains.kotlinx.kotlinx-coroutines-core-1.7.1.jar Adding a packagingOptions block may help, please refer to https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html for more information
使用Google jar-resolver管理依赖,两个jar包均为传递依赖,想搞清楚:
- 带jvm后缀和常规版的区别是什么?
- 排除其中一个是否安全?该选哪一个?
一、两个jar包的核心区别
kotlinx-coroutines-core-1.7.1.jar是Kotlin多平台通用的基础包,只包含所有平台共用的核心逻辑,没有针对JVM(Android属于JVM平台)做专属适配和实现。kotlinx-coroutines-core-jvm-1.7.1.jar是专门为JVM平台编译的版本,包含了Android/JVM特有的逻辑(比如和Java线程池、ExecutorService交互的代码),是Android项目实际需要的适配版本。
二、排除哪个?是否安全?
完全安全,优先排除不带jvm后缀的通用版,保留带jvm后缀的版本:
- Android基于JVM运行,带jvm后缀的版本是为这个平台量身打造的,功能完整且适配性更好。
- 通用版在Android环境下可能缺少JVM相关实现,甚至会和平台专属代码产生冲突,这也是本次构建报错的直接原因。
三、具体处理方案
方案1:精准排除传递依赖(推荐)
找到AdMob的依赖声明,添加排除规则,移除通用版的kotlinx-coroutines-core:
dependencies { // 替换成你实际使用的AdMob依赖版本 implementation('com.google.android.gms:play-services-ads:22.6.0') { exclude group: 'org.jetbrains.kotlinx', module: 'kotlinx-coroutines-core' } }
方案2:临时忽略重复文件(应急用)
如果不确定哪个依赖引入了通用版,也可以直接在packagingOptions中配置优先保留其中一个文件:
android { packagingOptions { pickFirst 'META-INF/kotlinx_coroutines_core.version' } }
内容的提问来源于stack exchange,提问作者Nikolai
相关产品推荐
相关产品推荐

