Entorno de ejecución de Java

El tiempo de ejecución de Java es la pila de software encargada de instalar el código de tu aplicación y sus dependencias, y de ejecutar esa aplicación en el entorno flexible.

Versiones de Java

Java 21 usa buildpacks, que te ayudan a crear y configurar contenedores que puedes desplegar en Google Cloud.

Para ver la lista completa de las versiones de Java admitidas y sus versiones de Ubuntu correspondientes, consulta la programación de asistencia del tiempo de ejecución.

Para usar una versión de Java compatible, debes hacer lo siguiente:

  • Instala la versión 420.0.0 o posterior de gcloud CLI. Puedes actualizar las herramientas de la CLI ejecutando el comando gcloud components update. Para ver la versión instalada, puedes ejecutar el comando gcloud version.

  • Para desplegar tu aplicación con Maven, debes añadir el complemento Maven de App Engine a tu pom.xml:

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.8.1</version>
    </plugin>

    Otras opciones de implementación son el comando gcloud app deploy o el plugin Gradle de App Engine.

  • Incluye los ajustes runtime_config y operating_system en el archivo app.yaml para especificar un sistema operativo.

  • También puedes especificar una versión del tiempo de ejecución incluyendo el ajuste runtime_version en el archivo app.yaml. De forma predeterminada, se usa la versión más reciente de Java si no se especifica el ajuste runtime_version.

    Ejemplos

    • Para especificar Java 21 en Ubuntu 22, haz lo siguiente:

      runtime: java
      env: flex
      
      runtime_config:
          operating_system: "ubuntu22"
          runtime_version: "21"
      
    • Para especificar la versión de Java más reciente compatible en Ubuntu 22, haz lo siguiente:

        runtime: java
        env: flex
      
        runtime_config:
            operating_system: "ubuntu22"
      

Versiones anteriores del entorno de ejecución

En Java 8, especifica los ajustes runtime_config y jdk en el archivo app.yaml.

Java 8 admite lo siguiente:

  • El tiempo de ejecución de Eclipse Jetty 9 y ejecuta Jetty 9 con Servlet 3.1.

  • El código de tu servidor, que escucha en el puerto 8080 como parte de tu aplicación. Esta función te permite usar frameworks de microservicios como SparkJava y Spring Boot.

Ejemplos

  • Especificar la versión 9 de Jetty (opcional o predeterminada):

      runtime_config:
        jdk: openjdk8
        server: jetty9
    
  • Especificar la versión 8 de Java:

      runtime_config:
        jdk: openjdk8
    
  • Ejemplo app.yaml para Java 8:

    runtime: java
    env: flex
    
    handlers:
    - url: /.*
      script: this field is required, but ignored

Consulta pom.xml para configurar Maven y build.gradle para configurar Gradle.

Archivos opcionales

Estos archivos de configuración son opcionales:

Coloca estos archivos en el nivel superior de MyDir. Si usas alguno de estos archivos, debes implementarlos por separado con el comando gcloud app deploy.

web.xml es opcional y solo es necesario si no usas anotaciones de Servlet 3.x.

Puede colocar contenido web estático, así como sus páginas JavaServer, en el directorio webapp/. Jetty 9, que el entorno flexible de App Engine usa como contenedor de servlets, usa Apache Jasper como implementación predeterminada de JSP e incluye bibliotecas de etiquetas JSTL.

El archivo Dockerfile es opcional y se usa para personalizar el tiempo de ejecución de Java.

Habilitar la compresión gzip

El controlador gzip se incluye con Jetty, pero no está activado de forma predeterminada. Para activar este módulo, define la variable de entorno JETTY_MODULES_ENABLE=gzip en el archivo app.yaml:

env_variables:
  JETTY_MODULES_ENABLE: 'gzip'

Usar la guía de inicio rápido

Jetty puede acelerar el tiempo de inicio de tu aplicación preanalizando su contenido y generando archivos de configuración. Si usas una imagen ampliada, puedes activar la guía de inicio rápido ejecutando /scripts/jetty/quickstart.sh en tu Dockerfile, después de añadir el archivo WAR de la aplicación.

Variables de entorno

Puedes definir las siguientes variables de entorno opcionales que son específicas del tiempo de ejecución de Java 8/Jetty 9. También puedes definir variables de entorno de OpenJDK 8.

