今天,我开始为我的公司建立一个库,以便我们可以避免在我们的一些应用程序中进行一些重复的代码。该库使用在应用程序中重复的一些依赖项。在这种情况下,改造和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
中执行正常而且,如果没有编译,则由于奇怪的库依赖性问题,全世界都会发生崩溃的代码。那么这里到底发生了什么?是否仍然为库编译,并且仍然为该应用程序编译,但是这些依赖关系只是分开了吗?如果是这样,似乎这并不是那么高效,因为您仍然会重复项目中的所有方法。
显然我对此有限,因此,如果有人能够澄清这一点,我将非常感谢它。
aar/jar库中不包括依赖项的类,它仅包括您的代码。通常,它们存储在类似于Maven的存储库中,其中包含其依赖项列表的.poM文件。当您在build.gradle文件中将其添加到项目中时,它只会下载AAR/JAR,解析。POM文件并下载列出的所有依赖项(递归重复每个库的过程,直到获得所有依赖关系)。这意味着如果模块也取决于您的应用程序使用的同一库,则不必排除模块。
wheh您将库添加为本地模块 implementation (project(":mylib")
它做完全相同的事情,但是对于subproject的build.gradle
如果您排除了传递依赖性,它只是使忽略用指定名称的工件.pom文件