Compila imágenes nativas

Con las bibliotecas cliente de Cloud para Java, puedes compilar aplicaciones como imágenes nativas. Este enfoque proporciona beneficios de rendimiento a tu aplicación, ya que aprovecha la compilación anticipada para reducir el tiempo de inicio en frío y la huella de memoria de tu aplicación.

Versiones de la biblioteca cliente

Asegúrate de usar la versión 25.4.0 o posterior de la lista de materiales de las bibliotecas de Cloud (libraries-bom) o de usar las bibliotecas cliente publicadas después de mayo de 2022.

La mayoría de los usuarios administran sus versiones de la biblioteca cliente con libraries-bom. Esta es una forma sencilla de verificar que las versiones de todas las bibliotecas cliente de tu proyecto sean compatibles entre sí y estén actualizadas.

Para obtener más información sobre cómo aplicar libraries-bom a tu proyecto en Maven y Gradle, consulta Actualiza tu proyecto para usar la BOM.

Bibliotecas compatibles

Las bibliotecas cliente de Google Cloud para Java estables que se enumeran en la tabla de APIs compatibles admiten la compilación de imágenes nativas.

Antes de comenzar

Para usar la compilación de imágenes nativas con las bibliotecas cliente de Google Cloud para Java deseadas, sigue estos pasos previos:

  1. Si aún no lo hiciste, crea un Google Cloud proyecto.

  2. Instala la CLI de Google Cloud, que te permite ejecutar la muestra con las credenciales de tu proyecto.

  3. Después de instalar Google Cloud CLI, accede con las credenciales predeterminadas de la aplicación usando el siguiente comando:

    gcloud auth application-default login
    
  4. Instala una distribución de JDK adecuada, como GraalVM.

  5. Para asegurarte de haber instalado la extensión de imagen nativa, ejecuta el siguiente comando:

    gu install native-image
    
  6. Para verificar que la versión predeterminada de Java esté configurada correctamente, ejecuta java -version en una terminal. El resultado es similar a lo siguiente:

    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)
    

Compila una aplicación como una imagen nativa

En las siguientes instrucciones, se usan los complementos de herramientas de compilación nativas para compilar una aplicación como una imagen nativa.

Instrucciones de configuración de Maven

  1. Copia y pega este texto en el POM de tu aplicación para usar el complemento de Maven nativo y compilar la imagen nativa de la aplicación. Asegúrate de reemplazar MAIN_CLASS por el nombre de tu clase principal y VERSION por la versión del complemento nativo de 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>
    
  2. Ejecuta mvn package -Pnative para generar la imagen nativa en la carpeta ./target.

  3. Ejecuta la aplicación como cualquier otro ejecutable. Por ejemplo, ./target/$IMAGE_NAME. De forma predeterminada, el complemento usa el ID del artefacto del proyecto.

Instrucciones de configuración de Gradle

  1. Pega el siguiente texto en tu archivo build.gradle para establecer la clase principal de tu aplicación.

    application {
        mainClass.set('$MAIN_CLASS')
    }
    
  2. Agrega el complemento native-gradle como se describe en Cómo agregar el complemento.

  3. Llama a ./gradlew nativeCompile para compilar la imagen nativa en el directorio ./build/native/nativeCompile.

  4. Ejecuta la aplicación como un archivo ejecutable. Por ejemplo, ./build/native/nativeCompile/$PROJECT_NAME. Con el complemento, el nombre de la imagen se establece de forma predeterminada como el nombre del proyecto.

Problemas comunes

Compatibilidad con SLF4J

Si realizas la compilación de imágenes nativas en una biblioteca cliente con la dependencia SLF4J, es posible que veas el siguiente error en el tiempo de compilación.

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.

Agrega --initialize-at-run-time=io.grpc.netty.shaded.io.netty a tu archivo META-INF/native-image/$GROUP_ID/$ARTIFACT_ID/native-image.properties para solucionar este problema.

Sin embargo, esta configuración puede generar un costo de rendimiento para la imagen nativa generada, según la ruta de código que siga tu aplicación.

Como alternativa, considera usar otra biblioteca de registro, como Flogger o la biblioteca java.util.logging.

Preguntas

Informa cualquier problema o pregunta relacionados con la compilación de imágenes nativas de Java en la página de problemas de GitHub.

Próximos pasos