如果一个子项目依赖于另一个子项目怎么办?如果一个项目需要另一个项目生成的人工制品怎么办?

structuring builds 2

这是多项目构建的常见用例。Gradle 为此提供了项目依赖项

依赖于其他项目

让我们探讨一个具有以下布局的理论多项目构建

.
├── api
│   ├── src
│   │   └──...
│   └── build.gradle.kts
├── services
│   └── person-service
│       ├── src
│       │   └──...
│       └── build.gradle.kts
├── shared
│   ├── src
│   │   └──...
│   └── build.gradle.kts
└── settings.gradle.kts
.
├── api
│   ├── src
│   │   └──...
│   └── build.gradle
├── services
│   └── person-service
│       ├── src
│       │   └──...
│       └── build.gradle
├── shared
│   ├── src
│   │   └──...
│   └── build.gradle
└── settings.gradle

在此示例中,有三个子项目,分别称为sharedapiperson-service

  1. person-service子项目依赖于其他两个子项目sharedapi

  2. api子项目依赖于shared子项目。

我们使用 : 分隔符来定义 项目路径,例如 services:person-service:shared。有关定义项目路径的更多信息,请参阅 Settings.include(java.lang.String[]) 的 DSL 文档。

settings.gradle.kts
rootProject.name = "dependencies-java"
include("api", "shared", "services:person-service")
shared/build.gradle.kts
plugins {
    id("java")
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("junit:junit:4.13")
}
api/build.gradle.kts
plugins {
    id("java")
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("junit:junit:4.13")
    implementation(project(":shared"))
}
services/person-service/build.gradle.kts
plugins {
    id("java")
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("junit:junit:4.13")
    implementation(project(":shared"))
    implementation(project(":api"))
}
settings.gradle
rootProject.name = 'basic-dependencies'
include 'api', 'shared', 'services:person-service'
shared/build.gradle
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation "junit:junit:4.13"
}
api/build.gradle
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation "junit:junit:4.13"
    implementation project(':shared')
}
services/person-service/build.gradle
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation "junit:junit:4.13"
    implementation project(':shared')
    implementation project(':api')
}

项目依赖关系会影响执行顺序。它会导致其他项目首先构建,并将输出与其他项目的类一起添加到类路径中。它还会将其他项目的依赖项添加到类路径中。

如果你执行 ./gradlew :api:compile,则首先构建 shared 项目,然后构建 api 项目。

依赖于其他项目产生的工件

有时,你可能希望依赖于另一个项目中特定任务的输出,而不是整个项目。但是,不建议明确声明从一个项目到另一个项目的任务依赖关系,因为它会在任务之间引入不必要的耦合。

建模依赖关系的推荐方法(其中一个项目中的任务依赖于另一个项目的输出)是生成输出并将其标记为“传出”工件。Gradle 的 依赖管理引擎 允许你在项目之间共享任意工件并按需构建它们。