0019 — Bump major para Java 25 + Micronaut 5¶
Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-06-17 · Decidido em: 2026-06-17
Contexto¶
O projeto estava em Micronaut 4.7.6 / Java 21 — uma major atrás. O salto para Micronaut 5 exige Java 25 baseline e traz breaking changes que não são óbvios no diff; registrar aqui evita que o próximo bump redescubra cada um na marra.
Decisão¶
Subir para Java 25 (GraalVM 25.0.3) + Gradle 9.5.1 + Micronaut 5.0.2. O Gradle
roda em Java 25 (o plugin io.micronaut.application 5 exige). Efeitos colaterais
resolvidos no mesmo trabalho:
- Serde default: o MN5 expõe
JsonMapper, não registra maisObjectMapperpor padrão → umJacksonObjectMapperFactoryprovê o bean que Telegram/Coolify/ exporter injetam (era a causa sistêmica de ~24 falhas de DI). - jackson-databind não vem mais transitivo do
micronaut-jackson-databind→ dependência explícita nobuild.gradle. ViewModelProcessor<T, R>(micronaut-views 6) ganhou um 2º type arg.- Checksum S3: o AWS SDK ≥2.30 liga flexible checksums (CRC32) que o Garage
rejeita →
RequestChecksumCalculation.WHEN_REQUIREDno cliente S3. - Testcontainers com versão explícita (o BOM não propagava sob Gradle 9).
Consequências¶
- Stack atual, CVEs do Netty corrigidos, baseline alinhado ao framework.
- CI/Docker (
temurin:25,setup-java 25) precisam de um run real de CI para confirmar — validar no primeiro PR antes do merge. - Jackson 2 → 3 consolidado (feito depois): o código migrou para o namespace
tools.jackson.*(Jackson 3, que o MN5 usa) —ObjectMapperimutável viaJsonMapper.builder(), exceptions unchecked (JacksonException), java.time built-in,DateTimeFeature/StreamWriteFeatureno lugar das flags movidas. As deps explícitas de Jackson 2 (jackson-databind,jackson-datatype-jsr310) saíram do build — o uber-jar deixa de carregar as ~800 classes duplicadas. As anotações@Json*continuam emcom.fasterxml.jackson.annotation(compartilhado). Contrato do export canônico preservado (gate:ProcessamentoConformidadeTest).
Alternativas consideradas¶
- Ficar no último 4.x (Java 21): pega CVEs sem exigir Java 25, mas adia o inevitável e não destrava os primitivos do MN5. Foi o passo intermediário testado; seguimos para o 5 por ser a base alvo.