Skip to content

Gradle 概览 ​

S3-029选修进阶约 45 分钟JDK 21企业开发基础 · 工程工具与规范

1. 本节定位 ​

本仓库用 Maven(《Maven 进阶:依赖管理与多模块》)。本节回答三个问题:

问题答案
Gradle 是什么?另一个主流构建工具(Android 官方、Kotlin/Spring 官方项目多用)✓
与 Maven 的本质区别?Maven 是"声明式约定",Gradle 是"可编程构建" ★★
该学吗?会 Maven 后 30 分钟能上手 Gradle ✓ ——概念是通用的 ✓

2. 学习目标 ​

  • 能把 Maven 概念映射到 Gradle(坐标 / 依赖 / scope / 生命周期)★★;
  • 能读懂 build.gradle.kts(Kotlin DSL)★;
  • 说出 Gradle 的三个优势与两个代价;
  • 能用"发布节奏与团队现状"做选择(呼应 《Git Flow 与团队协作》 的选型思路)✓。

3. 前置知识检查 ​

4. 为什么需要这个知识 ​

场景需要
看 Android / Kotlin 项目✅ 几乎都是 Gradle ✓
换团队/换项目✅ 30 分钟概念迁移 ✓
理解"构建工具在解决什么问题"✅ 两个工具对比着看最清楚 ★

5. 核心概念 ​

5.1 概念映射表 ★★ ​

概念MavenGradle
构建文件pom.xmlbuild.gradle.kts(Kotlin DSL)✓
坐标groupId:artifactId:versiongroup:name:version(一样)✓
仓库Maven Central / 阿里云Maven Central(兼容同一套 jar)✓
依赖声明<dependency>implementation(...) ★
版本管理<dependencyManagement>implementation(platform(...)) ★(BOM 也支持 ✓)
scopecompile / runtime / test / providedimplementation / runtimeOnly / testImplementation / compileOnly ✓
多模块<modules> + <parent>settings.gradle.kts 的 include(...) ✓
生命周期固定阶段(validate→compile→test→package)✓Task 图(可自定义任务与依赖)★
插件<plugin>plugins { id("...") } ✓

关键映射(Maven scope → Gradle configuration):

MavenGradle语义
compileimplementation编译+运行 ✓
providedcompileOnly只编译不打包(《Maven 进阶:依赖管理与多模块》 的 5.5)✓
runtimeruntimeOnly只运行 ✓
testtestImplementation测试 ✓
—api★ Gradle 特有:会把依赖"传递给使用者"(见 5.4)

5.2 一个对照示例 ​

Maven 版(《Maven 进阶:依赖管理与多模块》):

xml
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

Gradle 版(Kotlin DSL):

kotlin
dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")   // ★ 版本来自 platform(BOM)
    runtimeOnly("org.postgresql:postgresql")                             // = runtime scope ✓
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

// 版本统一(= dependencyManagement)★
dependencies {
    implementation(platform("org.springframework.boot:spring-boot-dependencies:3.4.1"))
}

读起来几乎是"同一种语言" ✓ ——概念完全互通 ✓

5.3 Gradle 的三个优势 ★ ​

优势说明
① 增量构建极强 ★★按"输入输出"判断任务要不要重跑 ——没变就跳过 ✓(比 Maven 的模块级增量更细)
② 可编程构建逻辑就是代码(Kotlin/Groovy)——能做 Maven 做不了的复杂事 ✓
③ 多语言Java / Kotlin / Android / 前端混编一个工程 ✓

★ 增量构建举例:改了一个注释,compileJava 会跳过(输入没变)✓ ——大项目里收益显著 ✓

5.4 两个代价 ⚠️ ​

代价说明
① 灵活 = 不一致 ✗每个项目的构建脚本都可能"长得很不一样" ——Maven 的约定让人"一看就懂" ✗(这是双刃剑 ⚠️)
② 学习曲线更陡出问题时要懂 Groovy/Kotlin 与 Gradle 内部模型 ✗

api vs implementation 的区别(Gradle 特有,值得理解):

kotlin
dependencies {
    api("com.example:my-utils:1.0")            // 使用者**也能看到** my-utils 的类型(传递)✓
    implementation("com.example:my-internal:1.0")   // 使用者**看不到**(实现细节)✓
}

api 类似"暴露在接口签名里";implementation 是"纯内部使用" ✓

默认用 implementation(减少传递,《Maven 进阶:依赖管理与多模块》 的"不要依赖传递")✓

5.5 怎么选 ★★ ​

维度MavenGradle
约定 vs 灵活约定(简单可预测)✓灵活(强大但易乱)⚠️
增量构建模块级任务级(更强) ✓
Android/Kotlin❌✅ 必须 ✓
生态默认Java 传统项目 ✓新项目 / 多语言
团队上手快 ✓慢 ⚠️

