Gradle 多项目传递依赖

Vic*_*cky 7 java gradle gradle-dependencies

我有三个gradle项目。说ProjectAProjectBProjectC

ProjectC依赖于ProjectAProjectB。虽然ProjectB依赖于ProjectA.

所以ProjectCbuild.gradle有下面几行:

dependencies {
  implementation project(':ProjectA')
  implementation project(':ProjectB')
}
Run Code Online (Sandbox Code Playgroud)

并且ProjectB'sbuild.gradle具有以下内容:

dependencies {
  implementation project(':ProjectA')
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么我需要显式implementation声明ProjectAinProjectC的构建文件?

因为,我添加ProjectB, 不ProjectA应该被自动包含,因为ProjectB它依赖于ProjectA?

换句话说,为什么以下不适用于ProjectC

dependencies {
  implementation project(':ProjectB')
}
Run Code Online (Sandbox Code Playgroud)

我是新手gradle,因此试图了解 Project 工作之间的依赖关系管理。


编辑:

所以我想把ProjectBbuild.gradle 改成下面的:

dependencies {
  api project(':ProjectA')
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以将ProjectC的 build.gradle简化为:

dependencies {
  implementation project(':ProjectB')
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

A problem occurred evaluating project ':ProjectB'.
> Could not find method api() for arguments [:ProjectA] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Ben*_*nas 8

添加

plugins {
    id 'java-library'
}
Run Code Online (Sandbox Code Playgroud)

添加到父项目build.gradle文件,这将为api尝试使用它的项目启用修饰符。

请参阅: https: //docs.gradle.org/current/userguide/java_library_plugin.html


JB *_*zet 6

因为implementation正是为此:它告诉 ProjectB 的代码需要 ProjectA 才能工作(在内部),但不是其 API 的一部分(即您不希望 ProjectB 的客户依赖于它在内部使用 ProjectA 的事实)。

如果您希望 ProjectA 成为 API 或 ProjectB 的一部分,请使用api配置而不是实现。

有关更多详细信息,请参阅指南