Minimalny build.gradle dla projektu w Kotlinie

Andrzej Galiński · 2021-01-30

Cel: Przygotować jak najprostszą konfigurację Gradle do uruchamiania aplikacji w Kotlinie.

Rozwiązanie

Konfiguracja Gradle w Kotlinie

Struktura projektu:

.
├── build.gradle[.kts]
└── src
    └── main
        └── kotlin
            └── dev/galinski/jedendziennie/minimgradle/App.kt

Konfiguracja wymaga:

  • włączenia wtyczki kotlin (przyjmuje parametr - docelową platformę, tu “jvm”)
  • włączenia wtyczki application (dodaje do Gradle’owych tasków run) i skonfigurowania w niej jaka klasa będzie zawierała main
  • ustawienia repozytoriów, z których pobierzemy zależności - przynajmniej biblioteki standardowej Kotlina

kotlin/src/main/kotlin/dev/galinski/jedendziennie/minimgradle/App.kt

package dev.galinski.jedendziennie.minimgradle

fun main() {
    println("kotlin build.gradle")
}

kotlin/build.gradle.kts

plugins {
    kotlin("jvm") version "1.4.21"
    application
}

application {
    mainClassName = "dev.galinski.jedendziennie.minimgradle.AppKt"
}

repositories {
    mavenCentral()
}

dependencies {
    // additional deps (kotlin plugin adds kotlin-stdlib to all source-sets)
}

Konfiguracja Gradle w Groovym

build.gradle

plugins {
    id "org.jetbrains.kotlin.jvm" version "1.4.21"
    id "application"
}

application {
    mainClassName = "dev.galinski.jedendziennie.minimgradle.AppKt"
}

repositories {
    mavenCentral()
}

dependencies {
    // additional deps (kotlin plugin adds kotlin-stdlib to all source-sets)
}

Uwagi

  • wtyczka kotlin dodaje automatycznie implementation("org.jetbrains.kotlin:kotlin-stdlib") do zależności wszystkich source-setów.
  • DSL Gradle’a pozwala włączać wtyczki za pomocą dwóch rodzajów składni: (1) plugins {...}, (2) apply { plugin(...) }. Ten pierwszy (bez apply) jest zalecany przez autorów Kotlina - podobno użycie drugiego może spowodować błędy typu unresolved references. Więcej w dokumentacji Gradle’owej wtyczki do Kotlina

QA

  • Co to jest sourceSet?
    To pojęcie z Gradle’a. SourceSet służy do grupowania plików źródłowych i zasobów (resources), które mają wspólne parametry budowania (np. zależności, classpath’y) - np. “main/java”, “main/kotlin”. Więcej w dokumentacji Gradle.
  • Dlaczego klasa z main jest w pliku AppKt.class, a nie w App.class?
    Funkcje pakietowe (zdefiniowane poza klasą, jak nasz main) trafiają w czasie kompilacji do pliku <nazwa>Kt.class. Więcej w dokumentacji “interoperacyjności” Javy i Kotlina.

Linki