You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含依赖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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:53:23