如何将含依赖AAR子模块的Android库发布至Jfrog Artifactory
解决方案
要将子模块中的AAR与主库一同发布到Artifactory,有两种主流实现方式,可根据你的需求选择:
方式一:将子模块AAR嵌入主库AAR(合并打包)
这种方式会把submodule的AAR内容直接合并到主库的AAR中,最终只发布一个包含所有内容的主库artifact。
1. 修改主模块(LibraryModule)的build.gradle
在android闭包中添加合并逻辑,自动解压并合并子模块AAR的代码、资源和清单:
android { // 保留原有的Android配置... libraryVariants.all { variant -> variant.outputs.each { output -> def submoduleAar = project(':LibraryModule:Submodule').file('submodule.aar') def tempUnpackDir = file("${buildDir}/tmp/submodule_unpack/${variant.name}") // 解压子模块AAR的任务 def unpackTask = task("unpackSubmodule${variant.name.capitalize()}") { doLast { delete tempUnpackDir mkdir tempUnpackDir copy { from zipTree(submoduleAar) into tempUnpackDir } } } // 让主库打包任务依赖解压任务 output.packageLibrary.dependsOn unpackTask // 合并内容到主库 output.packageLibrary.doLast { // 合并classes.jar def mainClassesJar = zipTree(output.outputFile).matching { include 'classes.jar' } def subClassesJar = zipTree("${tempUnpackDir}/classes.jar") copy { from subClassesJar into mainClassesJar } // 合并资源文件 copy { from "${tempUnpackDir}/res" into "${buildDir}/intermediates/res/merged/${variant.name}" } // 合并AndroidManifest(按需调整合并规则,避免重复标签) def mainManifest = file("${buildDir}/intermediates/manifests/full/${variant.name}/AndroidManifest.xml") def subManifest = file("${tempUnpackDir}/AndroidManifest.xml") if (subManifest.exists()) { def subManifestContent = subManifest.text.replaceAll('<manifest[^>]*>', '').replaceAll('</manifest>', '') mainManifest.write(mainManifest.text + "\n" + subManifestContent) } } } } }
2. 执行发布
正常运行原有的Artifactory发布任务即可,此时主库AAR已包含子模块的所有内容。
方式二:同时发布主库与子模块作为独立artifact
这种方式会将主库和子模块分别发布到Artifactory,主库的POM文件会自动添加对子模块的依赖,其他项目引用主库时会自动拉取子模块AAR。
1. 配置子模块的build.gradle
添加maven-publish插件,让子模块具备发布能力:
plugins { id 'maven-publish' } configurations.maybeCreate("default") artifacts.add("default", file('submodule.aar')) publishing { publications { maven(MavenPublication) { artifact file('submodule.aar') // 建议与主库保持一致的groupId和version,artifactId设为子模块名称 groupId = "你的主库groupId" artifactId = "submodule" version = "你的主库版本号" } } }
2. 调整主模块的build.gradle
确保主模块依赖子模块,同时配置Artifactory插件发布时包含子模块:
plugins { id 'com.android.library' id 'maven-publish' id 'com.jfrog.artifactory' } android { // 保留原有的Android配置... } dependencies { implementation project(':LibraryModule:Submodule') // 其他依赖如material、fragment等 } publishing { publications { mavenRelease(MavenPublication) { from components.release groupId = "你的主库groupId" artifactId = "library-module" version = "你的主库版本号" } } } artifactory { contextUrl = "你的Artifactory地址" publish { repository { repoKey = "libs-release-local" // 替换为你的仓库Key username = artifactory_user password = artifactory_password } defaults { publications('mavenRelease') publishArtifacts = true publishPom = true // 关键配置:自动发布依赖的子模块 publishDependencies = true publishBuildInfo = true } } }
3. 确认settings.gradle包含子模块
确保settings.gradle中已声明子模块:
include ':LibraryModule' include ':LibraryModule:Submodule'
4. 执行发布
运行命令:
./gradlew publishToArtifactory
主库和子模块的artifact会同时上传到Artifactory,主库的POM文件会自动添加对子模块的依赖。
内容的提问来源于stack exchange,提问作者Nouman Bhatti
相关产品推荐
相关产品推荐

