Detox测试构建失败:':react-native-inappbrowser-reborn:mergeDebugAndroidTestJavaResource'任务报错
解决Detox测试构建中的kotlin-stdlib文件冲突问题
问题场景
在app/build.gradle中添加implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))后,主应用可正常构建,但Detox测试构建时抛出以下错误:
任务':react-native-inappbrowser-reborn:mergeDebugAndroidTestJavaResource'执行失败。
执行com.android.build.gradle.internal.tasks.MergeJavaResWorkAction时发生失败:
发现2个路径为'META-INF/kotlin-stdlib-jdk8.kotlin_module'的文件,来源如下:
- /home/sp/.gradle/caches/transforms-3/4f539c328e5bb19593050e3384e51919/transformed/jetified-kotlin-stdlib-jdk8-1.4.10.jar
- /home/sp/.gradle/caches/transforms-3/c1d521098bb09d070895b1fa3c6468bd/transformed/jetified-kotlin-stdlib-1.8.0.jar
已尝试以下方案但未解决:
- 配置
kotlin.stdlib.jdk.variants.version.alignment=false - 多种packagingOptions排除规则:
exclude("META-INF/kotlin-stdlib-common.kotlin_module") exclude("META-INF/kotlin-stdlib-jdk7.kotlin_module") exclude("META-INF/kotlin-stdlib-jdk8.kotlin_module") exclude("META-INF/kotlin-stdlib.kotlin_module") exclude("kotlin/annotation/annotation.kotlin_builtins") exclude("kotlin/collections/collections.kotlin_builtins") exclude("kotlin/coroutines/coroutines.kotlin_builtins") exclude("kotlin/internal/internal.kotlin_builtins") exclude("kotlin/kotlin.kotlin_builtins") exclude("kotlin/ranges/ranges.kotlin_builtins") exclude("kotlin/reflect/reflect.kotlin_builtins")
解决方案
方案1:为测试变体配置packagingOptions
全局的packagingOptions可能未覆盖Detox使用的debugAndroidTest测试变体,需明确为测试构建添加排除规则:
android { // 保留原有配置... // 全局配置(优先尝试) packagingOptions { exclude 'META-INF/kotlin-stdlib-jdk8.kotlin_module' exclude 'META-INF/kotlin-stdlib-jdk7.kotlin_module' exclude 'META-INF/kotlin-stdlib.kotlin_module' exclude 'META-INF/kotlin-stdlib-common.kotlin_module' } // 若全局配置无效,针对所有测试变体单独配置 testVariants.all { variant -> variant.packagingOptions.apply { exclude 'META-INF/kotlin-stdlib-jdk8.kotlin_module' exclude 'META-INF/kotlin-stdlib-jdk7.kotlin_module' exclude 'META-INF/kotlin-stdlib.kotlin_module' exclude 'META-INF/kotlin-stdlib-common.kotlin_module' } } }
方案2:强制统一kotlin-stdlib版本
通过Gradle的resolutionStrategy强制所有模块使用与kotlin-bom一致的版本,从根源消除版本冲突:
configurations.all { resolutionStrategy { force 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0' force 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0' } }
原理说明
添加kotlin-bom后,主应用依赖的kotlin版本统一为1.8.0,但react-native-inappbrowser-reborn模块依赖了旧版本(1.4.10)的kotlin-stdlib-jdk8,导致测试构建时两个版本的同名文件冲突。上述两种方案分别通过排除重复文件、强制统一版本的方式解决冲突。
内容的提问来源于stack exchange,提问作者KornelDev96
相关产品推荐
相关产品推荐

