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'
}
}
⚠️ doFirst
和 doLast
可多次调用,分别将操作添加到动作列表的顶部和底部。
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-library
和 greeter
,每个子项目需独立 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 获取。