1. 概述

Gradle 是一个基于 Groovy 的构建管理系统,专为构建 Java 项目设计。

安装指南可参考官方文档


2. 核心组件:项目与任务

Gradle 构建由一个或多个项目组成,每个项目包含一个或多个任务。

  • 项目可以是构建 JAR、WAR 或 ZIP 文件
  • 任务是执行的最小工作单元,例如编译类、创建或发布 Java/Web 归档文件

简单任务定义示例:

task hello {
    doLast {
        println 'Baeldung'
    }
}

build.gradle 所在目录执行 gradle -q hello,控制台将输出结果。

2.1 任务详解

Gradle 构建脚本本质是 Groovy 代码:

task toLower {
    doLast {
        String someString = 'HELLO FROM BAELDUNG'
        println "Original: "+ someString
        println "Lower case: " + someString.toLowerCase()
    }
}

✅ 任务依赖通过 dependsOn 声明:

task helloGradle {
    doLast {
        println 'Hello Gradle!'
    }
}

task fromBaeldung(dependsOn: helloGradle) {
    doLast {
        println "I'm from Baeldung"
    }
}

2.2 增强任务行为

可动态添加任务操作:

task helloBaeldung {
    doLast {
        println 'I will be executed second'
    }
}

helloBaeldung.doFirst {
    println 'I will be executed first'
}

helloBaeldung.doLast {
    println 'I will be executed third'
}

helloBaeldung {
    doLast {
        println 'I will be executed fourth'
    }
}

⚠️ doFirstdoLast 可多次调用,分别将操作添加到动作列表的顶部和底部。

2.3 添加任务属性

通过 ext 定义自定义属性:

task ourTask {
    ext.theProperty = "theValue"
}

此处为 ourTask 任务设置属性 theProperty,值为 "theValue"


3. 插件管理

Gradle 插件分两类:脚本插件和二进制插件。插件使用需经历两个阶段:解析和应用。

  • 解析:查找正确版本的插件 JAR 并添加到项目 classpath
  • 应用:在项目上执行 Plugin.apply(T)

3.1 应用脚本插件

aplugin.gradle 中定义任务:

task fromPlugin {
    doLast {
        println "I'm from plugin"
    }
}

build.gradle 中应用插件:

apply from: 'aplugin.gradle'

执行 gradle tasks 后,任务列表将显示 fromPlugin

3.2 使用 Plugins DSL 应用二进制插件

核心二进制插件可直接用短名称或插件 ID:

plugins {
    id 'application'
}

此时 application 插件的 run 任务可用,用于执行可运行 JAR。

社区插件需使用完全限定 ID:

plugins {
    id "org.shipkit.bintray" version "2.3.5"
}

⚠️ Plugins DSL 的限制:

  • 不支持在 plugins 块内写 Groovy 代码
  • plugins 块必须是构建脚本的顶级语句(仅允许 buildscripts{} 在其前)
  • 不能在脚本插件、settings.gradle 或初始化脚本中使用

3.3 传统插件应用方式

通过 apply plugin 应用:

apply plugin: 'war'

社区插件需先通过 buildscript{} 添加外部 JAR:

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "org.shipkit:shipkit:2.3.5"
    }
}
apply plugin: "org.shipkit.bintray-release"

❌ 注意:apply plugin 必须在所有 plugins{} 块之后执行。


4. 依赖管理

Gradle 提供灵活的依赖管理系统,兼容多种管理方式。最佳实践包括版本控制、动态版本、冲突解决和传递依赖管理。

4.1 依赖配置

依赖按配置分组,配置有名称且可相互继承。应用 Java 插件后,可用配置包括:

  • implementation
  • testImplementation
  • runtimeOnly

**默认配置继承自 runtimeOnly**。

4.2 声明依赖

多种方式添加依赖(以 Spring 和 Hibernate 为例):

dependencies {
    implementation group: 
      'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'
    implementation 'org.springframework:spring-core:4.3.5.RELEASE',
            'org.springframework:spring-aop:4.3.5.RELEASE'
    implementation(
        [group: 'org.springframework', name: 'spring-core', version: '4.3.5.RELEASE'],
        [group: 'org.springframework', name: 'spring-aop', version: '4.3.5.RELEASE']
    )
    testImplementation('org.hibernate:hibernate-core:5.2.12.Final') {
        transitive = true
    }
    runtimeOnly(group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final') {
        transitive = false
    }
}

✅ 处理多构件依赖时,使用 @extensionName(或 ext)指定下载构件:

runtimeOnly "org.codehaus.groovy:groovy-all:2.4.11@jar"
runtimeOnly group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.11', ext: 'jar'

本地文件依赖声明:

implementation files('libs/joda-time-2.2.jar', 'libs/junit-4.12.jar')
implementation fileTree(dir: 'libs', include: '*.jar')

⚠️ 排除传递依赖的两种方式:

// 配置级别排除
configurations {
    testImplementation.exclude module: 'junit'
}
 
// 依赖级别排除
testImplementation("org.springframework.batch:spring-batch-test:3.0.7.RELEASE"){
    exclude module: 'junit'
}

5. 多项目构建

5.1 构建生命周期

初始化阶段:Gradle 确定参与构建的项目(通常在根目录的 settings.gradle 中声明),并创建项目实例。

配置阶段:基于“按需配置”特性配置项目实例。此特性仅配置特定任务执行所需的项目,大幅减少大型多项目构建的配置时间(仍为孵化中功能)。

执行阶段:执行创建并配置的任务子集。

settings.gradle 中添加:

println 'At initialization phase.'

build.gradle 中添加:

println 'At configuration phase.'

task configured { println 'Also at the configuration phase.' }

task execFirstTest { doLast { println 'During the execution phase.' } }

task execSecondTest {
    doFirst { println 'At first during the execution phase.' }
    doLast { println 'At last during the execution phase.' }
    println 'At configuration phase.'
}

5.2 创建多项目构建

在根目录执行 gradle init 生成骨架。

根构建脚本配置公共设置:

allprojects {
    repositories {
        mavenCentral() 
    }
}

subprojects {
    version = '1.0'
}

settings.gradle 声明项目结构:

rootProject.name = 'multi-project-builds'
include 'greeting-library','greeter'

创建子项目文件夹 greeting-librarygreeter,每个子项目需独立 build.gradle

greeter 依赖 greeting-library,在 greeter 的构建脚本中添加:

dependencies {
    implementation project(':greeting-library') 
}

6. 使用 Gradle Wrapper

项目包含 gradlew(Linux)和 gradlew.bat(Windows)时,无需安装 Gradle 即可构建。

执行 ./gradlew build(Linux)或 gradlew build(Windows),将自动下载指定版本的 Gradle 发行版。

添加 Wrapper 到项目:

gradle wrapper --gradle-version 7.2

或在构建脚本中添加任务:

wrapper {
    gradleVersion = '7.2'
}

执行 wrapper 任务后,生成 gradlew 文件和 gradle/wrapper 目录(含 JAR 和属性文件)。

切换 Gradle 版本只需修改 gradle-wrapper.properties 中的版本条目。


7. 总结

本文深入探讨了 Gradle 的核心特性,其在版本冲突解决和传递依赖管理方面比传统构建工具更具灵活性。

本文源码可在 GitHub 获取。


原始标题:Introduction to Gradle