Para definir variables de entorno, usa la clave env_variables en el archivo app.yaml.

Variable de entorno Maven Prop Valor/Comentario
JETTY_PROPERTIES Lista separada por comas de pares name=value añadidos a $JETTY_ARGS
JETTY_MODULES_ENABLE Lista separada por comas de los módulos que se van a habilitar. Para ello, se añade a $JETTY_ARGS.
JETTY_MODULES_DISABLE Lista separada por comas de los módulos que se van a inhabilitar quitándolos de $JETTY_BASE/start.d
JETTY_ARGS Argumentos transferidos a start.jar de Jetty. Aquí se deben incluir los argumentos que se usen para la configuración personalizada de Jetty.
JAVA_OPTS Argumentos del entorno de ejecución de JVM

Cloud Logging mejorado (beta)

Cuando se ejecuta en el entorno flexible de App Engine, puedes configurar Java Util Logging para enviar registros a Cloud Logging definiendo la variable de entorno JETTY_ARGS. Por ejemplo:

 env_variables:
   JETTY_ARGS: -Djava.util.logging.config.file=WEB-INF/logging.properties

Debes proporcionar un archivo logging.properties que configure un LoggingHandler de la siguiente manera:

handlers=com.google.cloud.logging.LoggingHandler

# Optional configuration
.level=INFO
com.google.cloud.logging.LoggingHandler.level=FINE
com.google.cloud.logging.LoggingHandler.log=gae_app.log
com.google.cloud.logging.LoggingHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%3$s: %5$s%6$s

Compatibilidad con otros entornos de ejecución de Java

Si necesitas usar una versión de Java que no sea compatible, puedes crear un runtime personalizado y seleccionar una imagen base válida con la versión de Java que necesites.

Para obtener información sobre las imágenes base proporcionadas por Google o las imágenes base de Java de Docker, consulta el artículo Crear tiempos de ejecución personalizados.

Organizar tus archivos

El árbol de origen debería tener este aspecto:

MyDir/
  [pom.xml]
  [build.gradle]
  [index.yaml]
  [cron.yaml]
  [dispatch.yaml]
  src/main/
    appengine/
      app.yaml
    docker/
      [Dockerfile]
    java/
      com.example.mycode/
        MyCode.java
    webapp/
      [index.html]
      [jsp.jsp]
      WEB-INF/
        [web.xml]

Pruebas locales

Cuando hagas pruebas en tu entorno local, puedes usar servicios Google Cloud emulados en lugar de servicios Google Cloud remotos. Puedes usar los siguientes emuladores:

Usa el comando gcloud para iniciarlos antes de ejecutar tu aplicación:

gcloud beta emulators datastore start
gcloud beta emulators pubsub start
gcloud beta emulators bigtable start

Maven

Añade estas líneas al archivo pom.xml de Maven para añadir el plugin Maven de Jetty 9:

<plugin>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-maven-plugin</artifactId>
  <version>9.4.2.v20170220</version>
</plugin>

Para ejecutar tu aplicación de forma local, usa el comando de Maven:

mvn jetty:run-exploded

Gradle

Sigue las instrucciones para crear un proyecto de Gradle y añadir el complemento Gretty Gradle a tu build.gradle. Después, usa el siguiente comando:

gradle jettyRun

Implementa tu aplicación

Para inicializar Google Cloud CLI, ejecuta el siguiente comando:

gcloud init

Una vez que hayas completado las configuraciones, puedes usar la CLI de Google Cloud para desplegar este directorio que contiene los archivos app.yaml y WAR con el siguiente comando:

gcloud app deploy app.yaml

Si usas alguno de los archivos de configuración opcionales (index.yaml, cron.yaml y dispatch.yaml), despliégalos por separado con el comando gcloud. Por ejemplo:

gcloud app deploy cron.yaml

Maven

Usa Maven para desplegar tu aplicación:

mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID

Sustituye PROJECT_ID por el ID de tu Google Cloud proyecto. Si tu archivo pom.xml ya especifica tu ID de proyecto, no es necesario que incluyas la propiedad -Dapp.deploy.projectId en el comando que ejecutes.

Gradle

Usa Gradle para desplegar tu aplicación:

gradle appengineDeploy