Se diseñó con todas las características propias de un lenguaje de programación moderno que Java va incorporando poco a poco, pero que no se pueden añadir por completo de forma retroactiva, como:
- Inferencia de tipos
- Lambdas
- Pattern matching
- Funciones que no son métodos
- Null safety
- Smart casts
- …y mucho más.
Kotlin interopera fácilmente con Java, lo que da acceso a una enorme variedad de librerías con un costo de transición mínimo.
Si bien Kotlin se conoce sobre todo como lenguaje oficial para Android, es un lenguaje de propósito general, y me dio curiosidad usarlo en la nube — dentro de un contenedor Docker, claro. Así que decidí probarlo, apoyándome en mi experiencia con Java.
Aunque tengo más experiencia con Maven como herramienta para gestionar dependencias y compilar código Java, también me propuse aprender algo de Gradle, ya que se prefiere ligeramente sobre Maven a la hora de compilar aplicaciones en Kotlin.
Sigue leyendo para ver cómo lograrlo.

Nubes sobre la isla de Kotlin
Instrucciones
- Instala Docker.
- Instala Gradle. El gestor de paquetes de tu sistema operativo te ayudará: en Mac, basta con
brew install. - De aquí en adelante, puedes simplemente copiar mi proyecto sencillo y trabajar a partir de ahí. O bien sigue estos pasos para llegar al mismo resultado.
- Configura tu proyecto Gradle/Kotlin. Esta guía del lado de Kotlin es útil, al igual que esta otra del lado de Gradle. Las combinaré y explicaré cómo configurar una nueva aplicación de la forma más sencilla posible.
- Crea tu directorio y entra en él. Por ejemplo,
mkdir multicloud_pubsub && cd multicloud_pubsub. - Ejecuta
gradle inite ingresa lo siguiente en los menús interactivos: 2 (application), 4 (Kotlin), 1 (no: un único proyecto de aplicación), 1 (build scripts en Groovy),EnteryEnterpara dejar los nombres por defecto del proyecto y del paquete del código de ejemplo. - Escribe
gradle runpara obtener un precioso "Hello World!". - Para agregar tu propio código, continúa como en mi proyecto de ejemplo aquí en Github— que es una pequeña parte de una aplicación asíncrona diseñada para lograr el máximo desacoplamiento y robustez frente a la inestabilidad de la nube. Pronto pienso escribir un artículo aparte sobre eso.
- Coloca el código en un subdirectorio basado en el paquete dentro de
src/main/kotlin, y elimina el código de ejemplo desrc/main/kotlinysrc/test/kotlin. - Elimina la dependencia de ejemplo
guavaenbuild.gradley agrega tus propias dependencias. Son los mismos identificadores de artefacto que usas en Maven, pero con una sintaxis más legible.
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'
- Edita el
mainClassenbuild.gradle, en este caso'com.doitintl.mulicloud.ProcessorKt'. Fíjate en el sufijoKtdel nombre del archivo: corresponde a una clase sintética que da acceso a la funciónmain. - Agrega lo siguiente al final de
build.gradle. Genera un archivo jar todo-en-uno que se puede ejecutar conjava -jar app.jar.
jar {
manifest { attributes 'Main-Class': mainClass }
from { configurations.implementation.collect {
it.isDirectory() ? it : zipTree(it) } }
}
- Pruébalo con
gradle clean run. - ¡Y ahora, a la nube! Coloca este
Dockerfileen el directorio. - Ten en cuenta que usamos una imagen separada de Gradle en tiempo de compilación, lo que nos permite usar una imagen ligera y limpia en tiempo de ejecución.
- Usamos la imagen de Java de OpenJDK. La librería estándar de runtime de Kotlin se compila junto con la aplicación, así que no hace falta una imagen de Kotlin.
- Compila la imagen. No olvides el punto al final para indicar el directorio de compilación.
docker build -t pubsubapp .
Ahora ejecútala.
docker run pubsubapp
¡Y eso es todo! Como las imágenes de Docker son maravillosamente autocontenidas, el conocimiento que ya tengas sobre aplicaciones construidas con cualquier otra tecnología se aplica igual a una construida con Kotlin y Gradle. Aún quedan tareas pendientes, como crear cuentas de servicio y asignar roles, como de costumbre; he preparado un script para eso. (Revisa el README.)