{"id":25,"date":"2026-02-15T06:37:36","date_gmt":"2026-02-15T09:37:36","guid":{"rendered":"https:\/\/tiagoiwamoto.com.br\/?p=25"},"modified":"2026-02-15T06:41:47","modified_gmt":"2026-02-15T09:41:47","slug":"aws-lambda-com-java-25-e-graalvm","status":"publish","type":"post","link":"https:\/\/tiagoiwamoto.com.br\/?p=25","title":{"rendered":"AWS Lambda com Java 25 e GraalVM"},"content":{"rendered":"\n<p>Usar Lambda com java j\u00e1 foi motivo de risos e muitos falariam que \u00e9 loucura, porem desde que a compila\u00e7\u00e3o nativa se tornou realidade este cen\u00e1rio vem mudando desde o java 11 quando as primeiras compila\u00e7\u00f5es nativas existiram.<\/p>\n\n\n\n<p>Mas desde o Java 17 tudo foi avan\u00e7ando de forma muito r\u00e1pida e hoje com o Java 25 se tornou algo totalmente tang\u00edvel e sem nenhuma perda ao comparar com Golang, python que sempre foram as primeiras escolhas quando o assunto era Lambda.<\/p>\n\n\n\n<p>Claro que existem tradeoffs a serem considerados e algumas configura\u00e7\u00f5es extras, nem tudo s\u00e3o flores mas eu acredito que logo tudo ser\u00e1 contornado e melhorado<\/p>\n\n\n\n<p>Bora por a m\u00e3o na massa ent\u00e3o, crie um projeto novo em java com maven, aqui estou com o maven 3.9.12 e java 25, vers\u00e3o do graalvm \u00e9 a 25 tamb\u00e9m.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.amazonaws&lt;\/groupId&gt;\n            &lt;artifactId&gt;aws-lambda-java-runtime-interface-client&lt;\/artifactId&gt;\n            &lt;version&gt;2.9.0&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.amazonaws&lt;\/groupId&gt;\n            &lt;artifactId&gt;aws-lambda-java-core&lt;\/artifactId&gt;\n            &lt;version&gt;1.4.0&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.amazonaws&lt;\/groupId&gt;\n            &lt;artifactId&gt;aws-lambda-java-events&lt;\/artifactId&gt;\n            &lt;version&gt;3.16.1&lt;\/version&gt;\n        &lt;\/dependency&gt;\n\n        &lt;dependency&gt;\n            &lt;groupId&gt;software.amazon.awssdk&lt;\/groupId&gt;\n            &lt;artifactId&gt;sqs&lt;\/artifactId&gt;\n            &lt;version&gt;2.41.20&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;software.amazon.awssdk&lt;\/groupId&gt;\n            &lt;artifactId&gt;url-connection-client&lt;\/artifactId&gt;\n            &lt;version&gt;2.41.20&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;tools.jackson.core&lt;\/groupId&gt;\n            &lt;artifactId&gt;jackson-databind&lt;\/artifactId&gt;\n            &lt;version&gt;3.0.4&lt;\/version&gt;\n        &lt;\/dependency&gt;\n\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;version&gt;1.18.42&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;!-- Provide a simple SLF4J binding so the NOP logger warning goes away during tests\/runtime --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.slf4j&lt;\/groupId&gt;\n            &lt;artifactId&gt;slf4j-simple&lt;\/artifactId&gt;\n            &lt;version&gt;1.7.36&lt;\/version&gt;\n            &lt;scope&gt;runtime&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;<\/code><\/pre>\n\n\n\n<p>Acima s\u00e3o as depend\u00eancias essenciais, abaixo vamos as configura\u00e7\u00f5es de build<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;plugins&gt;\n...\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.graalvm.buildtools&lt;\/groupId&gt;\n                &lt;artifactId&gt;native-maven-plugin&lt;\/artifactId&gt;\n                &lt;version&gt;0.11.4&lt;\/version&gt;\n                &lt;configuration&gt;\n                    &lt;imageName&gt;bootstrap&lt;\/imageName&gt;\n                    &lt;mainClass&gt;br.com.tiagoiwamoto.awslambdasamples.sqs.SqsLambdaHandler&lt;\/mainClass&gt;\n                &lt;\/configuration&gt;\n            &lt;\/plugin&gt;\n...\n&lt;\/plugins&gt;<\/code><\/pre>\n\n\n\n<p>O plugin acima \u00e9 essencial para que o maven entenda que ao gerar a imagem nativa seja com esse nome &#8216;bootstrap&#8217;<\/p>\n\n\n\n<p>E a parte do Profiles, que \u00e9 a mais importante, mas talvez a que vai levar mais tempo, pois dentro dela existe o buildArgs que voc\u00ea vai passando tudo que precisa ser inicializado em tempo de runtime ou no build do runtime e at\u00e9 mesmo configura\u00e7\u00f5es que deseja que seja incluido no processo do build do nativo, alem de apontar para arquivos de reflections,resources, aqui eu acredito ser a segunda parte mais chata a primeira \u00e9 o reflections que vamos ver j\u00e1 j\u00e1.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    &lt;profiles&gt;\n        &lt;profile&gt;\n            &lt;id&gt;native&lt;\/id&gt;\n            &lt;build&gt;\n                &lt;plugins&gt;\n                    &lt;plugin&gt;\n                        &lt;groupId&gt;org.graalvm.buildtools&lt;\/groupId&gt;\n                        &lt;artifactId&gt;native-maven-plugin&lt;\/artifactId&gt;\n                        &lt;version&gt;0.11.4&lt;\/version&gt;\n                        &lt;executions&gt;\n                            &lt;execution&gt;\n                                &lt;id&gt;build-native&lt;\/id&gt;\n                                &lt;goals&gt;\n                                    &lt;goal&gt;compile-no-fork&lt;\/goal&gt;\n                                &lt;\/goals&gt;\n                                &lt;phase&gt;package&lt;\/phase&gt;\n                            &lt;\/execution&gt;\n                        &lt;\/executions&gt;\n                        &lt;configuration&gt;\n                            &lt;mainClass&gt;br.com.tiagoiwamoto.awslambdasamples.sqs.SqsLambdaHandler&lt;\/mainClass&gt;\n                            &lt;skipNativeTests&gt;true&lt;\/skipNativeTests&gt;\n                            &lt;buildArgs&gt;\n                                ...\n                            &lt;\/buildArgs&gt;\n                        &lt;\/configuration&gt;\n                    &lt;\/plugin&gt;\n                &lt;\/plugins&gt;\n            &lt;\/build&gt;\n        &lt;\/profile&gt;\n    &lt;\/profiles&gt;<\/code><\/pre>\n\n\n\n<p>Se deu certo ao executar mvn clean package -Pnative voc\u00ea vai ver na pasta target 3 arquivos, sendo 2 deles os tradicionais .jar e um arquivo sem extens\u00e3o que \u00e9 o binario e com o nome informado no plugin do graalvm.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"146\" src=\"https:\/\/tiagoiwamoto.com.br\/wp-content\/uploads\/2026\/02\/image-1024x146.png\" alt=\"\" class=\"wp-image-30\" srcset=\"https:\/\/tiagoiwamoto.com.br\/wp-content\/uploads\/2026\/02\/image-1024x146.png 1024w, https:\/\/tiagoiwamoto.com.br\/wp-content\/uploads\/2026\/02\/image-300x43.png 300w, https:\/\/tiagoiwamoto.com.br\/wp-content\/uploads\/2026\/02\/image-768x110.png 768w, https:\/\/tiagoiwamoto.com.br\/wp-content\/uploads\/2026\/02\/image.png 1232w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>agora \u00e9 executar seu bin\u00e1rio e no meu caso coloquei s\u00f3 um &#8216;Starting Lambda&#8217; para testar<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    static void main() {\n        log.info(\"Starting Lambda\");\n    }<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"760\" height=\"136\" src=\"https:\/\/tiagoiwamoto.com.br\/wp-content\/uploads\/2026\/02\/image-1.png\" alt=\"\" class=\"wp-image-32\" srcset=\"https:\/\/tiagoiwamoto.com.br\/wp-content\/uploads\/2026\/02\/image-1.png 760w, https:\/\/tiagoiwamoto.com.br\/wp-content\/uploads\/2026\/02\/image-1-300x54.png 300w\" sizes=\"auto, (max-width: 760px) 100vw, 760px\" \/><\/figure>\n\n\n\n<p>Com isso podemos implementar nossa lambda.<\/p>\n\n\n\n<p>Para a compila\u00e7\u00e3o nativa n\u00e3o importa at\u00e9 a data de hoje (15\/02\/2026) voc\u00ea colocar aqueles @Override por conta do RequestHandler, nem precisa extender a classe na verdade. Isso porque a compila\u00e7\u00e3o nativa chama sempre o metodo main() e a partir dai voc\u00ea precisa implementar. <\/p>\n\n\n\n<p>Em um pr\u00f3ximo post vou mostrar como implementar um lambda sendo acionado por um Aws SQS que \u00e9 um fluxo super comum.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Usar Lambda com java j\u00e1 foi motivo de risos e muitos falariam que \u00e9 loucura, porem desde que a compila\u00e7\u00e3o nativa se tornou realidade este cen\u00e1rio vem mudando desde o java 11 quando as primeiras compila\u00e7\u00f5es nativas existiram. Mas desde o Java 17 tudo foi avan\u00e7ando de forma muito r\u00e1pida e hoje com o Java&#8230;<\/p>\n","protected":false},"author":1,"featured_media":34,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[2],"tags":[],"class_list":["post-25","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/25","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=25"}],"version-history":[{"count":8,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/25\/revisions"}],"predecessor-version":[{"id":37,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/25\/revisions\/37"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/media\/34"}],"wp:attachment":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=25"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}