Skip to main content

Punto de entrada

⏱ Dedicación recomendada: 0 minutos
Esto considera el contenido visible y relevante, e ignora texto colapsado o marcado como opcional.


Antes de construir bibliotecas reutilizables, necesitamos comprender cómo se ejecuta un programa en Kotlin. Aunque este curso se enfoca en el diseño de componentes modulares y reutilizables, entender el funcionamiento del punto de entrada —la función main— es fundamental para realizar pruebas rápidas, crear ejemplos ilustrativos y escribir utilidades auxiliares.

En esta lección, exploraremos cómo se define y ejecuta un programa Kotlin desde la línea de comandos. Veremos cómo imprimir mensajes en la consola, recibir argumentos desde la terminal y utilizar Gradle para compilar y ejecutar nuestros programas. Todo esto nos permitirá establecer una base sólida para experimentar con el lenguaje y documentar nuestras bibliotecas de forma interactiva y reproducible.

🚪 Función main

La función main es el punto de entrada de cualquier programa ejecutable en Kotlin. A continuación, presentamos un ejemplo simple inspirado en una galaxia muy, muy lejana:

Función main con mensaje multilínea (app/src/main/kotlin/com/github/username/app.kt)
package com.github.username

fun main() {
val message = """
Hello there.
General Kenobi!
You are a bold one.
""".trimIndent()

println(message)
}
¿Qué acabamos de hacer?

