在gradle中排除库依赖项时,幕后发生了什么?

时间:2017-09-27 03:36:23

标签: android gradle android-gradle libraries gradle-dependencies

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

implementation (project(":mylib")

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

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

现在我完全清楚我只是导入mylib就可以不在应用程序中包含Eventbus,当然我已经排除了依赖关系以避免过去的构建冲突所以我对这种用法很熟悉,但是我我只是想尝试一下,因为在我看来,我真的不知道发生什么事情会被排除在外。术语排除意味着(对我而言)这种依赖关系不是在排除点编译的时期,但是,情况可能并非如此,因为第三方库(在这种情况下为Eventbus)似乎仍然执行在mylib中就好了,如果它没有编译,那么由于奇怪的库依赖问题,全世界都会出现崩溃的代码。那究竟发生了什么?它是否仍然为库编译,它仍然为应用程序编译,但不知何故这些依赖关系只是分开?如果是这样的话,似乎并不是那么有效,因为你仍然会复制项目中的所有方法。

显然,我对此知之甚少,所以如果有人能澄清这一点,我会非常感激。

1 个答案:

答案 0 :(得分:1)

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

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

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