您可以在支持 Gradle 的 IDE 中打开此示例。

定义和使用复合构建

本示例展示了两个通常独立开发并使用二进制集成组合在一起的 Gradle 构建,如何通过源代码集成方式组装成一个复合构建。my-utils 多项目构建会产生两个不同的 Java 库,而 my-app 构建则使用这些库中的函数生成一个可执行文件。

请注意,my-app 构建不直接依赖于 my-utils。相反,它声明了对 my-utils 生成的库的模块依赖项

my-app/app/build.gradle.kts
plugins {
    id("application")
}

application {
    mainClass = "org.sample.myapp.Main"
}

dependencies {
    implementation("org.sample:number-utils:1.0")
    implementation("org.sample:string-utils:1.0")
}
my-app/app/build.gradle
plugins {
    id 'application'
}

application {
    mainClass = 'org.sample.myapp.Main'
}

dependencies {
    implementation 'org.sample:number-utils:1.0'
    implementation 'org.sample:string-utils:1.0'
}

使用命令行复合构建

使用复合构建时,构建之间不需要共享仓库,并且无需修改构建脚本。

  1. 修改 Number.java 的源代码

  2. 运行 my-app 应用,包括 my-utils 构建。

cd my-app
gradle --include-build ../my-utils run

使用 依赖替换(dependency substitution),util 库的模块依赖项会被替换为对 my-utils 的项目依赖项。

my-app 转换为复合构建

可以通过将 my-app 变成一个包含 my-utils 的复合构建来使上述安排持久化。

cd my-app
echo "includeBuild '../my-utils'" >> settings.gradle
gradle run

通过此配置,从 my-appmy-utils 的模块依赖项将始终被项目依赖项替换。

尽管简单,但这种方法缺点在于修改了 my-app 构建。

使用独立的复合构建

也可以创建一个包含 my-appmy-utils 这两个构建的独立复合构建。

settings.gradle.kts
rootProject.name = "my-composite"

includeBuild("my-app")
includeBuild("my-utils")
settings.gradle
rootProject.name = 'my-composite'

includeBuild 'my-app'
includeBuild 'my-utils'

完成后,您可以直接在命令行上引用包含的构建中的任何任务来执行。

gradle :my-app:app:run

另外,您可以在复合项目中创建委托任务,以便在不指定完整任务路径的情况下执行任务。

build.gradle.kts
tasks.register("run") {
    dependsOn(gradle.includedBuild("my-app").task(":app:run"))
}
build.gradle
tasks.register('run') {
    dependsOn gradle.includedBuild('my-app').task(':app:run')
}
gradle run