1. Gradle入门:Gradle是什么、Gradle与Maven对比、Gradle核心概念(Project、Task、Plugin)、安装与Hello World

大家好,欢迎来到这门课。我是你们的Gradle向导。

说实话,我接触Gradle已经快十年了。从最早在Android项目里被它折腾得够呛,到现在每天靠它吃饭——嗯,这中间踩过的坑,够写一本《Gradle血泪史》了。今天咱们就从零开始,把Gradle这玩意儿彻底搞明白。

1.1 Gradle到底是什么?

Gradle,说白了就是一个构建自动化工具。你写代码,它帮你把代码变成能跑的程序。就这么简单。

但为什么不用Makefile?为什么不用Ant?为什么不用Maven?

因为Gradle更聪明。它基于有向无环图(DAG)来管理任务依赖。什么意思?就是它知道哪个任务先跑、哪个后跑,而且只跑那些真正需要跑的任务。我在项目中遇到过很多次,改了一行代码,整个项目重新编译半小时——用Gradle之后,增量编译让这个时间缩短到了几秒。

核心要点:Gradle = 构建工具 + 依赖管理 + 自动化脚本。它用Groovy或Kotlin写脚本,比Maven的XML灵活得多。

1.2 Gradle vs Maven:一场旷日持久的争论

每次技术选型,总有人问我:Gradle和Maven到底选哪个?

我个人习惯这样看:

对比维度 Gradle Maven
构建脚本 Groovy/Kotlin DSL(代码即配置) XML(配置即配置)
性能 增量构建、构建缓存、并行执行 全量构建为主,增量能力弱
依赖管理 动态版本、依赖约束、强制版本 依赖传递、排除规则
扩展性 Task + Plugin,几乎无限 Plugin + Mojo,但XML限制多
学习曲线 陡峭(但值得) 平缓(但上限低)
社区生态 Android默认、Spring Boot支持 Java老牌、企业级成熟

你想想看,Maven的XML写起来有多痛苦?改个依赖版本要翻半天pom.xml。Gradle里一行implementation 'com.google.guava:guava:32.1.3-jre'就搞定了。

我的建议:新项目用Gradle。老项目如果已经是Maven,迁移成本高的话可以继续用。但如果你做Android开发——不好意思,你没得选,Gradle是唯一答案。

1.3 Gradle核心概念:Project、Task、Plugin

这三个概念,是Gradle的基石。搞懂了它们,你就掌握了Gradle的80%。

1.3.1 Project(项目)

每个build.gradle文件对应一个Project。Project是构建的基本单元。单模块项目只有一个Project,多模块项目有根Project和子Project。

我记得第一次接触多模块项目时,被allprojectssubprojects搞晕了。后来才明白:allprojects包括根项目自己,subprojects只包括子项目。就这么简单。

1.3.2 Task(任务)

Task是Gradle里最小的工作单元。编译、打包、测试、部署——全都是Task。

你可以这样定义一个Task:

tasks.register('hello') {
    doLast {
        println 'Hello, Gradle!'
    }
}

跑一下:gradle hello,控制台就会打印出那句话。

避坑指南:我曾经在Task里直接写println,结果发现每次配置阶段都会执行。记住:doLast里的代码才是执行阶段跑的,外面的代码是配置阶段跑的。这个区别,后面讲构建生命周期时会细说。

1.3.3 Plugin(插件)

Plugin是Gradle的扩展机制。它把一堆相关的Task和配置打包在一起,方便复用。

比如Java插件:

plugins {
    id 'java'
}

就这么一行,你就有了compileJavaprocessResourcestestjar等几十个Task。是不是很爽?

这三个概念的关系,我画了张图:

Gradle 核心概念关系图 Project Task Plugin 包含 应用 提供 一个 Project 包含多个 Task,也可以应用多个 Plugin Plugin 本质上是 Task 的集合 + 配置约定 Gradle 构建 = 配置 Project → 执行 Task 图

1.4 安装Gradle

安装Gradle有两种方式。我个人推荐用SDKMAN,干净利落。

方式一:SDKMAN(推荐)

# 安装SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

# 安装Gradle
sdk install gradle 8.6

# 验证
gradle --version

方式二:手动安装

  1. https://gradle.org/releases/ 下载二进制包
  2. 解压到 /opt/gradle 或任意目录
  3. 配置环境变量 GRADLE_HOMEPATH

小技巧:安装完成后,运行 gradle --version 看看输出。如果看到 Groovy: 3.0.xKotlin: 1.9.x,说明安装成功。这两个语言你都可以用来写构建脚本。

1.5 Hello World:第一个Gradle项目

光说不练假把式。咱们来写一个真正的Hello World。

第一步:创建项目目录

mkdir gradle-hello
cd gradle-hello

第二步:创建build.gradle

// build.gradle
tasks.register('hello') {
    doLast {
        println 'Hello, Gradle!'
        println '当前Gradle版本: ' + gradle.gradleVersion
    }
}

第三步:运行

gradle hello

你会看到类似这样的输出:

> Task :hello
Hello, Gradle!
当前Gradle版本: 8.6

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

看到了吗?BUILD SUCCESSFUL。就这么简单。

注意:输出里的 :hello 表示这是根项目的hello任务。如果是子项目,会显示 :subproject:hello。这个命名规则,后面讲多模块时会用到。

第四步:加点料——依赖管理

咱们再写一个带依赖的版本:

// build.gradle
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.google.guava:guava:32.1.3-jre'
}

tasks.register('hello') {
    doLast {
        println 'Hello, Gradle with Guava!'
        println 'Guava版本: ' + com.google.common.base.Throwables.class.package.implementationVersion
    }
}

跑一下 gradle hello,Gradle会自动下载Guava依赖,然后执行任务。

避坑指南:我曾经在没加 repositories 的情况下直接写 dependencies,结果Gradle报错说找不到仓库。记住:repositories 告诉Gradle去哪里下载依赖,dependencies 告诉它下载什么。两个缺一不可。

1.6 本章小结

好了,咱们把Gradle的入门知识过了一遍:

  • Gradle是什么:一个基于DAG的构建自动化工具,比Maven更灵活、更快
  • Gradle vs Maven:Gradle用DSL、支持增量构建、扩展性更强;Maven用XML、生态成熟但上限低
  • 三大核心概念:Project(项目单元)、Task(工作单元)、Plugin(扩展机制)
  • 安装与Hello World:SDKMAN安装,写一个简单的Task,引入Java插件和依赖

嗯,这些内容看起来简单,但都是后面所有高级特性的基础。你想想看,如果连Task和Plugin都搞不清楚,后面怎么玩增量构建?怎么开发自定义插件?

下一章,咱们会深入Gradle的构建生命周期——配置阶段、执行阶段到底是怎么回事,为什么Task的配置代码不能乱写。到时候我会分享一个我踩过的坑,保证让你印象深刻。


公众号:蓝海资料掘金营,微信deep3321