Android多库共享本地依赖,发布后外部引入报错如何解决
问题根因
你遇到的unspecified版本报错是因为直接使用project()声明本地子模块依赖时,Gradle在生成Maven发布包的pom文件时,无法自动将本地项目依赖映射为带版本号的正式Maven坐标,所以会填充默认的unspecified作为版本号,外部项目引入时自然找不到对应版本的依赖库C。
推荐配置方案
有两种常用的稳定配置方式,按需选择即可:
方案1:依赖替换规则(更简洁,推荐)
这种方式无需区分构建场景,内部开发自动用本地代码,发布时自动用正式坐标:
- 先在根项目的
build.gradle中统一声明发布公共参数:
ext { // 三个库的groupId保持一致 publishGroupId = "com.my_company.project" // 三个库的版本号可以统一管理,也可以单独定义 publishVersion = "1.0.0" // 库C的artifactId commonArtifactId = "library_common" }
- 在项目根目录的
settings.gradle中配置全局依赖替换规则:
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() // 你的私有Maven仓库地址如果有的话也加在这里 } // 新增以下替换规则 dependencySubstitution { substitute module("${publishGroupId}:${commonArtifactId}") using project(':common') } }
- 库A、B的
build.gradle中直接声明正式坐标依赖即可:
dependencies { api "${publishGroupId}:${commonArtifactId}:${publishVersion}" // 其他依赖 }
内部开发时Gradle会自动把这个坐标依赖替换成本地:common模块的代码,不会走远程拉取;发布到Maven仓库时,生成的pom文件会直接保留带正确版本号的依赖声明,不会出现unspecified。
方案2:场景判断依赖(无需修改settings.gradle)
如果不想改全局配置,也可以在A、B的依赖配置里加场景判断:
dependencies { // 当前构建环境存在common子模块时用本地依赖,否则用远程坐标 if (project.findProject(':common') != null) { api project(':common') } else { api "com.my_company.project:library_common:1.0.0" } // 其他依赖 }
注意事项
- 发布顺序必须为先发布库C,再发布库A、B,保证私有Maven仓库中存在对应版本的库C
- 三个库的
maven-publish配置必须确保groupId统一,库C的artifactId和依赖中声明的保持一致,版本号和依赖中声明的匹配
内容的提问来源于stack exchange,提问作者jpihl
相关产品推荐
相关产品推荐

