1

今天我开始为我的公司构建一个库,这样我们就可以避免在我们的一些应用程序中出现一些重复的代码。该库使用了一些在应用程序中重复的依赖项。在这种情况下,Retrofit 和 Eventbus。无论如何,当我包含我的库时,它看起来像这样:

implementation (project(":mylib")

知道我将使用 Eventbus 以及其他一些依赖项,我想测试排除它们以避免重复的依赖项。因此,我将 Eventbus 添加到应用程序的 gradle 文件中,并从我的库中排除了 Eventbus。

implementation 'org.greenrobot:eventbus:3.0.0'
implementation (project(":mylib")){
    exclude module: 'eventbus'
}

现在我完全意识到我不能通过仅 import 将 Eventbus 包含在应用程序中mylib,当然我已经排除了依赖项以避免过去的构建冲突,所以我熟悉用法,但我只是想尝试一下,因为它我突然想到,我真的不知道这个排除在幕后发生了什么。术语排除意味着(对我而言)此依赖项在排除时不是编译期,但是,情况并非如此,因为第 3 方库(在这种情况下为 Eventbus)似乎仍然可以正常执行mylib如果它没有编译,那么由于奇怪的库依赖问题,全球范围内的代码都会崩溃。那么这里到底发生了什么?它是否仍然为库编译,并且仍然为应用程序编译,但不知何故这些依赖关系只是分开了?如果是这样,这似乎不是那么有效,因为您仍然会复制项目中的所有方法。

显然我对此了解有限,所以如果有人能澄清这一点,我将非常感激。

4

1 回答 1

2

AAR/JAR 库在存档中不包含依赖项的类,它只包含您的代码。通常,它们存储在类似 maven 的存储库中,其中 .pom 文件包含其依赖项列表。当您将它添加到 build.gradle 文件中的项目时,它只会下载 AAR/JAR、解析 .pom 文件并下载列出的所有依赖项(递归地为每个库重复该过程,直到获得所有依赖项)。这意味着如果模块也依赖于您的应用程序使用的相同库,您不必排除它。

当您将库添加为本地模块 implementation (project(":mylib") 时,它的作用完全相同,但对于子项目的 build.gradle 中列出的每个依赖项

如果您排除传递依赖,它只会在解析 .pom 文件时忽略具有指定名称的工件

于 2017-09-27T04:10:58.760 回答