Sobald ein Kotlin-Projekt aus mehr als einer Datei besteht, reicht ein einzelner kotlinc-Aufruf
nicht mehr. Es gibt mehrere Quelldateien mit Abhängigkeiten untereinander, dazu externe Bibliotheken,
die erst heruntergeladen werden müssen, dazu Tests, die vor jedem Release laufen sollen. Das von Hand
zu koordinieren wird schnell fehleranfällig — und niemand will bei jedem Build manuell prüfen, welche
Datei sich seit dem letzten Mal geändert hat.
Ein Build-System ist Software, die genau das automatisiert: den Weg von Quellcode zu einem fertigen Artefakt, zum Beispiel einer ausführbaren JAR-Datei oder einer Bibliothek. Grob läuft das so ab:
Quellcode (*.kt) -> Bytecode (*.class) -> Archiv (*.jar) -> ausführbare Anwendung
Build-Systeme übernehmen dabei typischerweise:
Bekannte Build-Systeme im Java/Kotlin-Umfeld sind Apache Ant, Maven, Gradle und Bazel. Dieser Kurs
konzentriert sich auf Gradle mit der Kotlin DSL (build.gradle.kts), weil es der Standard für
neue Kotlin-Projekte ist — der "New Project"-Dialog von IntelliJ IDEA schlägt Gradle mit Kotlin DSL
standardmäßig vor. Die nächste Lektion stellt Gradle Maven gegenüber, damit klar wird, wovon sich
Gradle bewusst abgrenzt.
Lies den Code genau durch, bevor du ihn ausführst.
fun main() {
val cache = mutableMapOf<String, Int>()
fun build(name: String, input: Int): Int {
val cached = cache[name]
return if (cached == input) {
println("$name: UP-TO-DATE")
cached
} else {
println("$name: wird neu gebaut")
cache[name] = input
input * 2
}
}
build("modulA", 5)
build("modulA", 5)
build("modulA", 7)
}
Was geben die drei Aufrufe von build() aus — welcher nutzt das zwischengespeicherte Ergebnis?
Ein Build-System bringt Quellcode über mehrere Schritte zu einem lauffähigen Artefakt: erst wird kompiliert, dann werden die kompilierten Klassen in ein Archiv verpackt, erst danach kann die Anwendung laufen. Ruf compile(), packageJar() und run() in main() in genau der Reihenfolge auf, in der ein Build-System sie ausführen würde.
Bevor du einen Hint bekommst: Was hast du schon probiert, und woran hängt es genau?
1. Was automatisiert ein Build-System laut Definition in dieser Lektion?
2. Welcher Punkt gehört NICHT zu den typischen Aufgaben eines Build-Systems?