问题
我正在开发一个Android库。该库生活在一个具有以下结构的多模块Gradle项目中:
├── legacy
│ ├── src
│ │ └──...
│ └── build.gradle
├── data
│ ├── src
│ │ └──...
│ └── build.gradle
├── feature
│ ├── src
│ │ └──...
│ └── build.gradle
└── settings.gradledata依赖于legacy。
// data/build.gradle
implementation project(":legacy")feature依赖于data和legacy。
// feature/build.gradle
implementation project(":legacy")
implementation project(":data")feature、data和legacy都是安卓库模块。feature是已发布的安卓库。data和legacy不在此项目之外使用,因此不在任何地方发布。
我的安卓应用程序依赖于已发布的feature AAR工件。
implementation "feature:<version>" // package omitted for obfuscationGradle在找到feature库时没有问题。但是,Gradle会抛出一个错误,因为它希望找到data和legacy。
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的分级依赖锁插件。
尝试修复
我有点搞不懂为什么会发生这个错误。我预计legacy和data的类将包括在feature AAR中。情况显然并非如此。如果可以的话,我更喜欢这个解决办法。
以下是我迄今为止尝试过的一些依赖变量。
// 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。
// 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团队中强制执行的适当解决方案。
发布于 2022-11-17 01:06:08
Gradle模块与Java/Android库大致对应1:1。
向库中添加依赖项(implementation或api)不会导致将该依赖项编译到库中。否则,如果您依赖于两个库(它们本身依赖于彼此相同的库),则会得到类路径冲突。
相反,向库中添加依赖项将该依赖添加到库的POM和/或gradle.module文件中,该文件将与JAR或AAR一起发布到存储库中。库的使用者(例如,其他Gradle或Maven项目,如您的应用程序)然后解析该POM,从而知道要下载哪些附加依赖项。
在我看来,你的选择是:
data和legacy发布到应用程序可以使用的存储库中,就像feature一样。您的应用程序不会直接使用它们,但是当它看到feature需要它们时,它们会在那里供Gradle下载。data和legacy移到feature中(并将其标记为Kotlin、internal或Java私有,以防止其成为公共API)。feature以将其所有数据源公开定义为接口。将data和legacy模块移到应用程序项目中,并重构它们,以提供feature所需接口的必要具体实现。https://stackoverflow.com/questions/74466331
复制相似问题