Como migrar do ambiente de execução do Java 7 para o Java 8

Nesta página, descrevemos como migrar o aplicativo existente do App Engine do ambiente de execução do Java 7 para o Java 8. Os ambientes de execução Java do App Engine são baseados em OpenJDK.

Como especificar o ambiente de execução do Java 8 para o aplicativo

Para executar o aplicativo no ambiente de execução do Java 8:

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

    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java8</runtime>
      <threadsafe>true</threadsafe>
    </appengine-web-app>
  2. Implante o aplicativo novamente.

Como migrar de serviços não compatíveis

Alguns serviços obsoletos disponíveis para o ambiente de execução do Java 7 não são compatíveis com o ambiente de execução do Java 8. O Google recomenda migrar o aplicativo para as alternativas recomendadas e testá-lo no ambiente de execução do Java 7 com essas alterações antes de migrar para o Java 8.

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

Serviço obsoleto Alternativa recomendada
Cloud Endpoints v1 Migrar para v2. O produto foi renomeado para Cloud Endpoints Frameworks. Isso pode exigir que você altere os aplicativos para Web, Android ou iOS.
AppStats (appengine-api-labs jar) Migrar para o Cloud Trace. O SDK gera um erro para aplicativos que usam a classe com.google.appengine.tools.AppstatsFilter no ambiente de execução do Java 8. Certifique-se de excluir todas as referências a AppstatsFilter de seu web.xml.

Classes reempacotadas exigirão novos caminhos de importação no Java 8. Por exemplo, se o aplicativo usou com.google.appengine.repackaged.com.google.common.base.Optional, você precisará importar com.google.appengine.repackaged.com.google.common.base.$Optional, com $ como prefixo do nome da classe.

Como migrar apps gratuitos que usam java.net.HttpURLConnection

Se o aplicativo não tiver o faturamento ativado e fizer solicitações HTTP(S) usando a classe java.net.HttpURLConnection ou uma biblioteca de cliente do Google que usa essa classe, o aplicativo causará erros de ambiente de execução. Para evitar isso, defina <url-stream-handler> como urlfetch no appengine-web.xml do aplicativo:

<?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, em vez de especificar urlfetch, ative o faturamento para seu aplicativo e use a configuração native padrão. O aplicativo não terá nenhum aumento nos custos da execução no Java 7. Se o aplicativo depender do cabeçalho HTTP X-Appengine-Inbound-Appid, usado para a comunicação entre módulos, urlfetch precisará ser usado.

Como alterar a codificação de arquivo padrão

O App Engine alterou a codificação de arquivo padrão de US-ASCII no Java 7 para UTF-8 no Java 8. Para alterar a codificação padrão de volta 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>

Erros podem ocorrer se alguns caracteres não estiverem no conjunto ASCII e seu aplicativo fizer certas suposições, como someString.getBytes().length == someString.length(). Na codificação US-ASCII, isso é verdadeiro porque caracteres não ASCII são mapeados como "?", mas isso não é necessariamente verdadeiro com a codificação UTF-8.

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

Como aproveitar ao máximo os recursos do ambiente de execução do Java 8

Veja a seguir uma lista parcial das vantagens de migrar para o ambiente de execução do Java 8:

  • O Jetty 9 é compatível com os aplicativos da Web Servlet 2.5 e 3.1, incluindo notas de servlet.
  • Todas as classes Java padrão estão disponíveis e não há lista de permissões de classe.
  • O sistema de arquivos /tmp é gravável. Isso ocupa a alocação de RAM do aplicativo.
  • As operações de E/S de rede agora podem ser executadas em qualquer thread Java. As chamadas da API do App Engine ainda precisam estar em um thread de solicitação ou em um thread criado pela API Thread Manager.
  • A linguagem Java 8 completa agora é compatível, incluindo a API Stream, Lambdas e a API Date/Time.