Appearance
Groovy DSL 与 Kotlin DSL 选择
Gradle 支持两种 DSL 编写构建脚本:Groovy DSL(.gradle)和 Kotlin DSL(.gradle.kts)。本文帮助你做出选择。
快速对比
| 特性 | Groovy DSL | Kotlin DSL |
|---|---|---|
| 文件扩展名 | .gradle | .gradle.kts |
| 语言基础 | Groovy | Kotlin |
| IDE 自动补全 | 有限 | 完整 ✅ |
| 类型安全 | 否(动态类型) | 是(静态类型)✅ |
| 编译速度 | 较快 | 略慢 |
| 学习曲线 | 低(入门简单) | 中(需要 Kotlin 基础) |
| 官方推荐 | 旧项目 | 新项目 ✅ |
| Android Studio | 旧版默认 | 新版默认 ✅ |
| 生态资料 | 丰富 | 增长中 |
推荐选择
新项目:选择 Kotlin DSL
- 完整的 IDE 自动补全和类型检查
- 编译时发现错误(而非运行时)
- Gradle 8+ 默认生成 Kotlin DSL
- Android Studio 新项目默认使用
旧项目:保持 Groovy DSL 或逐步迁移
- 迁移有成本,但可以逐步进行
- 两种 DSL 可以在同一多项目构建中混用
语法对比示例
插件声明
groovy
// Groovy DSL (build.gradle)
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.0'
}kotlin
// Kotlin DSL (build.gradle.kts)
plugins {
java
id("org.springframework.boot") version "3.2.0"
}依赖声明
groovy
// Groovy DSL
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:3.2.0'
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1'
}kotlin
// Kotlin DSL
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web:3.2.0")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.1")
}任务配置
groovy
// Groovy DSL
tasks.named('test') {
useJUnitPlatform()
maxHeapSize = '1g'
}
task myTask {
group = 'custom'
doLast {
println 'Hello!'
}
}kotlin
// Kotlin DSL
tasks.named<Test>("test") {
useJUnitPlatform()
maxHeapSize = "1g"
}
tasks.register("myTask") {
group = "custom"
doLast {
println("Hello!")
}
}属性与变量
groovy
// Groovy DSL
def appVersion = '1.0.0'
ext {
springVersion = '3.2.0'
}
version = appVersionkotlin
// Kotlin DSL
val appVersion = "1.0.0"
val springVersion by extra("3.2.0")
version = appVersionJava 编译配置
groovy
// Groovy DSL
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}kotlin
// Kotlin DSL
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
// 或者
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}Kotlin DSL 常见陷阱
字符串必须用双引号
kotlin
// ✅ 正确
implementation("com.google.guava:guava:32.0.1-jre")
// ❌ 错误:Kotlin 没有单引号字符串
implementation('com.google.guava:guava:32.0.1-jre')任务配置要指定类型
kotlin
// ✅ 正确:指定任务类型以获得类型安全的 API
tasks.named<Test>("test") {
useJUnitPlatform() // IDE 有自动补全
}
// ✅ 也可以:不指定类型,但失去类型安全
tasks.named("test") {
// 无法直接调用 Test 特有的方法
}属性赋值使用 =
kotlin
// ✅ Kotlin DSL
group = "com.example"
version = "1.0.0"
// ❌ Groovy 风格(在 Kotlin DSL 中无效)
group "com.example"在多项目中混用
Kotlin DSL 和 Groovy DSL 可以在同一项目中共存:
my-project/
├── settings.gradle.kts ← Kotlin DSL
├── build.gradle.kts ← Kotlin DSL
├── core/
│ └── build.gradle.kts ← Kotlin DSL
└── legacy/
└── build.gradle ← Groovy DSL(旧模块保持不变)下一步
- Groovy DSL 基础 - 学习 Groovy DSL 语法
- Kotlin DSL 基础 - 学习 Kotlin DSL 语法