App与聊天库引入Picasso依赖致编译错误的解决方案咨询
这个问题我之前帮不少开发者踩过坑——本质就是依赖重复冲突:你的App模块和Chat Library模块都单独引入了Picasso,而Picasso内部依赖的Apache HttpClient相关类被两个模块重复打包,导致D8编译时抛出Program type already present: org.apache.http.auth.AuthSchemeFactory错误。下面给你几个实用的解决办法:
方案一:统一版本管理(推荐)
在根项目的build.gradle中定义统一的依赖版本,让两个子模块共用同一版本的Picasso,从根源上避免版本不一致导致的冲突:
// 根项目build.gradle buildscript { ext { // 定义统一的Picasso版本号,替换成你实际需要的版本 picassoVersion = "2.71828" } // 其他原有配置... }
然后在App模块和Chat Library模块的build.gradle中,引用这个统一版本:
// App模块/Chat Library模块的build.gradle dependencies { implementation "com.squareup.picasso:picasso:${picassoVersion}" }
方案二:排除重复的依赖项
如果统一版本后仍有冲突,可以手动排除Picasso携带的重复Apache HttpClient依赖。比如在Chat Library模块中排除相关依赖(因为App模块通常会依赖Library,在Library中排除更合理):
// Chat Library模块的build.gradle dependencies { implementation("com.squareup.picasso:picasso:2.71828") { // 排除重复的Apache HttpClient依赖组 exclude group: 'org.apache.httpcomponents', module: 'httpclient' } }
方案三:利用依赖传递简化配置
如果Chat Library是被App模块依赖的子模块,可以在Chat Library中用api关键字引入Picasso,这样App模块无需再单独引入,整个项目只会保留一份依赖:
// Chat Library模块的build.gradle dependencies { // 使用api替代implementation,让依赖传递到App模块 api "com.squareup.picasso:picasso:2.71828" }
之后App模块的build.gradle中就不需要再添加Picasso的依赖了,直接使用即可。
额外排查技巧
可以通过执行以下命令查看App模块的依赖树,精准定位重复依赖的来源:
./gradlew app:dependencies
在输出结果中搜索org.apache.http.auth.AuthSchemeFactory,就能看到是哪个模块引入了重复的类。
内容的提问来源于stack exchange,提问作者Iman Marashi

