
本文详解 Android 项目中因重复引入 ZXing 核心库(如 com.google.zxing:core)引发的 Duplicate Class 编译错误,并提供精准、安全的依赖排除方案。
本文详解 android 项目中因重复引入 zxing 核心库(如 `com.google.zxing:core`)引发的 duplicate class 编译错误,并提供精准、安全的依赖排除方案。
在 Android 开发中,使用二维码扫描功能时,开发者常通过 zxing-android-embedded 库快速集成 ZXing 能力。但当项目显式声明 implementation 'com.google.zxing:core:3.5.1' 时,极易触发 Duplicate class com.google.zxing.* 编译错误——这是因为 zxing-android-embedded 内部已自带 ZXing core 模块(例如 v4.3.0 依赖 core:3.1.0),而手动添加的 core:3.5.1 与之版本不兼容,导致 Gradle 构建时检测到大量重复类。
根本原因在于:zxing-android-embedded 是一个封装库,它将 ZXing 的 core 和 android-core 模块作为传递依赖(transitive dependency) 自动引入。当你额外添加同名库的不同版本,Gradle 无法自动合并,从而触发 checkDuplicateClasses 任务失败。
✅ 正确解决方案是 避免手动引入 core,并显式排除其传递依赖:
// app/build.gradle
dependencies {
// ✅ 推荐:使用较新且兼容的 zxing-android-embedded 版本(如 4.3.0)
// 并排除其内置的 core,再单独指定所需版本(若必须升级 core)
implementation('com.journeyapps:zxing-android-embedded:4.3.0') {
exclude group: 'com.google.zxing', module: 'core'
}
implementation 'com.google.zxing:core:3.5.1' // 此时可安全添加
}⚠️ 注意:若你使用的是旧版 zxing-android-embedded(如 3.6.0),官方文档明确建议配合 transitive = false 来彻底禁用传递依赖(包括 core 和 android-core),此时需自行补充必要依赖:
implementation('com.journeyapps:zxing-android-embedded:3.6.0') {
transitive = false // 完全禁用所有传递依赖
}
implementation 'com.google.zxing:core:3.5.1'
implementation 'com.journeyapps:zxing-android-embedded:3.6.0' // 注意:此行仅提供 UI 组件,不含 core但更推荐采用现代方式——优先升级至 zxing-android-embedded:4.3.0+,它对 AndroidX、Java 8+ 及新版 Gradle 兼容性更好,且支持更灵活的依赖管理。
? 补充建议:
- 执行 ./gradlew app:dependencies --configuration debugCompileClasspath 查看实际依赖树,确认 core 是否被多次引入;
- 避免混用 fileTree(dir: 'libs', ...) 引入本地 .jar/.aar 文件(如旧版 core-3.1.0.jar),这会加剧冲突;
- 清理构建缓存后务必执行 ./gradlew clean,而非仅依赖 flutter clean(Flutter 命令对纯 Android 模块无效)。
总结:ZXing 依赖冲突的本质是版本冗余。最佳实践是「只保留一份 core」——要么信任 zxing-android-embedded 自带版本,要么通过 exclude 精准剥离后统一升级,切勿共存多版本。

















