Kotlin bringt von Haus aus all die Features einer modernen Programmiersprache mit, die Java erst nach und nach erhält und sich nicht vollständig nachrüsten lassen, etwa:
- Type Inference
- Lambdas
- Pattern Matching
- Funktionen außerhalb von Methoden
- Null Safety
- Smart Casts
- … und vieles mehr.
Kotlin ist nahtlos mit Java interoperabel und eröffnet so den Zugang zu einer riesigen Auswahl an Bibliotheken – bei minimalem Umstellungsaufwand.
Auch wenn Kotlin vor allem als offizielle Sprache für Android bekannt ist, handelt es sich um eine Allzwecksprache. Mich hat interessiert, wie sich Kotlin in der Cloud einsetzen lässt – natürlich in einem Docker-Container. Also habe ich es ausprobiert und dabei auf meinen Java-Hintergrund zurückgegriffen.
Mit Maven als Werkzeug zur Verwaltung von Abhängigkeiten und zum Bauen von Java-Code habe ich zwar mehr Erfahrung, wollte mich aber zugleich in Gradle einarbeiten, weil es sich beim Bauen von Kotlin-Anwendungen leicht durchgesetzt hat.
Wie das funktioniert, lesen Sie im Folgenden.

Wolken über Kotlin Island
Anleitung
- Docker installieren.
- Gradle installieren. Dabei hilft Ihnen der Paketmanager Ihres Betriebssystems: Auf dem Mac genügt
brew install. - Ab hier können Sie auch einfach mein einfaches Projekt kopieren und damit arbeiten. Oder Sie folgen diesen Schritten.
- Richten Sie Ihr Gradle-/Kotlin-Projekt ein. Diese Anleitung auf der Kotlin-Seite ist hilfreich, ebenso diese von Gradle. Ich fasse beide zusammen und zeige, wie Sie eine neue App so unkompliziert wie möglich aufsetzen.
- Legen Sie Ihr Verzeichnis an und wechseln Sie hinein, z. B.
mkdir multicloud_pubsub && cd multicloud_pubsub. - Führen Sie
gradle initaus und geben Sie in den interaktiven Menüs Folgendes ein: 2 (application), 4 (Kotlin), 1 (no: only one application project), 1 (build scripts in Groovy),EnterundEnterfür die Standardnamen von Projekt und Beispielpaket. - Tippen Sie
gradle runein – und schon erscheint ein wunderschönes "Hello World!". - Um eigenen Code hinzuzufügen, gehen Sie wie in meinem Beispielprojekt hier auf GitHub vor – ein kleiner Ausschnitt einer asynchronen App, die auf maximale Entkopplung und Robustheit gegenüber Cloud-Instabilität ausgelegt ist. Dazu plane ich demnächst einen eigenen Artikel.
- Legen Sie Ihren Code in einem paketbasierten Unterverzeichnis unter
src/main/kotlinab und entfernen Sie den Beispielcode insrc/main/kotlinundsrc/test/kotlin. - Löschen Sie die Beispielabhängigkeit
guavainbuild.gradleund ergänzen Sie Ihre eigenen Dependencies. Es handelt sich um dieselben Artifact-IDs wie in Maven, nur mit einer lesbareren Syntax.
compile 'com.google.cloud:google-cloud-pubsub:1.42.0'
compile 'com.google.cloud:google-cloud-storage:1.42.0'
compile 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
- Passen Sie die
mainClassinbuild.gradlean, in diesem Fall'com.doitintl.mulicloud.ProcessorKt'. Beachten Sie das SuffixKtam Dateinamen – es steht für eine synthetische Klasse, die Zugriff auf diemain-Funktion bietet. - Fügen Sie am Ende von
build.gradleFolgendes hinzu. Damit entsteht eine All-in-One-JAR-Datei, die sich mitjava -jar app.jarausführen lässt.
jar {
manifest { attributes 'Main-Class': mainClass }
from { configurations.implementation.collect {
it.isDirectory() ? it : zipTree(it) } }
}
- Testen Sie das mit
gradle clean run. - Und jetzt ab in die Cloud! Legen Sie dieses
Dockerfileins Verzeichnis. - Wir nutzen zur Build-Zeit ein separates Gradle-Image, sodass zur Laufzeit ein schlankes, sauberes Image zum Einsatz kommt.
- Als Basis dient das Java-Image von OpenJDK. Die Kotlin-Standard-Runtime wird mit der Anwendung gebaut, ein eigenes Kotlin-Image ist daher nicht nötig.
- Bauen Sie das Image. Vergessen Sie nicht den Punkt am Ende, der das Build-Verzeichnis bezeichnet.
docker build -t pubsubapp .
Jetzt ausführen:
docker run pubsubapp
Das war's! Da Docker-Images so herrlich in sich abgeschlossen sind, lässt sich Ihr Wissen aus Projekten mit anderen Technologien direkt auf eine mit Kotlin und Gradle gebaute App übertragen. Natürlich gibt es noch das Übliche zu erledigen, etwa Service-Accounts anlegen und Rollen vergeben – dafür habe ich ein Skript bereitgestellt. (Siehe README.)