Gradle 基础
Gradle 的任务图、依赖声明与常用 Java 插件:与 Maven 的分工与选型意识。
#type / concept
#status / growing
#tech / dev
#resource / java
[!info] 关联笔记
Gradle 基础
这个概念为什么出现
Gradle 在 Android 与许多服务端仓库流行:灵活的任务图、增量构建与多语言 DSL。理解其任务与依赖配置后,才能读懂现代 Java 仓库。
[!abstract] 一句话理解 Gradle 以任务图执行构建;Java 插件提供编译/测试/打包约定;依赖配置(implementation/api/testImplementation)控制编译类路径与暴露面。
最小可运行示例
场景:应用 Java 插件的最小构建(Kotlin DSL 示意)
// build.gradle.kts 概念片段
plugins {
java
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
}
}
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
}
tasks.test {
useJUnitPlatform()
}
常用命令:
./gradlew test
./gradlew build
./gradlew dependencies
结合场景再看三个关注点
- **Wrapper(gradlew)**锁定发行版。
- implementation vs api 影响消费者编译。
- 增量与缓存是性能关键,但正确性仍靠任务输入输出声明。
核心概念与准确模型
1. 项目与任务
- 任务有依赖
build聚合多种检查
2. 依赖配置
implementation / api / runtimeOnly / testImplementation…
3. 与 Maven 坐标
仍使用 Maven 中央等仓库坐标解析。
边界情况与反直觉行为
- 配置阶段 vs 执行阶段副作用。
- 插件版本目录(version catalog)管理不善仍漂移。
- 自定义任务忘记声明输入输出导致增量错误。
常见误区
[!warning] 常见误区:在构建脚本写重业务逻辑 构建脚本保持薄,复杂生成器用独立代码。
工程实践
- 强制 wrapper。
- 依赖目录化(catalog)。
- CI 使用
./gradlew --no-daemon视环境权衡。 - 与 Maven 仓库共存发布。
本节总结
- 任务图 + Java 插件
- 配置控制类路径暴露
- wrapper 保可复现
自测题
- 为什么推荐 gradlew 而不是全局 gradle?
- api 与 implementation 对库作者意味着什么?
参考答案
- 锁定版本,避免“我机器可以”。
- api 依赖暴露给消费者编译;implementation 更好封装。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Gradle User Manual | 官方 | 核心模型 |
| Building Java Projects | 官方 | Java 插件 |