Migrar del entorno de ejecución de Java 7 al de Java 8

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:

  1. Añade <runtime>java8</runtime> a tu archivo appengine-web.xml:

    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java8</runtime>
      <threadsafe>true</threadsafe>
    </appengine-web-app>
  2. 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.