Este programa imprime un mensaje multilínea en la consola utilizando println.

  • message se define como un bloque de texto con triple comillas ("""), lo que permite conservar saltos de línea.
  • El método trimIndent() elimina la indentación común al inicio de cada línea, haciendo el texto más limpio.
  • Finalmente, println(message) imprime el mensaje completo seguido de un salto de línea.

Esta es una forma clara y expresiva de trabajar con texto multilínea en Kotlin, ideal para ejemplos, banners o diálogos épicos.

Aunque el enfoque de este curso está en el desarrollo de bibliotecas de software, es importante comprender el rol de la función main, ya que nos será útil para construir ejemplos ilustrativos y ejecutar pequeños experimentos. A medida que avancemos y adoptemos pruebas automatizadas como principal estrategia de verificación, su uso será menos frecuente, pero seguirá siendo una herramienta valiosa para exploración rápida y documentación interactiva.

println como expresión

En Kotlin, println es una función que devuelve un valor de tipo Unit, lo que significa que puede usarse como una expresión, no solo como una instrucción.

Gracias a esto, podemos escribir la función main de forma más concisa utilizando la sintaxis de expresión única:

Versión concisa de main como expresión
fun main() = println("Hello, World!")

Aunque esta forma es perfectamente válida, no suele ser la más común para definir main, ya que generalmente se prefiere la versión con bloques { ... } por claridad y extensibilidad. Aun así, es útil conocer esta alternativa, especialmente para programas simples, scripts o ejemplos rápidos.

println y print

El nombre println proviene de "print line", y su comportamiento refleja justamente eso: imprime el texto seguido de un salto de línea. En cambio, la función print imprime el texto tal como está, sin agregar un salto de línea al final. Esto las hace útiles en distintos contextos, dependiendo de si deseas continuar la salida en la misma línea o iniciar una nueva.

Diferencias entre print y println
for (i in 1..5) {
print(i) // Imprime: 12345 (todo en la misma línea)
}
println() // Salto de línea manual
for (i in 1..5) {
println(i) // Imprime: 1\n2\n3\n4\n5 (cada número en una línea distinta)
}

En resumen, println("Texto") es equivalente a print("Texto\n").

▶️ Ejecutando el programa

Para ejecutar la aplicación desde la terminal usando Gradle, utiliza el siguiente comando:

En tu terminal
./gradlew :app:run

Esto compilará el proyecto (si es necesario) y ejecutará la función main definida en el módulo app.

Salida esperada
> Task :app:run
Hello there.
General Kenobi!
You are a bold one.

Este comando es útil para probar rápidamente tu código sin tener que generar un archivo .jar ni configurar un entorno adicional. Lo usaremos con frecuencia para ejecutar ejemplos y comprobar el comportamiento de nuestras bibliotecas a medida que las construimos.

¿Y si tengo más de un main en el proyecto?

Veremos este tema en detalle más adelante, pero si necesitas cambiar la función main que se ejecuta, puedes modificar la siguiente línea en el bloque application de tu archivo build.gradle.kts:

build.gradle.kts
application {
mainClass = "com.github.username.AppKt"
}

Sustituye "com.github.username.AppKt" por la ruta completa del archivo .kt que contiene el nuevo main, ajustado al formato que usa Kotlin al compilar:

  • Usa el nombre del paquete (como some.package)
  • Añade el nombre del archivo con la primera letra en mayúscula
  • Agrega el sufijo Kt que Kotlin genera automáticamente para los archivos fuente

Por ejemplo, si tienes un archivo llamado otherMain.kt en app/src/main/kotlin/some/package/, deberías usar:

mainClass = "some.package.OtherMainKt"

🧳 Función main con argumentos de línea de comandos

La función main también puede recibir argumentos externos al momento de ejecutar el programa, lo que permite modificar su comportamiento según los valores proporcionados desde la terminal.

Aquí tienes un ejemplo básico:

Función main con argumentos (app/src/main/kotlin/com/github/username/app.kt)
fun main(args: Array<String>) {
println("Welcome to Fabletown, ${args.joinToString(" ")}!")
}
¿Qué acabamos de hacer?

Este programa recibe argumentos desde la línea de comandos y los usa para personalizar un mensaje de bienvenida.

  • args: Array<String> es el parámetro que Kotlin proporciona automáticamente a la función main. Contiene todos los valores ingresados tras el nombre del ejecutable.
  • joinToString(" ") une todos los elementos del arreglo con espacios. Así, puedes pasar nombres compuestos u otros argumentos sin preocuparte por la cantidad.
  • La llamada a println(...) imprime el resultado interpolado directamente en la consola.

Esta estrategia es más segura y flexible que acceder directamente a args[0], ya que evita errores si el usuario no proporciona argumentos o si estos contienen espacios.

🚀 ¿Cómo ejecutar este programa?

Desde la raíz del proyecto, puedes pasar argumentos a la función main utilizando el plugin application de Gradle. Usa la opción --args seguida de los argumentos entre comillas:

En tu terminal
./gradlew :app:run --args="Snow White"
📦 Salida esperada
> Task :app:run
Welcome to Fabletown, Snow White!
¿Qué acabamos de hacer?

--args="..." permite enviar argumentos a la función main.

¡¿Eso es todo?!

—¡Ja! Apenas estoy calentando... —junta las manos y sonríe—.
¡Compatibilidad con Java... activada!

Aunque en Kotlin podemos declarar una función main sin clases, eso no basta si queremos:

  • Ejecutar el programa desde una herramienta que espera una clase con public static void main(String[] args) (como java -cp o scripts .bat/.sh).
  • Empaquetar un .jar ejecutable desde Gradle y correrlo con java -jar.
  • Usar la app desde lenguajes o entornos que solo entienden clases Java clásicas (como algunas tareas de Maven o lanzadores en sistemas operativos).
  • Integrar con herramientas de línea de comandos, sistemas de integración continua, o UIs que detectan entradas estáticas (como IntelliJ al crear "Run Configurations" en proyectos mixtos).
info

Para cubrir estos casos, necesitamos una clase con una función estática, algo que Kotlin no genera automáticamente... a menos que se lo pidamos.

Por eso existe @JvmStatic:

Función main con @JvmStatic
object Launcher {
@JvmStatic
fun main(args: Array<String>) {
println("Modo Java activado.")
}
}

Esta anotación le dice al compilador que genere una función static real de Java dentro de la clase Launcher, compatible con cualquier herramienta que busque el clásico public static void main.

Es especialmente útil en proyectos donde:
  • Quieres distribuir tu herramienta como un .jar ejecutable.
  • Quieres que se pueda invocar desde Java o desde un script de shell.
  • Estás trabajando en bibliotecas multiplataforma, herramientas CLI, plugins de build, o lanzadores.

🎯 Conclusiones

En esta lección exploramos el punto de entrada de los programas en Kotlin: la función main. Aprendimos cómo utilizarla para ejecutar pequeños programas y cómo recibir argumentos desde la línea de comandos para adaptar el comportamiento del programa dinámicamente.

También repasamos funciones básicas como print y println, imprimimos mensajes con formato e indentación, y vimos cómo ejecutar nuestra aplicación con Gradle, tanto con como sin argumentos.

🔑 Puntos clave

  • La función main marca el inicio de cualquier programa ejecutable en Kotlin.
  • println imprime con salto de línea; print, sin él.
  • Es posible definir main como una expresión única si contiene solo una línea.
  • main puede recibir argumentos (args: Array<String>) desde la terminal.
  • Usar joinToString(" ") sobre args permite capturar múltiples palabras sin errores.
  • Podemos ejecutar la aplicación y pasarle argumentos con:
    ./gradlew :app:run --args="...".

🧰 ¿Qué nos llevamos?

Aunque el foco del curso está en el desarrollo de bibliotecas, entender cómo funcionan los programas ejecutables nos permite crear ejemplos ilustrativos, scripts de prueba y herramientas de apoyo durante el desarrollo.

Esta lección nos dio un primer contacto con elementos esenciales del lenguaje y con Gradle como sistema de construcción.
A medida que avancemos, la función main será menos frecuente, pero seguirá siendo útil para crear experimentos interactivos, scripts internos y documentación ejecutable.

📖 Referencias

🔥 Recomendadas

  • 🌐 "Hello world" de la documentación oficial de Kotlin: Introduce la función main y el uso de println en Kotlin, conceptos clave para comprender el punto de entrada de un programa ejecutable.
  • ⏯️ "How to Run Kotlin Code Anywhere with Kotlin Main Functions" (53s) de Donn Felker: Demuestra cómo las funciones main pueden colocarse en cualquier archivo para pruebas rápidas en IntelliJ, reforzando su utilidad como herramienta exploratoria durante el desarrollo de bibliotecas.

🔹 Adicionales

  • 🌐 "Your first program in Kotlin" en la documentación oficial de Android: Introducción práctica al punto de entrada en Kotlin desde la documentación oficial de Android. Este recurso guía al lector en la escritura de su primer programa, mostrando cómo definir funciones con fun, usar println para imprimir texto en consola, y comenzar a resolver errores comunes. Es relevante para esta lección porque refuerza la estructura básica de un programa ejecutable en Kotlin y promueve buenas prácticas como el estilo de nombres y la depuración inicial.
  • 🌐 "Basic syntax" de la documentación oficial de Kotlin: Revisión amplia de la sintaxis básica de Kotlin —incluyendo main, impresión y argumentos— útil como referencia general complementaria a esta lección y como base para explorar el lenguaje más allá del punto de entrada.
  • 📚 "Hello, World!" (pp. 26–28) en "Atomic Kotlin" de Bruce Eckel y Svetlana Isakova: Explicación gradual del punto de entrada en Kotlin desde un enfoque didáctico, útil como complemento narrativo y pedagógico a esta lección para quienes están comenzando.