En esta página se describe cómo instalar y usar los servicios incluidos con la versión de Java más reciente compatible con el entorno estándar de App Engine. Tu aplicación puede acceder a los servicios agrupados a través del JAR de la API de App Engine.
Antes de empezar
Consulta la lista de APIs de servicios antiguos agrupados a las que puedes llamar en la última versión compatible de Java.
Esta página requiere que tu aplicación ejecute una versión de Java compatible. Para migrar tu aplicación del entorno de ejecución de primera generación al de segunda generación, consulta el artículo Migrar de Java 8 al entorno de ejecución de Java más reciente y la sección Consideraciones sobre la migración.
Si usas servicios agrupados antiguos y quieres actualizar a Java 21, consulta Actualizar una aplicación para obtener más información sobre las opciones de configuración.
Instalar el archivo JAR de la API de App Engine
Para usar los servicios empaquetados antiguos en tu aplicación Java más reciente compatible, debes usar un archivo appengine-web.xml
para configurar tu aplicación (en lugar de un archivo app.yaml
).
En el siguiente ejemplo se muestra cómo añadir ajustes de configuración en tu archivo appengine-web.xml
para la versión 21 y posteriores en EE10 (predeterminada), la versión 21 en EE8 y la versión 17 y anteriores. Para usar la versión compatible más reciente en la configuración predeterminada, debes actualizar los servlets y las dependencias de tu aplicación para incluir el espacio de nombres Jakarta
. Para obtener más información sobre las opciones de configuración, consulta Actualizar una aplicación.
Añade los siguientes ajustes en tu archivo appengine-web.xml
en función de la versión de Java:
v21 y versiones posteriores (EE10)
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<runtime>java21</runtime> <!-- or another supported version -->
<app-engine-apis>true</app-engine-apis>
</appengine-web-app>
v21 (EE8)
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<runtime>java21</runtime>
<system-properties> <!-- run your apps on EE8 -->
<property name="appengine.use.EE8" value="true"/>
</system-properties>
<app-engine-apis>true</app-engine-apis>
</appengine-web-app>
v17 y versiones anteriores
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<runtime>java17</runtime> <!-- or another supported version -->
<app-engine-apis>true</app-engine-apis>
</appengine-web-app>
Para especificar los servicios agrupados antiguos como dependencia, añade las siguientes líneas al archivo pom.xml
:
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
<version>2.0.31</version> <!-- or later-->
</dependency>
Si tu aplicación usa un archivo web.xml
, debes añadir el elemento <app-engine-apis>
y asignarle el valor true
:
<app-engine-apis>true</app-engine-apis>
Para desplegar tu aplicación Java 21, ejecuta el comando
mvn appengine:deploy
o el comando
gcloud app deploy ~/my_app/WEB-INF/appengine-web.xml
en una aplicación web compilada y almacenada provisionalmente.
Punto de entrada predeterminado usado por Java 21
Las aplicaciones Java 21 pueden beneficiarse de una configuración de usuario adicional al iniciar la JVM para aplicaciones web.
El punto de entrada predeterminado que se usa para iniciar la JVM lo generan los buildpacks de App Engine.
Esencialmente, es lo mismo que definir este punto de entrada en el archivo appengine-web.xml
. Por ejemplo:
java --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio.charset=ALL-UNNAMED -showversion -Xms32M -Xmx204M -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:+PrintCommandLineFlags -Dclasspath.runtimebase=/base/java_runtime -Djava.class.path=/base/java_runtime/runtime-main.jar -Djava.library.path=/base/java_runtime: com/google/apphosting/runtime/JavaRuntimeMainWithDefaults --fixed_application_path=/workspace /base/java_runtime
No recomendamos cambiar este punto de entrada predeterminado, ya que la configuración de memoria se calcula en función del tipo de instancia (F1, F2 o F4) y de la memoria disponible.
De forma predeterminada, usamos --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio.charset=ALL-UNNAMED
para abrir algunas APIs de JDK necesarias.
Funciones de punto de entrada
El punto de entrada de las versiones de Java de segunda generación se puede personalizar con variables de entorno definidas por el usuario que se añaden en el archivo de configuración appengine-web.xml
.
En la siguiente tabla se indican las variables de entorno que se pueden usar para habilitar, inhabilitar o configurar funciones, así como los valores predeterminados si no se definen:
Variable de entorno | Descripción | Tipo | Predeterminado |
---|---|---|---|
CPROF_ENABLE |
Stackdriver Profiler | booleano | false |
GAE_MEMORY_MB |
Memoria disponible | size | Definido por App Engine o /proc/meminfo -400M |
HEAP_SIZE_RATIO |
Memoria del montículo | porcentaje | 80 |
HEAP_SIZE_MB |
Montículo disponible | size | ${HEAP_SIZE_RATIO} % de ${GAE_MEMORY_MB} |
JAVA_HEAP_OPTS |
Argumentos de la pila de JVM | Argumentos de JVM | -Xms${HEAP_SIZE_MB}M -Xmx${HEAP_SIZE_MB}M |
JAVA_GC_OPTS |
Argumentos de GC de JVM | Argumentos de JVM | Configuración de -XX:+UseG1GC |
JAVA_USER_OPTS |
Otros argumentos de JVM | Argumentos de JVM | |
JAVA_OPTS |
Argumentos de JVM | Argumentos de JVM | Vea abajo |
Si no se define de forma explícita, JAVA_OPTS
se asigna de forma predeterminada:
JAVA_OPTS:=-showversion \
$JAVA_HEAP_OPTS \
$JAVA_GC_OPTS \
$JAVA_USER_OPTS
Si CPROF_ENABLE
es true, el punto de entrada predeterminado añade PROFILER_AGENT
de la siguiente forma:
-agentpath:/opt/cprof/profiler_java_agent.so=--logtostderr
Por ejemplo, si el código de tu aplicación necesita más marcas -add-opens
, puedes usar la variable de entorno JAVA_USER_OPTS
definida en el archivo appengine-web.xml
:
<env-variables>
<env-var name="JAVA_USER_OPTS" value="--add-opens java.base/java.util=ALL-UNNAMED" />
</env-variables>
Consideraciones sobre la migración
Debes tener en cuenta lo siguiente si vas a migrar a un tiempo de ejecución de Java de segunda generación y tu aplicación usa servicios empaquetados antiguos:
- Para probar las funciones de los servicios empaquetados antiguos en tu aplicación Java de segunda generación, puedes usar el servidor de desarrollo local.
- A diferencia del entorno de ejecución de Java 8, los entornos de ejecución de Java de segunda generación incluyen la JVM como parte de la memoria de la instancia. Si ve errores relacionados con la memoria en los registros, considere la posibilidad de aumentar el tamaño de la clase de instancia en el archivo
appengine-web.xml
. - Si tu aplicación intenta llamar a una API que no está habilitada para los tiempos de ejecución de Java de segunda generación, recibirá un error
com.google.apphosting.api.ApiProxy$FeatureNotEnabledException
. - Se presupone que todas las aplicaciones son seguras para subprocesos en los tiempos de ejecución de Java de segunda generación. Debes eliminar el elemento
threadsafe
de tu archivoapp.yaml
oappengine-web.xml
cuando migres de Java 8 al tiempo de ejecución de Java más reciente.
Ejemplo (Datastore)
Para ver un ejemplo de cómo usar Firestore en modo Datastore (Datastore), consulta el código de muestra de servicios empaquetados antiguos para Java 11 en GitHub.