En esta página se describe cómo migrar una aplicación de App Engine del entorno de ejecución de Java 7 al de Java 8. Ten en cuenta que los entornos de ejecución de Java de App Engine se basan en OpenJDK.
Especificar el entorno de ejecución de Java 8 para tu aplicación
Para ejecutar tu aplicación en el entorno de ejecución de Java 8, sigue estos pasos:
Añade
<runtime>java8</runtime>
a tu archivoappengine-web.xml
:Vuelve a implementar tu aplicación.
Migrar desde servicios no compatibles
Algunos servicios obsoletos disponibles para el entorno de ejecución de Java 7 no son compatibles con el entorno de ejecución de Java 8. Google recomienda que migres tu aplicación a las alternativas recomendadas y que la pruebes en el tiempo de ejecución de Java 7 con esos cambios antes de migrar a Java 8.
Los siguientes servicios obsoletos no están disponibles en el entorno de ejecución de Java 8:
Servicio obsoleto | Alternativa recomendada |
---|---|
Cloud Endpoints v1 | Migra a la versión 2, cuyo nombre ha cambiado a Cloud Endpoints Frameworks. Ten en cuenta que es posible que tengas que cambiar tus aplicaciones web, Android o iOS. |
AppStats (archivo JAR appengine-api-labs) | Migra a Cloud Trace. El SDK genera un error en las aplicaciones que usan la clase com.google.appengine.tools.AppstatsFilter en el tiempo de ejecución de Java 8. Elimina todas las referencias a AppstatsFilter de tu web.xml . |
Las clases empaquetadas de nuevo requerirán nuevas rutas de importación en Java 8. Por ejemplo, si tu aplicación usaba com.google.appengine.repackaged.com.google.common.base.Optional
, tendrás que importar com.google.appengine.repackaged.com.google.common.base.$Optional
con el prefijo $
en el nombre de la clase.
Migrar aplicaciones gratuitas que usan java.net.HttpURLConnection
Si tu aplicación no tiene habilitada la facturación y hace solicitudes HTTP(S) mediante la clase java.net.HttpURLConnection
o una biblioteca de cliente de Google que utilice esa clase, se producirán errores de tiempo de ejecución.
Para evitarlo, asigna el valor urlfetch
a <url-stream-handler>
en el appengine-web.xml
de tu aplicación:
<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <!-- ... --> <url-stream-handler>urlfetch</url-stream-handler> <!-- ... --> </appengine-web-app>
También puedes habilitar la facturación de tu aplicación y usar el ajuste native
predeterminado en lugar de especificar urlfetch
. Tu aplicación no debería incurrir en ningún aumento de costes por ejecutarse en Java 7. Ten en cuenta que, si tu aplicación depende del encabezado HTTP X-Appengine-Inbound-Appid
(que se usa para la comunicación entre módulos), debes usar urlfetch
.
Cambiar la codificación de archivos predeterminada
App Engine ha cambiado la codificación de archivos predeterminada de US-ASCII
en Java 7 a UTF-8
en Java 8. Para volver a cambiar la codificación predeterminada a US-ASCII
en Java 8, añade lo siguiente a tu appengine-web.xml
:
<system-properties>
<property name="appengine.file.encoding" value="US-ASCII"/>
</system-properties>
Pueden producirse errores si algunos caracteres no están en el conjunto ASCII y tu aplicación hace determinadas suposiciones, como someString.getBytes().length == someString.length()
. En la codificación US-ASCII, esto es cierto porque los caracteres que no son ASCII se asignan a "?", pero no es necesariamente cierto en la codificación UTF-8.
Por ejemplo, si imprimes los bytes hexadecimales de la llamada Éamonn.getBytes()
, con UTF-8 será c3 89 61 6d 6f 6e 6e
(Éamonn
), mientras que con US-ASCII será 3f 61 6d 6f 6e 6e
(?amonn
) debido al valor de codificación diferente de É
.
Aprovechar al máximo las funciones del entorno de ejecución de Java 8
A continuación, se muestra una lista parcial de las ventajas de migrar al entorno de ejecución de Java 8:
- Jetty 9 admite aplicaciones web Servlet 2.5 y 3.1, incluidas las anotaciones de servlet.
- Ahora están disponibles todas las clases estándar de Java y no hay ninguna lista de clases permitidas.
- El sistema de archivos
/tmp
se puede escribir, lo que ocupa la asignación de RAM de la aplicación. - Ahora, las operaciones de E/S de red se pueden realizar en cualquier subproceso de Java. Las llamadas a la API de App Engine siguen requiriendo que se realicen en un hilo de solicitud o en un hilo creado por la API ThreadManager.
- Ahora se admite el lenguaje Java 8 completo, incluidas las APIs Stream, Lambdas y Date/Time.