Configuración de aplicaciones Kotlin: revisión de bibliotecas y herramientas
La configuración es una de las tareas clave en el desarrollo de aplicaciones modernas. Una gestión de ajustes correctamente organizada permite adaptar fácilmente la aplicación a diferentes entornos (desarrollo, pruebas, producción), simplifica el despliegue y mejora la seguridad (por ejemplo, evitando almacenar secretos en el código). En el ecosistema Kotlin existen varios enfoques y bibliotecas populares para resolver esta tarea. En este artículo, revisaremos las herramientas principales, sus ventajas y ejemplos de uso.
1. Typesafe Config (HOCON)
HOCON (Human-Optimized Config Object Notation) es un formato de archivos de configuración y una biblioteca desarrollada para la plataforma JVM. Se utiliza ampliamente en proyectos Kotlin, especialmente junto con frameworks como Akka, Play Framework o Lagom. Las principales ventajas: sintaxis concisa, soporte para herencia, referencias a otros valores e inclusión de archivos.
Instalación
// build.gradle.ktsimplementation("com.typesafe:config:1.4.3")Ejemplo de archivo de configuración (application.conf)
app { name = "MyKotlinApp" version = "1.0.0" server { host = "localhost" port = 8080 } database { url = "jdbc:postgresql://${app.server.host}:5432/mydb" user = "admin" password = ${?DB_PASSWORD} // sustitución desde variable de entorno }}Lectura de configuración en Kotlin
import com.typesafe.config.ConfigFactory
fun main() { val config = ConfigFactory.load() val appName = config.getString("app.name") val port = config.getInt("app.server.port") val dbUrl = config.getString("app.database.url") println("App: $appName, Port: $port, DB URL: $dbUrl")}La biblioteca carga automáticamente application.conf desde el classpath y admite la sobrescritura de ajustes mediante variables de entorno o parámetros JVM.
2. Koin — configuración a través de Dependency Injection
Koin es un framework DI ligero para Kotlin que también se puede utilizar para gestionar la configuración. Permite declarar ajustes como singletons o fábricas e inyectarlos en los componentes de la aplicación.
Ejemplo con Koin
// Definición del módulo con configuraciónval appModule = module { single { AppConfig( name = "KoinApp", version = "2.0", port = 9090 ) }}
// Inicio de KoinstartKoin { modules(appModule)}
// Usoclass MyService(private val config: AppConfig) { fun start() = println("Iniciando ${config.name} en el puerto ${config.port}")}Koin es conveniente para proyectos pequeños y medianos donde no se desea conectar frameworks pesados. La configuración permanece en el código, pero se puede externalizar a archivos separados o cargar desde variables de entorno.
3. Spring Boot y @ConfigurationProperties
Para proyectos que utilizan Spring Boot, la configuración está integrada a nivel de framework. Las clases de configuración se anotan con @ConfigurationProperties y los valores se cargan desde application.yml o application.properties.
Ejemplo
// application.ymlapp: name: SpringKotlinApp server: port: 8080 database: url: jdbc:postgresql://localhost:5432/mydb
// Clase Kotlin@ConfigurationProperties(prefix = "app")data class AppProperties( val name: String, val server: ServerConfig, val database: DatabaseConfig) { data class ServerConfig(val port: Int) data class DatabaseConfig(val url: String)}
// Uso en un servicio@Serviceclass MyService(private val props: AppProperties) { fun info() = "App: ${props.name}, Puerto: ${props.server.port}"}Spring Boot admite perfiles