从另一个模块导入依赖项

Aki*_*inn 3 dependencies gradle

我认为我遗漏了 gradle 中依赖管理如何工作的一些要点。假设我有以下项目结构:

project
---api
------api-commons
------api-v1
------api-v2
------api-v3
Run Code Online (Sandbox Code Playgroud)

其中所有api*目录都是模块。都api-v*需要特定的依赖关系(比方说common-dependency)。

我的目标是将其导入api-commons build.gradle文件中:

dependencies {
   implementation 'common-dependency'
}
Run Code Online (Sandbox Code Playgroud)

build.gradle其他模块的文件中api-v*放置:

dependencies{
   implementation project(':api:api-commons')
}
Run Code Online (Sandbox Code Playgroud)

我希望这能起作用,但事实并非如此。模块中的代码的api-v*行为就像未声明依赖项一样。事实上,如果我在单个模块中导入依赖项,代码将按预期工作。

我做的是错误的假设吗?依赖继承不是这样工作的吗?

Bjø*_*ter 7

从概念上讲,在配置中声明依赖项implementation意味着它是模块内部的(它在实现中使用,但不是公共 API 的一部分)。这样的依赖关系不会暴露给消费者的编译类路径,尽管它仍然位于运行时类路径上。

这种依赖关系建模方式的优点是,如果实现依赖关系发生更改,您无需重新编译使用项目。另一个原因是,通过封装它们,消费者不太可能开始直接依赖它们,然后在更改它们时破坏它们。

如果您想向消费者公开依赖关系,则必须将其声明为模块 API 的一部分。您可以通过应用java-library插件并使用api配置来做到这一点。

例子:

// api-commons/build.gradle
plugins {
  id 'java-library'
}

dependencies {
   api 'common-dependency'
}
Run Code Online (Sandbox Code Playgroud)

在Gradle 用户指南中阅读更多相关信息