Pular para conteúdo

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 mais ObjectMapper por padrão → um JacksonObjectMapperFactory provê 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 no build.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_REQUIRED no 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) — ObjectMapper imutável via JsonMapper.builder(), exceptions unchecked (JacksonException), java.time built-in, DateTimeFeature/StreamWriteFeature no 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 em com.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.