Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Kotlin, Gradle und die Cloud

By Joshua FoxFeb 22, 20214 min read

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

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 init aus 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), Enter und Enter für die Standardnamen von Projekt und Beispielpaket.
  • Tippen Sie gradle run ein – 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/kotlin ab und entfernen Sie den Beispielcode in src/main/kotlin und src/test/kotlin.
  • Löschen Sie die Beispielabhängigkeit guava in build.gradle und 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 mainClass in build.gradle an, in diesem Fall 'com.doitintl.mulicloud.ProcessorKt'. Beachten Sie das Suffix Kt am Dateinamen – es steht für eine synthetische Klasse, die Zugriff auf die main-Funktion bietet.
  • Fügen Sie am Ende von build.gradle Folgendes hinzu. Damit entsteht eine All-in-One-JAR-Datei, die sich mit java -jar app.jar ausfü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 Dockerfile ins 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.)