Kotlin Scripting and Build Tools: Gradle Kotlin DSL, .kts Scripts & Comprehensive Examples

Table of Contents

1. What is Kotlin scripting?

Kotlin scripting allows executing .kts files without prior compilation or packaging into executables. It is used for automating tasks, configuring build tools, or running quick scripts.

Key Features:

Use Case: Automating repetitive tasks (e.g., file processing, API calls) or configuring build systems.

Status (2025): Experimental, with ongoing refinements to reduce complexity.

2. Can you give an example of Kotlin scripting?

// Simple Kotlin script
import java.io.File

// Write to a file
File("output.txt").writeText("Hello, Kotlin Scripting!\n")

// Read and print file contents
val content = File("output.txt").readText()
println("File content: $content")

// Simple calculation
val numbers = listOf(1, 2, 3, 4, 5)
val squares = numbers.map { it * it }
println("Squares: $squares")

How to Run:

Output:

File content: Hello, Kotlin Scripting!
Squares: [1, 4, 9, 16, 25]

Note:

3. How do you add dependencies in Kotlin scripts?

Use annotations like @file:DependsOn to include libraries from Maven repositories.

// Script with dependencies
@file:DependsOn("com.github.kittinunf.fuel:fuel:2.3.1")

import com.github.kittinunf.fuel.httpGet

fun main() {
    val (request, response, result) = "https://api.github.com".httpGet().responseString()
    println("API Response: ${result.get()}")
}

main()

How to Run:

Note:

4. What are the main build tools for Kotlin projects?

Primary Build Tools:

Use Case: Automating builds, managing dependencies, and enabling multiplatform support.

5. Can you give an example of a Gradle build script using Kotlin DSL?

Project Structure:

my_project/
├── src/main/kotlin/
│   └── Main.kt
├── build.gradle.kts
└── settings.gradle.kts
// src/main/kotlin/Main.kt
fun main() {
    println("Hello, Kotlin!")
}
// build.gradle.kts
plugins {
    kotlin("jvm") version "2.2.0"
    application
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib"))
}

application {
    mainClass.set("MainKt")
}
// settings.gradle.kts
rootProject.name = "my-project"

How to Run:

Output:

Hello, Kotlin!

Note:

6. How do you configure different Kotlin compiler versions with Gradle?

Use the Build Tools API (BTA) (experimental in Kotlin 2.2.0) to specify a compiler version different from the Kotlin Gradle Plugin.

Enable BTA in gradle.properties:

kotlin.compiler.runViaBuildToolsApi=true

Example:

// build.gradle.kts with different compiler version
plugins {
    kotlin("jvm") version "2.2.0"
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

kotlin {
    jvmToolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
    compilerOptions {
        freeCompilerArgs.add("-Xplugin=/path/to/kotlin-compiler-2.1.0.jar")
    }
}

Note:

7. Can you provide a comprehensive example of Kotlin scripting and build tools?

Project Structure:

scripted_project/
├── scripts/
│   └── process_data.kts
├── src/main/kotlin/
│   └── DataProcessor.kt
├── build.gradle.kts
└── settings.gradle.kts
// scripts/process_data.kts
import java.io.File

// Read data from file
val numbers = File("data.txt").readLines().map { it.toInt() }
val sum = numbers.sum()
println("Sum of numbers: $sum")

// Write result to file
File("result.txt").writeText("Sum: $sum")
// src/main/kotlin/DataProcessor.kt
class DataProcessor {
    fun process(numbers: List<Int>): Map<String, Int> {
        return mapOf(
            "sum" to numbers.sum(),
            "max" to numbers.maxOrNull() ?: 0
        )
    }
}
// build.gradle.kts
plugins {
    kotlin("jvm") version "2.2.0"
    application
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib"))
}

application {
    mainClass.set("MainKt")
}

tasks.register<Exec>("runScript") {
    commandLine("kotlinc", "-script", "scripts/process_data.kts")
}
// settings.gradle.kts
rootProject.name = "scripted-project"
// src/main/kotlin/Main.kt
import java.io.File

fun main() {
    val processor = DataProcessor()
    val numbers = File("data.txt").readLines().map { it.toInt() }
    val results = processor.process(numbers)
    println("Processed results: $results")
}

Setup and Run:

1
2
3
4
5

Output (Sample):

Script (gradle runScript):

Sum of numbers: 15

Main program (gradle run):

Processed results: {sum=15, max=5}

result.txt:

Sum: 15

Note:

8. What are common mistakes in Kotlin scripting and build tools?

Scripting:

Build Tools:

General:

9. What are best practices for Kotlin scripting and build tools?

Scripting:

Build Tools:

General: