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.