Gradle 基础:简介、安装与项目初始化

我记得刚接触 Gradle 那会儿,心里还挺抵触的。习惯了 Maven 那种“约定大于配置”的 XML 写法,突然看到一个基于 Groovy(后来还有 Kotlin)的构建脚本,总觉得不踏实。但干了几周就真香了——你想想看,一个能写循环条件、能自定义 Task、还能直接用 DSL 描述依赖关系的构建工具,比 Maven 舒服太多了。

Gradle 是什么?为什么选它?

Gradle 本质上是一个开源的项目自动化构建工具。它整合了 Ant 的灵活性和 Maven 的约定管理,背后是基于有向无环图(DAG)的任务调度机制。说白了,你告诉它“我要做 A,A 依赖 B”,它就会自动把 B 跑完再跑 A,还不重复执行。

我曾在几个微服务项目里对比过 Maven 和 Gradle 的构建速度。同样的代码,Gradle 的增量编译和缓存机制能省下 30%~50% 的时间。尤其当你每天要发布十几次的时候,这几分钟的价值就出来了。

核心特点:
  • 基于 DAG 的任务执行引擎
  • 完善的增量编译与缓存
  • 支持 Groovy 和 Kotlin 两种 DSL
  • 天然兼容 Maven 和 Ivy 仓库

环境安装:别被版本坑了

安装这事,我建议你直接用 SDKMAN(Linux / macOS)或者 Chocolatey(Windows)。手动下载解压也行,但容易忘掉环境变量。我个人习惯用 SDKMAN,一条命令搞定切换版本。

曾经有一次我在 CI 机器上装了 Gradle 7.0,本地用 6.9.2,结果 @TaskAction 的行为变化让构建炸了半小时。所以记牢:项目和 CI 的 Gradle 版本必须一致。

小技巧:用 gradle wrapper 生成 gradlew 脚本,把版本锁在项目里,再也不用担心环境不一致。

安装步骤(以 macOS 为例)

  1. 安装 SDKMAN:curl -s "https://get.sdkman.io" | bash
  2. 列出可用版本:sdk list gradle
  3. 安装指定版本:sdk install gradle 8.5
  4. 验证:gradle --version

在 Windows 上也可以用 Chocolatey:choco install gradle。装完后记得重启终端,不然环境变量不生效。嗯,这个坑我踩过一次。

项目初始化:从零到跑起来

装好之后,咱们试试创建一个最简单的 Java 项目。Gradle 提供 init 命令,可以交互式生成骨架。

mkdir gradle-demo
cd gradle-demo
gradle init

命令会问你一堆问题:项目类型(java-application? library?)、DSL 语言(Groovy / Kotlin)、构建脚本命名……我个人建议新手先用 Groovy 版,社区示例多,踩坑容易搜。等你熟练了再转 Kotlin DSL,写起来更安全(编译时检查)。

初始化完成后,项目结构长这样:

gradle-demo/
├── build.gradle          // 构建脚本
├── settings.gradle       // 项目设置
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew               // Unix 包装脚本
└── gradlew.bat           // Windows 包装脚本

你可能会问:怎么没有 src?别急,init 命令默认只生成构建文件和包装器,源码需要手动建或者用 java-library 模板。我建议直接用 gradle init --type java-application,这样会自带头文件测试代码。

注意:settings.gradle 里定义了项目名称和模块结构。如果你是单体项目,里面就一行 rootProject.name = 'xxx'。但如果你要搞多模块,这里得配 include 'submodule'。我曾经把一个模块名写错了,编译一直报类找不到……花了一个小时才找到是 settings 里大小写不一致。别学我。

构建脚本的基本结构:看懂 build.gradle

打开 build.gradle(如果你选了 Kotlin DSL,那就是 build.gradle.kts),你会发现里面的内容和 Maven 的 pom.xml 思路很像,但写法更简洁。下面是一个典型的结构:

plugins {
    id 'java'                          // 应用 Java 插件
    id 'application'                   // 让项目可执行
}

group = 'com.example'                  // 组织标识
version = '1.0.0'                      // 项目版本

repositories {
    mavenCentral()                     // 从 Maven 中央仓库拉依赖
}

dependencies {
    implementation 'com.google.guava:guava:31.1-jre'   // 编译+运行时依赖
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'  // 仅测试
}

application {
    mainClass = 'com.example.Main'     // 入口类
}

tasks.named('test') {
    useJUnitPlatform()                 // 启用 JUnit 5
}

这段脚本做了四件事:

  1. 插件声明:java 插件提供编译、测试、打包等任务;application 插件让你能运行 gradle run。
  2. 项目信息:group 和 version 后面会组成坐标,例如 com.example:gradle-demo:1.0.0。
  3. 仓库和依赖:repositories 告诉 Gradle 去哪找 jar;dependencies 里每个配置(implementation、testImplementation)对应不同的作用域。
  4. 任务配置:比如测试框架选型,或者自定义任务。

你看,相比 Maven 的 XML,Gradle 省掉了大量无意义的标签。而且你可以在脚本里写 if/else、循环、甚至调用 Java 类——这灵活性是 XML 给不了的。

知识结构一览

我把这一章的核心概念画成了一张图,方便你整体把握:

Gradle 基础核心结构 Gradle 简介 安装与版本管理 项目初始化 build.gradle 结构 核心概念 任务与依赖管理 仓库与发布 💡 理解要点 • 构建脚本中插件决定能力(编译/测试/打包),repositories 和 dependencies 决定依赖来源。 • 任务之间通过 dependsOn 形成 DAG,Gradle 自动并行执行无依赖的任务。

核心概念速查表

概念 作用 常用场景
Project 代表一个项目模块,拥有自己的构建脚本 多模块项目中每个子模块是一个 Project
Task 可执行的最小工作单元(compileJava、test) gradle build 背后包含几十个 Task
Plugin 扩展构建能力的插件包 java、application、maven-publish
Configuration 依赖的作用域分组 implementation、testImplementation、api

嗯,这张表里的内容你刚开始记不住也没关系。我会在后续课程里反复用到它们。你只要明白:Gradle 的一切都是 Task,依赖管理只是 Task 执行前准备好 classpath 而已。

个人经验:尽快习惯用 gradle tasks 看所有可用任务。我当时靠这个命令理解插件的功能。特别是 gradle tasks --all 能显示所有包括依赖任务,调试神器。