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:
Adicione
<runtime>java8</runtime>
ao seu arquivoappengine-web.xml
: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.