Skip to content

Groovy DSL 与 Kotlin DSL 选择

Gradle 支持两种 DSL 编写构建脚本:Groovy DSL.gradle)和 Kotlin DSL.gradle.kts)。本文帮助你做出选择。

快速对比

特性Groovy DSLKotlin DSL
文件扩展名.gradle.gradle.kts
语言基础GroovyKotlin
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 = appVersion
kotlin
// Kotlin DSL
val appVersion = "1.0.0"
val springVersion by extra("3.2.0")
version = appVersion

Java 编译配置

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(旧模块保持不变)

下一步