Usando as bibliotecas de cliente do Cloud para Java, é possível compilar aplicativos como imagens nativas. Essa abordagem oferece benefícios de performance ao seu aplicativo usando a compilação antecipada para reduzir o tempo de inicialização a frio e a ocupação de memória do aplicativo.
Versões da biblioteca de cliente
Use a versão 25.4.0 ou mais recente da
lista de materiais das bibliotecas do Cloud (libraries-bom) ou bibliotecas de cliente
publicadas após maio de 2022.
A maioria dos usuários gerencia as versões da biblioteca de cliente usando o libraries-bom.
Essa é uma maneira fácil de verificar se as versões de todas as bibliotecas de cliente no
seu projeto são compatíveis entre si e estão atualizadas.
Para mais informações sobre como aplicar a libraries-bom ao seu projeto no Maven
e no Gradle, consulte Atualizar seu projeto para usar a BOM.
Bibliotecas permitidas
As bibliotecas de cliente do Google Cloud para Java estáveis listadas na tabela de APIs compatíveis oferecem suporte à compilação de imagens nativas.
Antes de começar
Para usar a compilação de imagens nativas com as bibliotecas de cliente do Google Cloud para Java desejadas, siga estas etapas de pré-requisito:
Se você ainda não tiver feito isso, crie um Google Cloud projeto.
Instale a Google Cloud CLI, que permite executar a amostra com as credenciais do seu projeto.
Depois de instalar a Google Cloud CLI, faça login com o Application Default Credentials usando o seguinte comando:
gcloud auth application-default loginInstale uma distribuição do JDK adequada, como o GraalVM.
Verifique se você instalou a extensão de imagem nativa executando o seguinte comando:
gu install native-imageVerifique se a versão padrão do Java está definida corretamente executando
java -versionem um terminal. O resultado será o seguinte:java -version openjdk version "17.0.9" 2023-10-17 OpenJDK Runtime Environment GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22) OpenJDK 64-Bit Server VM GraalVM CE 17.0.9+9.1 (build 17.0.9+9-jvmci-23.0-b22, mixed mode, sharing)
Criar um aplicativo como uma imagem nativa
As instruções a seguir usam os plug-ins de ferramentas de build nativas para criar um aplicativo como uma imagem nativa.
Instruções de configuração do Maven
Copie e cole esse texto no POM do aplicativo para usar o plug-in do Maven nativo para criar a imagem nativa do aplicativo. Substitua MAIN_CLASS pelo nome da sua classe principal e VERSION pela versão do plug-in nativo do Maven, como
0.10.1.<profiles> <profile> <id>native</id> <build> <plugins> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <version>VERSION</version> <extensions>true</extensions> <configuration> <mainClass>$MAIN_CLASS</mainClass> <buildArgs> <buildArg>--no-fallback</buildArg> <buildArg>--no-server</buildArg> </buildArgs> </configuration> <executions> <execution> <id>build-native</id> <goals> <goal>build</goal> </goals> <phase>package</phase> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>Execute
mvn package -Pnativepara gerar a imagem nativa na pasta./target.Execute o aplicativo como qualquer executável. Por exemplo,
./target/$IMAGE_NAME. O plug-in usa como padrão o ID do artefato do projeto.
Instruções de configuração do Gradle
Cole o texto a seguir no arquivo
build.gradlepara definir a classe principal do aplicativo.application { mainClass.set('$MAIN_CLASS') }Adicione o plug-in native-gradle conforme descrito em Como adicionar o plug-in.
Chame
./gradlew nativeCompilepara criar a imagem nativa no diretório./build/native/nativeCompile.Execute o aplicativo como um executável. Por exemplo,
./build/native/nativeCompile/$PROJECT_NAME. Com o plug-in, o nome da imagem é o nome do projeto por padrão.
Problemas comuns
Compatibilidade com SLF4J
Se você estiver realizando a compilação de imagem nativa em uma biblioteca de cliente com a dependência SLF4J, poderá encontrar o seguinte erro de tempo de build.
Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing io.grpc.netty.shaded.io.netty.util.internal.SystemPropertyUtil.getBoolean(java.lang.String, boolean)
Parsing context:
at io.grpc.netty.shaded.io.netty.util.internal.SystemPropertyUtil.getBoolean(SystemPropertyUtil.java:96)
at io.grpc.netty.shaded.io.netty.channel.epoll.Epoll.<clinit>(Epoll.java:33)
at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:153)
...
java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of org.slf4j.jul.JDK14LoggerAdapter are allowed in the image heap as this class should be initialized at image runtime. To see how this object got instantiated use --trace-object-instantiation=org.slf4j.jul.JDK14LoggerAdapter.
Adicione --initialize-at-run-time=io.grpc.netty.shaded.io.netty ao arquivo META-INF/native-image/$GROUP_ID/$ARTIFACT_ID/native-image.properties para resolver esse problema.
No entanto, essa configuração pode gerar um custo de desempenho para a imagem nativa gerada, dependendo do caminho de código seguido pelo aplicativo.
Como alternativa, use outra biblioteca de geração de registros, como Flogger ou a biblioteca java.util.logging.
Perguntas
Informe problemas e dúvidas relacionados à compilação de imagens nativas do Java na página de problemas do GitHub.