DEV Community

Cover image for Capítulo 4: Configuração de Aplicações Quarkus
Eduardo R. Ferreira
Eduardo R. Ferreira

Posted on • Edited on

Capítulo 4: Configuração de Aplicações Quarkus

📚 Série: Quarkus: Desvendando o Desenvolvimento Moderno com Java

Este é o quarto capítulo de uma série completa sobre Quarkus. Prepare-se para uma jornada que vai transformar sua visão sobre desenvolvimento Java moderno!


Imagine desenvolver uma aplicação que funciona perfeitamente em desenvolvimento, mas quando chega à produção... 💥 BOOM! Problemas de configuração em todos os lugares. Familiar?

A configuração é literalmente o coração de qualquer aplicação moderna. É ela que permite que seu código se adapte graciosamente a diferentes ambientes sem precisar recompilar ou alterar uma única linha de código. No Quarkus, esse processo não é apenas simples - é elegante.

O Quarkus oferece um sistema de configuração robusto e flexível, baseado na especificação MicroProfile Config, que transforma o gerenciamento de propriedades em uma experiência quase mágica. Vamos descobrir como!


🚀 Gerenciamento de Propriedades: Seu Painel de Controle

No universo Quarkus, tudo começa com o arquivo src/main/resources/application.properties - seu painel de controle central. É aqui que você define as configurações que tornam sua aplicação inteligente e adaptável.

# application.properties - Seu centro de comando quarkus.application.name=minha-super-app quarkus.http.port=8080 minha.saudacao.personalizada=Bem-vindo ao poder do Quarkus! 
Enter fullscreen mode Exit fullscreen mode

Agora vem a parte interessante: como acessar essas propriedades no seu código? É aqui que a mágica do CDI se encontra com o sistema de configuração:

package com.example.resource; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.config.inject.ConfigProperty; @Path("/config") public class ConfigResource { @Inject @ConfigProperty(name = "quarkus.application.name") String nomeApp; @Inject @ConfigProperty(name = "minha.saudacao.personalizada", defaultValue = "Olá, desenvolvedor incrível!") String saudacaoPersonalizada; @GET @Produces(MediaType.TEXT_PLAIN) public String obterInfoConfiguracoes() { return String.format(""" 🎯 Nome da Aplicação: %s 💬 Mensagem: %s """, nomeApp, saudacaoPersonalizada); } } 
Enter fullscreen mode Exit fullscreen mode

🔥 Dica de Ouro: O defaultValue é seu melhor amigo! Ele garante que sua aplicação nunca quebre por causa de uma propriedade ausente, proporcionando uma experiência de desenvolvimento muito mais suave.


🎭 A Hierarquia das Configurações: Quem Manda Aqui?

Uma das funcionalidades mais poderosas do Quarkus é sua hierarquia de configurações. Imagine um sistema democrático onde cada fonte de configuração tem um "peso" diferente no voto final:

Ordem de Precedência (do menor para o maior poder):

  1. 🏠 Valores Padrão: Definidos no código via defaultValue
  2. 📄 application.properties: Seu arquivo de configuração base
  3. 🌍 Variáveis de Ambiente: Configurações do sistema operacional
  4. ⚡ Propriedades do Sistema Java: Passadas via linha de comando (-D)
  5. 🔧 MicroProfile Config Sources: Fontes customizadas avançadas

Exemplo Prático da Hierarquia:

# application.properties quarkus.http.port=8080 
Enter fullscreen mode Exit fullscreen mode
# Variável de ambiente sobrescreve o arquivo export QUARKUS_HTTP_PORT=9000 # Propriedade do sistema sobrescreve tudo java -Dquarkus.http.port=8081 -jar minha-app-runner.jar 
Enter fullscreen mode Exit fullscreen mode

Resultado: Sua aplicação rodará na porta 8081 (a propriedade do sistema venceu)! 🏆


🎨 Perfis de Configuração: Uma Aplicação, Múltiplas Personalidades

Aqui está onde o Quarkus realmente brilha! Os perfis de configuração permitem que sua aplicação tenha diferentes "personalidades" dependendo do ambiente. É como ter múltiplos avatares no mesmo jogo!

Estrutura dos Arquivos de Perfil:

src/main/resources/ ├── application.properties # 🌟 Configurações globais ├── application-dev.properties # 🛠️ Desenvolvimento ├── application-test.properties # 🧪 Testes └── application-prod.properties # 🚀 Produção 
Enter fullscreen mode Exit fullscreen mode

Exemplo Completo de Configuração Multi-Ambiente:

application.properties (base para todos):

# Configurações compartilhadas quarkus.application.name=minha-fantástica-app quarkus.log.level=INFO # Configurações que serão sobrescritas meu.banco.url=jdbc:h2:mem:testdb meu.servico.endpoint=http://localhost:8080/api meu.cache.habilitado=false 
Enter fullscreen mode Exit fullscreen mode

application-dev.properties (desenvolvimento):

# Configurações específicas para desenvolvimento meu.banco.url=jdbc:postgresql://localhost:5432/dev_db meu.servico.endpoint=http://localhost:3000/api quarkus.log.level=DEBUG quarkus.live.reload.enabled=true 
Enter fullscreen mode Exit fullscreen mode

