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:
package com.github.username
fun main() {
val message = """
Hello there.
General Kenobi!
You are a bold one.
""".trimIndent()
println(message)
}
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:
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.
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:
./gradlew :app:run
Esto compilará el proyecto (si es necesario) y ejecutará la función main
definida en el módulo app
.
> 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
:
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:
fun main(args: Array<String>) {
println("Welcome to Fabletown, ${args.joinToString(" ")}!")
}
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ónmain
. 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:
./gradlew :app:run --args="Snow White"
> Task :app:run
Welcome to Fabletown, Snow White!
--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)
(comojava -cp
o scripts.bat/.sh
). - Empaquetar un
.jar
ejecutable desde Gradle y correrlo conjava -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).
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
:
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
.
- 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(" ")
sobreargs
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 deprintln
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
, usarprintln
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.