Configuração de aplicações Kotlin: visão geral de bibliotecas e ferramentas
A configuração é uma das tarefas-chave no desenvolvimento de aplicações modernas. Um gerenciamento de configurações bem organizado permite adaptar facilmente a aplicação para diferentes ambientes (desenvolvimento, teste, produção), simplifica a implantação e aumenta a segurança (por exemplo, evitando armazenar segredos no código). No ecossistema Kotlin, existem várias abordagens e bibliotecas populares para resolver essa tarefa. Neste artigo, vamos explorar as principais ferramentas, suas vantagens e exemplos de uso.
1. Typesafe Config (HOCON)
HOCON (Human-Optimized Config Object Notation) é um formato de arquivos de configuração e uma biblioteca desenvolvida para a plataforma JVM. É amplamente utilizado em projetos Kotlin, especialmente em conjunto com frameworks como Akka, Play Framework ou Lagom. Principais vantagens: sintaxe concisa, suporte a herança, referências a outros valores e inclusão de arquivos.
Instalação
// build.gradle.ktsimplementation("com.typesafe:config:1.4.3")Exemplo de arquivo de configuração (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} // substituição por variável de ambiente }}Leitura da configuração em 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")}A biblioteca carrega automaticamente o application.conf do classpath e suporta a sobrescrita de configurações através de variáveis de ambiente ou parâmetros JVM.
2. Koin — configuração através de Injeção de Dependência
Koin é um framework DI leve para Kotlin, que também pode ser usado para gerenciar configurações. Ele permite declarar configurações como singletons ou fábricas e injetá-las nos componentes da aplicação.
Exemplo com Koin
// Definição do módulo com configuraçãoval appModule = module { single { AppConfig( name = "KoinApp", version = "2.0", port = 9090 ) }}
// Inicialização do KoinstartKoin { modules(appModule)}
// Usoclass MyService(private val config: AppConfig) { fun start() = println("Iniciando ${config.name} na porta ${config.port}")}Koin é conveniente para projetos pequenos e médios, onde não se deseja conectar frameworks pesados. A configuração permanece no código, mas pode ser externalizada para arquivos separados ou carregada de variáveis de ambiente.
3. Spring Boot e @ConfigurationProperties
Para projetos que usam Spring Boot, a configuração é integrada no nível do framework. As classes de configuração são anotadas com @ConfigurationProperties, e os valores são carregados de application.yml ou application.properties.
Exemplo
// application.ymlapp: name: SpringKotlinApp server: port: 8080 database: url: jdbc:postgresql://localhost:5432/mydb
// Classe 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 no serviço@Serviceclass MyService(private val props: AppProperties) { fun info() = "App: ${props.name}, Porta: ${props.server.port}"}Spring Boot suporta perfis
Também na biblioteca
Envio de email em C++: bibliotecas e exemplos de código
Sphinx: Geração de Documentação para Python
Agendador de tarefas em C# (.NET): Quartz.NET e System.Threading.Timer