Migrar do tempo de execução do Java 7 para o Java 8

Esta página descreve como migrar a sua app do App Engine existente do runtime Java 7 para o runtime Java 8. Tenha em atenção que os tempos de execução Java do App Engine são baseados no OpenJDK.

Especificar o tempo de execução do Java 8 para a sua app

Para executar a sua app no tempo de execução do Java 8:

  1. Adicione <runtime>java8</runtime> ao seu ficheiro appengine-web.xml:

    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java8</runtime>
      <threadsafe>true</threadsafe>
    </appengine-web-app>
  2. Volte a implementar a sua app.

Migrar de serviços não suportados

Alguns serviços descontinuados disponíveis para o tempo de execução do Java 7 não são suportados pelo tempo de execução do Java 8. A Google recomenda que migre a sua aplicação para as alternativas recomendadas e teste a app no tempo de execução do Java 7 com essas alterações antes de migrar para o Java 8.

Os seguintes serviços descontinuados não estão disponíveis no tempo de execução do Java 8:

Serviço descontinuado Alternativa recomendada
Cloud Endpoints v1 Migre para a v2. O produto foi mudado para Cloud Endpoints Frameworks. Tenha em atenção que isto pode exigir que altere as suas aplicações Web, Android ou iOS.
AppStats (appengine-api-labs jar) Migre para o Cloud Trace. O SDK gera um erro para apps que usam a classe com.google.appengine.tools.AppstatsFilter no tempo de execução do Java 8. Certifique-se de que elimina todas as referências a AppstatsFilter do seu web.xml.

As classes reembaladas vão exigir novos caminhos de importação no Java 8. Por exemplo, se a sua app usou com.google.appengine.repackaged.com.google.common.base.Optional, tem de importar com.google.appengine.repackaged.com.google.common.base.$Optional com $ como prefixo do nome da classe.

Migração de apps gratuitas que usam java.net.HttpURLConnection

Se a sua app não tiver a faturação ativada e fizer pedidos HTTP(S) através da classe java.net.HttpURLConnection ou de uma biblioteca de cliente Google que use essa classe, vai causar erros de tempo de execução. Para evitar esta situação, defina o <url-stream-handler> como urlfetch nas appengine-web.xml da 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>

Em alternativa, em vez de especificar urlfetch, pode ativar a faturação para a sua aplicação e usar a definição native predefinida. A sua app não deve incorrer em aumentos de custos devido à execução no Java 7. Tenha em atenção que, se a sua app depender do cabeçalho HTTP X-Appengine-Inbound-Appid (usado para comunicação de módulo para módulo), tem de usar urlfetch.

Alterar a codificação de ficheiros predefinida

O App Engine alterou a codificação de ficheiros predefinida de US-ASCII no Java 7 para UTF-8 no Java 8. Para alterar a codificação predefinida novamente para US-ASCII no Java 8, adicione o seguinte ao seu appengine-web.xml:

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

Podem ocorrer erros se alguns carateres não estiverem no conjunto ASCII e a sua aplicação fizer determinadas suposições, como someString.getBytes().length == someString.length(). Na codificação US-ASCII, isto é verdade porque os carateres que não são ASCII são mapeados para "?", mas isto não é necessariamente verdade com a codificação UTF-8.

Por exemplo, se imprimir os bytes hexadecimais da chamada Éamonn.getBytes(), com UTF-8, vai obter: c3 89 61 6d 6f 6e 6e (Éamonn). No entanto, com US-ASCII, vai obter: 3f 61 6d 6f 6e 6e (?amonn) devido ao valor de codificação diferente de É.

Tirar total partido das funcionalidades de tempo de execução do Java 8

Segue-se uma lista parcial das vantagens da migração para o motor de execução Java 8:

  • O Jetty 9 suporta aplicações Web Servlet 2.5 e 3.1, incluindo anotações de servlet.
  • Todas as classes Java padrão estão agora disponíveis e não existe uma lista de autorização de classes.
  • O sistema de ficheiros /tmp é gravável, o que ocupa a atribuição de RAM da app.
  • Agora, a E/S de rede pode ser realizada em qualquer thread Java. As chamadas da API App Engine continuam a ter de estar num pedido de thread ou numa thread criada pela API Thread Manager.
  • O idioma Java 8 completo é agora suportado, incluindo a API Stream, as expressões lambda e a API Date / Time.