决策树:

text
做 Android/Kotlin?  ──是──→ Gradle(没有选择)✓
        │否
团队已用哪个?      ──沿用──→ ✓(迁移成本 > 收益)
        │都没用
新项目、想要强增量?──是──→ Gradle 可以 ✓
        │
        └──否──→ Maven ✓(**本仓库的选择**:约定清晰、资料最多 ✓)

★ 一条重要原则:

"团队统一"比"哪个更好"重要一万倍 ✓✓

一半 Maven 一半 Gradle 的多模块项目是灾难 ✗✗

6. 递进示例 ​

6.1 最小示例 ​

kotlin
plugins { java }
repositories { mavenCentral() }
dependencies { testImplementation("org.junit.jupiter:junit-jupiter:5.11.4") }
tasks.test { useJUnitPlatform() }

6.2 与 Maven 对照的完整示例 ​

见 5.2 ✓

6.3 反例:把业务逻辑写进构建脚本 ​

kotlin
// ✗ 在 build.gradle.kts 里写"发布前改数据库"
tasks.register("publish") {
    doLast {
        val conn = DriverManager.getConnection("jdbc:mysql://prod...")
        // ✗✗ 构建脚本里做生产操作
    }
}

问题:构建逻辑与运维逻辑混杂 ✗ ——应该用 CI/CD 工具或独立脚本(《Git Flow 与团队协作》)✓

7. 对照速查 ​

命令MavenGradle
构建mvn compilegradle build(含测试 ✓)
只编译mvn compilegradle compileJava
测试mvn testgradle test
打包mvn packagegradle jar / bootJar
清理mvn cleangradle clean
跳过测试-DskipTests-x test ✓
指定模块-pl xxx -amgradle :module:build ✓

8. Debug 观察点 ​

  1. gradle build --dry-run ★:看"将会执行哪些 task"而不执行 ✓(与 《Shell 脚本基础》 的 --dry-run 思路一致)✓;
  2. gradle dependencies:= Maven 的 dependency:tree ✓;
  3. gradle build --info:看增量判断("UP-TO-DATE"就是跳过的任务)★。

9. 常见错误 ​

#错误说明
1把所有逻辑塞进构建脚本见 6.3 ✗
2Maven 与 Gradle 混用两个构建系统并存 = 灾难 ✗✗
3不锁插件版本每次构建行为可能变 ✗
4把 api 当 implementation 用传递依赖泄漏 ✗

10. 动手实验 ​

  1. 把本仓库某一个简单模块(如 labs-start)用 Gradle 重写一遍(在临时目录)——体会"概念迁移" ✓;
  2. 对比增量:改一个注释,分别跑 mvn compile 与 gradle compileJava,观察谁跳过了编译 ✓;
  3. 读一个开源 Gradle 项目(如 Spring Boot 自己),找到它的 settings.gradle.kts 与模块列表 ✓。

扩展任务:写一份"Maven ↔ Gradle 命令与概念对照表"(10 行以内)——这是最好的学习输出 ✓

11. 练习题 ​

  1. 判断:Gradle 与 Maven 使用不同的依赖仓库体系。(对 / 错)
  2. 填空:Maven 的 runtime 对应 Gradle 的 ______;Gradle 特有的"传递给使用者"的 configuration 是 ______。
  3. 简答:为什么"团队统一构建工具"比"选择更强大的构建工具"更重要?

12. 参考答案(要点) ​

  1. 错。同一个 Maven Central ✓(jar 是通用的——这也是"概念可迁移"的基础)✓
  2. runtimeOnly;api ✓
  3. 因为"混用"的代价远超"单工具的劣势":
    • CI 要装两套 ✓
    • 人要在两套心智模型间切换 ✗
    • 公共配置(如 Enforcer、代码检查)无法统一 ✗✗

这与 《Git Flow 与团队协作》 的"团队统一分支模型"、《Linux 文件、用户与权限管理》 的"统一部署账号"是同一条原则:统一性本身就是一种质量 ✓

13. 掌握标准 ​

  • [ ] 能把 Maven 的核心概念映射到 Gradle ★★;
  • [ ] 能读懂 build.gradle.kts 的依赖声明;
  • [ ] 知道 api 与 implementation 的区别;
  • [ ] 能按"发布节奏与团队现状"做构建工具的选择(《Git Flow 与团队协作》 的选型思路)✓;
  • [ ] 知道"团队统一"高于"工具优劣" ✓。

14. 扩展资源 ​

15. 下一步学习 ​

企业开发的常规路线到此完成。接下来是测试专项 B:

进度只保存在本机浏览器,可随时清除

个人学习项目:AI 生成内容均经人工复核,第三方资源仅作索引