application-prod.properties (produção):

# Configurações otimizadas para produção meu.banco.url=jdbc:postgresql://prod-cluster.empresa.com:5432/prod_db meu.servico.endpoint=https://api.empresa.com/v1 meu.cache.habilitado=true quarkus.log.level=WARN quarkus.log.min-level=WARN 
Enter fullscreen mode Exit fullscreen mode

Ativando os Perfis:

# Desenvolvimento (padrão com quarkus:dev) mvn quarkus:dev # Teste (padrão ao executar testes) mvn test # Produção via variável de ambiente export QUARKUS_PROFILE=prod java -jar target/quarkus-app/quarkus-run.jar # Produção via propriedade do sistema java -Dquarkus.profile=prod -jar target/quarkus-app/quarkus-run.jar 
Enter fullscreen mode Exit fullscreen mode

💡 Exemplo Avançado: Configuração Inteligente

Vamos criar um exemplo mais sofisticado que demonstra o poder real do sistema de configuração:

package com.example.config; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; import java.util.Optional; @ApplicationScoped public class ConfiguracaoApp { @Inject @ConfigProperty(name = "meu.servico.timeout", defaultValue = "5000") int timeoutServico; @Inject @ConfigProperty(name = "meu.cache.ttl", defaultValue = "3600") long cacheTtl; @Inject @ConfigProperty(name = "meu.debug.habilitado", defaultValue = "false") boolean debugHabilitado; // Propriedade opcional - pode não existir @Inject @ConfigProperty(name = "meu.feature.experimental") Optional<Boolean> featureExperimental; public String exibirConfiguracoes() { return String.format(""" 🔧 Configurações da Aplicação: ⏱️ Timeout do Serviço: %d ms 💾 TTL do Cache: %d segundos 🐛 Debug Habilitado: %s 🧪 Feature Experimental: %s """, timeoutServico, cacheTtl, debugHabilitado ? "✅ Sim" : "❌ Não", featureExperimental.map(f -> f ? "✅ Ativa" : "❌ Inativa") .orElse("🚫 Não configurada") ); } } 
Enter fullscreen mode Exit fullscreen mode
import com.example.config.ConfiguracaoApp; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.config.inject.ConfigProperty; @Path("/config") public class ConfigResource { @Inject @ConfigProperty(name = "quarkus.application.name") String nomeApp; @Inject @ConfigProperty(name = "minha.saudacao.personalizada", defaultValue = "Olá, desenvolvedor incrível!") String saudacaoPersonalizada; @Inject ConfiguracaoApp configuracaoApp; @GET @Produces(MediaType.TEXT_PLAIN) public String obterInfoConfiguracoes() { return String.format(""" 🎯 Nome da Aplicação: %s 💬 Mensagem: %s """, nomeApp, saudacaoPersonalizada); } @GET @Path("/exibir") @Produces(MediaType.TEXT_PLAIN) public String exibirConfiguracoes() { return configuracaoApp.exibirConfiguracoes(); } } 
Enter fullscreen mode Exit fullscreen mode

🧪 Testando Nossa Aplicação

Execute a aplicação em modo de desenvolvimento:

mvn compile quarkus:dev 
Enter fullscreen mode Exit fullscreen mode

Teste os endpoints:

# Exemplo simples curl "http://localhost:8080/config" # Exemplo avançado curl "http://localhost:8080/config/exibir" 
Enter fullscreen mode Exit fullscreen mode

🎯 Principais Vantagens do Sistema de Configuração do Quarkus

  • 🔄 Zero Recompilação: Mude configurações sem rebuild
  • 🌍 Multi-Ambiente: Uma aplicação, múltiplos comportamentos
  • 🔒 Type-Safe: Injeção tipada de propriedades
  • ⚡ Performance: Configurações resolvidas em tempo de compilação quando possível
  • 📝 Documentação Automática: O Quarkus pode gerar documentação das suas configurações

🚀 Conclusão

O sistema de configuração do Quarkus não é apenas poderoso - é intuitivo e elegante. Ele transforma uma das tarefas mais tediosas do desenvolvimento (gerenciar configurações) em algo simples e prazeroso.

Com perfis, hierarquia de precedência e injeção tipada, você tem controle total sobre como sua aplicação se comporta em cada ambiente, mantendo seu código limpo e profissional.

No próximo capítulo, vamos mergulhar no mundo das APIs RESTful com RESTEasy e descobrir como criar endpoints poderosos e elegantes! 🎯


🔗 Continue a Jornada

👉 Capítulo 5: Construindo APIs RESTful com RESTEasy - Aprenda a construir uma API RESTful com Quarkus


💬 Gostou deste capítulo? Deixe um comentário contando qual aspecto da configuração do Quarkus mais te surpreendeu! E se você tem dúvidas sobre configurações específicas, compartilhe aqui - vamos resolver juntos!

🔔 Não perca os próximos capítulos! Siga-me aqui no Dev.to para receber notificações sempre que um novo capítulo for publicado.

Top comments (1)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.