首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法找到内部依赖关系

无法找到内部依赖关系
EN

Stack Overflow用户
提问于 2022-11-16 19:46:07
回答 1查看 35关注 0票数 1

问题

我正在开发一个Android库。该库生活在一个具有以下结构的多模块Gradle项目中:

代码语言:javascript
复制
├── legacy
│   ├── src
│   │   └──...
│   └── build.gradle
├── data
│   ├── src
│   │   └──...
│   └── build.gradle
├── feature
│   ├── src
│   │   └──...
│   └── build.gradle
└── settings.gradle

data依赖于legacy

代码语言:javascript
复制
// data/build.gradle
implementation project(":legacy")

feature依赖于datalegacy

代码语言:javascript
复制
// feature/build.gradle
implementation project(":legacy")
implementation project(":data")

featuredatalegacy都是安卓库模块。feature是已发布的安卓库。datalegacy不在此项目之外使用,因此不在任何地方发布。

我的安卓应用程序依赖于已发布的feature AAR工件。

代码语言:javascript
复制
implementation "feature:<version>" // package omitted for obfuscation

Gradle在找到feature库时没有问题。但是,Gradle会抛出一个错误,因为它希望找到datalegacy

代码语言:javascript
复制
Execution failed for task ':mobile-app:mergeDevDebugNativeLibs'.
> Could not resolve all files for configuration ':mobile-app:devDebugRuntimeClasspath'.
   > Could not find feature:data:unspecified.
     Searched in the following locations:
       - ... // omitted
     Required by:
         project :mobile-app > feature:<version>

我认为这并不重要,但mobile-app项目使用的是一个锁定插件,即Nebula的分级依赖锁插件

尝试修复

我有点搞不懂为什么会发生这个错误。我预计legacydata的类将包括在feature AAR中。情况显然并非如此。如果可以的话,我更喜欢这个解决办法。

以下是我迄今为止尝试过的一些依赖变量。

代码语言:javascript
复制
// feature/build.gradle

// doesn't work; same error
api project(":legacy")
api project(":data")

// doesn't work; mobile-app doesn't complain about missing artifacts, but fails to compile:
// cannot find symbol class <class in legacy>
compileOnly project(":legacy")
compileOnly project(":data")

如果我使用依赖项替换将mobile-app AAR替换为代码回购的本地副本,则可以成功编译和运行feature

代码语言:javascript
复制
// settings.gradle of mobile-app project
includeBuild('../feature') {    // this is the local relative path to the project
    dependencySubstitution {
        substitute module('feature') using project(':feature')
    }
}

但是,这并不是发布并随后在整个dev团队中强制执行的适当解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-17 01:06:08

Gradle模块与Java/Android库大致对应1:1。

向库中添加依赖项(implementationapi)不会导致将该依赖项编译到库中。否则,如果您依赖于两个库(它们本身依赖于彼此相同的库),则会得到类路径冲突。

相反,向库中添加依赖项将该依赖添加到库的POM和/或gradle.module文件中,该文件将与JAR或AAR一起发布到存储库中。库的使用者(例如,其他Gradle或Maven项目,如您的应用程序)然后解析该POM,从而知道要下载哪些附加依赖项。

在我看来,你的选择是:

  1. datalegacy发布到应用程序可以使用的存储库中,就像feature一样。您的应用程序不会直接使用它们,但是当它看到feature需要它们时,它们会在那里供Gradle下载。
  2. 将代码从datalegacy移到feature中(并将其标记为Kotlin、internal或Java私有,以防止其成为公共API)。
  3. 重构feature以将其所有数据源公开定义为接口。将datalegacy模块移到应用程序项目中,并重构它们,以提供feature所需接口的必要具体实现。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74466331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档