第 4 章 · 构建脚本 DSL:Groovy vs Kotlin

4 个互动演示帮你掌握 Groovy / Kotlin DSL 的对照写法、Version Catalog 的威力、类型安全的好处。

📚 选择场景,看 Groovy 和 Kotlin DSL 的不同写法

📕 Groovy DSL (build.gradle)

        
📗 Kotlin DSL (build.gradle.kts)

        

🔄 Groovy ⇄ Kotlin 互动转换器(简化版)

在左侧粘贴 Groovy DSL,点中间按钮转换。注意:这是简化转换器,覆盖 80% 常见场景,复杂场景请用 IDEA 内置转换。

📕 Groovy DSL

📗 Kotlin DSL

💡 已自动转换:单引号 → 双引号、字符串插值、闭包语法、project() / files() 等常见调用、task 注册、test 配置等。

🗂 Version Catalog:从"散乱版本"到"统一管理"

3 个子模块各自写依赖版本,会发生什么?看下面对比,然后切换到 Version Catalog 方式。

💡 关键观察:
- 旧方式:升级 Spring Boot 要改 3 个文件,万一漏改一个就出版本不一致
- 新方式:只改 libs.versions.toml 一个文件,所有模块自动同步
- 还有 IDE 类型安全提示作为额外赠品

🛡 类型安全演示:故意写错属性名,看两种 DSL 的反应

在脚本里写了一个不存在的属性名(如 imlpementation,少了个字母),Groovy 和 Kotlin 各自怎么反应?

📕 Groovy DSL

dependencies {
    imlpementation 'guava'   // ← 拼错了
}
IDE 反应: ✗ 没有红线(动态类型,编辑器看不出错)
构建报错:
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred evaluating root project 'demo'.
> Could not find method imlpementation() for arguments [guava]
  on object of type DefaultDependencyHandler.
问题:跑构建时才发现,可能浪费几分钟。如果在 CI 上发现,影响整个团队。

📗 Kotlin DSL

dependencies {
    imlpementation("guava")   // ← 拼错了
}
IDE 反应: ✅ 立刻红线 + 错误提示
Unresolved reference: imlpementation
构建报错:编译时立刻报错,根本不需要跑
e: Build file 'build.gradle.kts' line: 5 Unresolved reference: imlpementation Did you mean 'implementation'? ←IDE 还能给修复建议

📕 Groovy 配置 task

tasks.named('test') {
    useJUnitPlatfrm()  // ← 拼错了
}
⏰ 跑 ./gradlew test 时才发现:
No such method 'useJUnitPlatfrm' for ...

📗 Kotlin 配置 task

tasks.named<Test>("test") {
    useJUnitPlatfrm()  // ← 拼错了
}
⚡ 编辑器立刻红线提示。
加上 <Test> 类型参数后,IDE 甚至能自动补全所有 Test 类型支持的方法。

💡 总结:在大型项目里,"拼错属性名"是很常见的 bug。Kotlin DSL 的类型安全能省下大量"跑构建发现错误 → 改 → 再跑"的循环时间。