如何将相互依赖的多个AAR打包为单个Maven库并解决引用报错?
解决方案
我来帮你搞定这个问题,这是Android库发布到Maven时很常见的依赖传递和资源打包问题,给你几个可行的方案,你可以根据自己的需求选择:
方案1:将AAR1和AAR2一同上传至Maven仓库
问题的核心是:当你在新项目里引用LibraryA时,transitive=true会尝试拉取它声明的依赖(也就是AAR1和AAR2),但这两个模块并没有上传到Maven仓库,自然会找不到。另外资源找不到的问题,也是因为这两个AAR没被正确拉取,它们的资源无法合并到新项目中。
解决步骤:
- 给AAR1和AAR2各自配置Maven发布,和LibraryA上传到同一个仓库。
- 在每个模块(AAR1、AAR2、LibraryA)的
build.gradle中添加maven-publish插件,并配置发布信息:
plugins { id 'com.android.library' id 'maven-publish' } android { // 你的Android库配置,比如compileSdk、defaultConfig等 defaultConfig { // 记得给每个模块设置groupId、version group = 'com.example' version = '1.0.0' } } publishing { publications { release(MavenPublication) { from components.release // 每个模块的artifactId要唯一,比如AAR1的artifactId设为"AAR1",AAR2设为"AAR2" artifactId = 'AAR1' } } repositories { maven { url = uri("你的Maven仓库地址,比如本地路径或者远程仓库") // 如果是私有仓库,添加凭证 credentials { username = "你的用户名" password = "你的密码" } } } }
- 配置完成后,依次执行每个模块的
publishReleasePublicationToMavenRepository任务,把三个模块都传到Maven。 - 之后新项目引用LibraryA时,只需要正常声明依赖(
transitive=true是默认值,甚至可以不用写):
implementation 'com.example.LibraryA:1.0.0@aar'
这样gradle会自动拉取AAR1和AAR2,资源也会正常合并。
方案2:将AAR1和AAR2合并到LibraryA中(单一AAR输出)
如果不想单独维护AAR1和AAR2的Maven发布,可以把它们的代码、资源全部合并到LibraryA的AAR里,做成一个独立的库。这里可以用第三方插件fat-aar来实现:
步骤:
- 在项目根目录的
build.gradle中添加插件依赖:
buildscript { dependencies { classpath 'com.kezong:fat-aar:1.3.8' } }
- 在LibraryA的
build.gradle中应用插件,并修改依赖声明为embed:
plugins { id 'com.android.library' id 'com.kezong.fat-aar' } android { // 你的LibraryA配置 } dependencies { // 用embed替代compile/implementation,把AAR1和AAR2合并到LibraryA中 embed project(':AAR1') embed project(':AAR2') }
- 打包LibraryA并上传到Maven,此时生成的AAR已经包含了AAR1和AAR2的所有代码和资源,新项目引用时不需要额外依赖这两个模块,自然不会出现找不到的问题。
额外排查点(如果选方案1仍出现资源问题)
如果上传了AAR1/AAR2后还是找不到资源,可以检查:
- 确认AAR1和AAR2的
build.gradle中,sourceSets配置正确,res目录被正确识别:
android { sourceSets { main { res.srcDirs = ['src/main/res'] } } }
- 确认新项目的
build.gradle中添加了正确的Maven仓库地址,能访问到AAR1和AAR2。 - 清理gradle缓存(执行
./gradlew clean build --refresh-dependencies),避免缓存导致的问题。
内容的提问来源于stack exchange,提问作者Cheng
相关产品推荐
相关产品推荐

