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 Stackdriver 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 tu web.xml.

Las clases que se vuelven a empaquetar requerirán rutas de importación nuevas en Java 8. Por ejemplo, si tu 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.

Cómo migrar aplicaciones gratuitas que usan java.net.HttpURLConnection

Si tu app no tiene la facturación habilitada y realiza solicitudes HTTP(S) con la clase java.net.HttpURLConnection o una biblioteca cliente de Google que usa esa clase, generará errores de entorno de ejecución. Para evitar esto, configura <url-stream-handler> como urlfetch en appengine-web.xml de la 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>

De forma alternativa, en lugar de especificar urlfetch, puedes habilitar la facturación para la aplicación y usar la configuración native predeterminada. La aplicación no debe generar un aumento en los costos si se ejecuta en Java 7. Ten en cuenta que, si la aplicación se basa en el encabezado HTTP X-Appengine-Inbound-Appid (se usa para la comunicación entre módulos), 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 lo siguiente a appengine-web.xml:

 <system-properties>
   <property name="appengine.file.encoding" value="US-ASCII"/>
 </system-properties>

Se pueden producir errores si algunos caracteres no están disponibles en el conjunto de ASCII y tu aplicación hace algunas suposiciones, como someString.getBytes().length == someString.length(). En la codificación de US-ASCII, esto se debe a que los caracteres que no son de ASCII se asignan a "?", aunque no es necesariamente así con la codificación de UTF-8.

Por ejemplo, si imprimes los bytes hexadecimales de una llamada a É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 a que É tiene un valor de codificación diferente.

Cómo aprovechar plenamente las características 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.
  • Todas las clases estándar de Java ahora están disponibles y ninguna clase se incluye en la lista blanca.
  • El sistema de archivos /tmp admite operaciones de escritura, esto requiere la asignación de RAM de la aplicación.
  • La E/S de la red ahora se puede ejecutar en cualquier conversación 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.