本地模块依赖及POM发布问题:需将模块B嵌入模块A的aar
把模块B打包进模块A的aar解决方案
方法一:调整Gradle依赖配置,合并模块B到A的aar里
在模块A的build.gradle(Groovy版)或者build.gradle.kts(Kotlin版)里做两处修改:
- 替换原有依赖写法:
把
改成implementation project(':B')
Kotlin版对应修改为:implementation project(path: ':B', configuration: 'default')implementation(project(":B", "default")) - 添加打包配置避免冲突:
在android代码块中加入以下配置,确保重复的资源、类能正常合并:android { // 保留原有其他配置 packagingOptions { mergeDuplicates true exclude 'META-INF/*.kotlin_module' // 可选操作,减少重复Kotlin模块文件引发的冲突 } }
方法二:直接合并模块B的代码到A中
如果模块B不需要被其他模块复用,直接把B的全部源码、资源文件移动到模块A的对应目录下:
- 比如将B的
src/main/java内的代码迁移至A的src/main/java目录,资源文件迁移至A的src/main/res目录 - 随后删除模块A中对
:B的依赖声明,编译A时就会把所有代码统一打包成aar
方法三:用Shadow插件打包纯代码模块(仅限Java/Kotlin模块)
若模块B是纯Java/Kotlin编写、不含Android资源的模块,可以借助Shadow插件将其合并进A的aar:
- 先在项目根目录的
build.gradle中添加插件依赖:buildscript { repositories { mavenCentral() } dependencies { classpath 'com.github.johnrengelman.shadow:shadow-plugin:8.1.1' } } - 再到模块A的
build.gradle中配置插件:apply plugin: 'com.github.johnrengelman.shadow' shadowJar { // 引入模块B的编译产物 from project(':B').sourceSets.main.output // 将合并后的文件输出到A的编译目录,确保打包aar时能包含 destinationDir file("$buildDir/intermediates/aar_main_jar") } // 让编译任务依赖shadowJar,确保B的代码先被合并 tasks.withType(JavaCompile) { dependsOn shadowJar }
注意:方法一和方法三可能会遇到重复类、资源的冲突问题,需要提前检查两个模块的文件命名;方法二最为直接,适合不需要单独维护模块B的场景。
内容的提问来源于stack exchange,提问作者NAVJOT SINGH
相关产品推荐
相关产品推荐

