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

En esta página, se describe cómo migrar tu app de App Engine actual del entorno de ejecución de Java 7 al de Java 8. Ten en cuenta que los entornos de ejecución de Java en App Engine se basan en OpenJDK.

Especifica el entorno de ejecución de Java 8 para tu app

Para ejecutar tu app en el entorno de ejecución de Java 8, sigue estos pasos:

  1. Agrega <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 la app.

Migra desde servicios no compatibles

El entorno de ejecución de Java 8 no admite algunos servicios obsoletos disponibles en el entorno de ejecución de Java 7. Google recomienda que migres tu app a las alternativas recomendadas y la pruebes en el entorno 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 v2, se cambió el nombre del producto Cloud Endpoints Frameworks Ten en cuenta que esto podría requerir que cambies tus aplicaciones web, de Android o de iOS.
Estadísticas de la aplicación (appengine-api-labs jar) Migra a Cloud Trace. El SDK genera un error para las apps que usan la clase com.google.appengine.tools.AppstatsFilter en el entorno de ejecución de Java 8. Asegúrate de borrar todas las referencias a AppstatsFilter desde web.xml.

Las clases que se vuelven a empaquetar requerirán rutas de importación nuevas en Java 8. Por ejemplo, si la app usó com.google.appengine.repackaged.com.google.common.base.Optional, deberás importar com.google.appengine.repackaged.com.google.common.base.$Optional, con el prefijo $ en el nombre de la clase.

Migra apps gratuitas que usan java.net.HttpURLConnection

Si la app no tiene habilitada la facturación y realiza solicitudes HTTP(S) mediante la clase java.net.HttpURLConnection o una biblioteca cliente de Google que la use, generará errores de entorno de ejecución. Para evitar esto, configura <url-stream-handler> como urlfetch en el appengine-web.xml de la app:

<?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>

Como alternativa, en lugar de especificar urlfetch, puedes habilitar la facturación de tu aplicación y usar la configuración predeterminada native. La aplicación no debe generar un aumento en los costos si se ejecuta en Java 7. Ten en cuenta que si tu app se basa en el encabezado HTTP X-Appengine-Inbound-Appid (usado para la comunicación de módulo a módulo), se debe usar urlfetch.

Cambia la codificación de archivos predeterminada

App Engine cambió 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, agrega la siguiente información al archivo 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 realiza ciertas suposiciones, como someString.getBytes().length == someString.length(). En la codificación US-ASCII, esto es así porque los caracteres que no son de ASCII se mapean a “?”. Sin embargo, esto no es necesariamente así con la codificación UTF-8.

Por ejemplo, si imprimes los bytes hexadecimales a partir de una llamada a Éamonn.getBytes(), con UTF-8 será: c3 89 61 6d 6f 6e 6e (Éamonn); en cambio, con US-ASCII obtendrás: 3f 61 6d 6f 6e 6e (?amonn) debido a los diferentes valores de codificación de É.

Aprovecha 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 migración al entorno de ejecución de Java 8:

  • Jetty 9 admite aplicaciones web de Servlet 2.5 y 3.1, incluidas las anotaciones del servlet.
  • Ahora están disponibles todas las clases estándar de Java y ninguna clase se incluye en la lista de anunciantes permitidos.
  • Se puede escribir en el sistema de archivos /tmp. Esto requiere la asignación de RAM de la app.
  • La E/S de la red ahora se puede ejecutar en cualquier subproceso de Java. Las llamadas a la API de App Engine aún requieren estar en una conversación de la solicitud o una conversación creada por la API de administrador de conversaciones.
  • Ahora se admite el lenguaje completo de Java 8, incluidas la API de transmisión, las funciones Lambda y la API de fecha y hora.