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

Android多库共享本地依赖,发布后外部引入报错如何解决

问题根因

你遇到的unspecified版本报错是因为直接使用project()声明本地子模块依赖时,Gradle在生成Maven发布包的pom文件时,无法自动将本地项目依赖映射为带版本号的正式Maven坐标,所以会填充默认的unspecified作为版本号,外部项目引入时自然找不到对应版本的依赖库C。

推荐配置方案

有两种常用的稳定配置方式,按需选择即可:

方案1:依赖替换规则(更简洁,推荐)

这种方式无需区分构建场景,内部开发自动用本地代码,发布时自动用正式坐标:

  1. 先在根项目的build.gradle中统一声明发布公共参数:
ext {
    // 三个库的groupId保持一致
    publishGroupId = "com.my_company.project"
    // 三个库的版本号可以统一管理,也可以单独定义
    publishVersion = "1.0.0"
    // 库C的artifactId
    commonArtifactId = "library_common"
}
  1. 在项目根目录的settings.gradle中配置全局依赖替换规则:
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        // 你的私有Maven仓库地址如果有的话也加在这里
    }
    // 新增以下替换规则
    dependencySubstitution {
        substitute module("${publishGroupId}:${commonArtifactId}") using project(':common')
    }
}
  1. 库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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:06:02