0021 — Config de build native-image (Fase B)¶
Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-09-14 · Decidido em: 2026-08-24
Continua a decisão 0020 (Fase A — POI→FastExcel, o
bloqueio de biblioteca). Espelha a ADR central
0022 — native-image é o alvo de deploy.
É a etapa de build do native, antes do deploy (o deploy native está na 0028).
Contexto¶
Com o POI fora do grafo (0020), o nativeCompile do plugin io.micronaut.application já roda —
faltava só a configuração que a casa fixou: o perfil de build (otimização + GC) e o único hint
de reflexão recorrente da frota (o SentryAppender do logback, instanciado pelo Joran).
Decisão¶
- Perfil GraalVM no
build.gradle.kts. O accessor Kotlin DSLgraalvmNative {}não é gerado (o plugin native-build-tools entra transitivo, não aplicado direto), então configura-se viaconfigure<GraalVMExtension>+import org.graalvm.buildtools.gradle.dsl.GraalVMExtension: -PnativeQuick→-Ob(build ~40–60% mais rápido, binário maior/lento — loop de dev/e2e); sem a flag (prod) →-Os(menor imagem).--gc=serial— menor footprint de RAM; é o default da GraalVM CE, explicitado.-
A CE 25 não tem
--gc=G1, PGO nem--emit build-report(Oracle-GraalVM-only), e-O3em CE equivale a-O2— nada a prometer de-O3. -
reflect-config.jsonlocal emsrc/main/resources/META-INF/native-image/br.com.onpetro/bi-comercial-xls/, registrandoio.sentry.logback.SentryAppenderpor nome-como-string (nãoClass.class— evita o javac carregar a classe do Sentry, que arrastaorg.jetbrains.annotations.Nullableausente do classpath). É o único hint manual recorrente da casa, confirmado byte-idêntico em múltiplos apps native.
Consequências¶
nativeCompileverde é o gate do repo do app. O runtime (boot/Flyway/POST) é o e2e native, em repo separado (0022) — não replicado aqui.- Deploy segue JVM durante a migração (defer explícito, REGRA Nº 3). A topologia da 0022 manda o
Dockerfiledo repo continuar JVM (dockerfile-java, shadowJar); a imagem native é buildada na fábrica de imagens (outro repo). Por issodocs/app.json "native": truee odockerfile-java-nativeficam para a T7, não entram aqui — setarnative:trueagora mentiria o discriminador ("deploya native") que o gate doci.ymllê. - A hint do Sentry é dívida de repo de lib. O ideal é subir pra reachability-metadata da
xadm-comum-web(dona doSentryInitializer) e sumir a cópia local em toda a frota; o jar 0.5.0 ainda não a traz (verificado). Enquanto isso, a cópia local é o caminho.
Correção 2026-09-11: o
reflect-config.jsonlocal do item 2 não existe mais. A hint doSentryAppendervem daxadm-comum-web0.9.1, que embarcaMETA-INF/native-image/br.com.xadm/xadm-comum-web/reflect-config.jsoncom as mesmas três entradas (SentryAppendereSentryOptionscom construtor eallPublicMethods, eLevel.valueOf), e o native-image o descobre no classpath. A dívida de lib das Consequências está fechada.O deploy native deferido para a T7 está em vigor, e o native é o alvo único do
build.targets: decisão 0028.
Alternativas descartadas¶
graalvmNative {}(accessor direto): não compila — o plugin é transitivo, o accessor não é gerado.configure<GraalVMExtension>é o caminho.- Setar
native:true+ Dockerfile native já (T7): premature — abre o gate de deploy native com a fábrica/e2e ainda pendentes (B2/B3/B4). Deferido para T7 (REGRA Nº 3).
Correção 2026-09-14: o andaime
.ia/012saiu do repo depois de destilado; o ponteiro passou para a decisão 0028.