Migrazione da Java 7 al runtime Java 8

Questa pagina descrive come eseguire la migrazione dell'app App Engine esistente dal runtime Java 7 al runtime Java 8. Tieni presente che i runtime Java di App Engine si basano su OpenJDK.

Specifica del runtime Java 8 per la tua app

Per eseguire l'app nel runtime Java 8:

  1. Aggiungi <runtime>java8</runtime> al tuo file appengine-web.xml:

    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java8</runtime>
      <threadsafe>true</threadsafe>
    </appengine-web-app>
  2. Esegui nuovamente il deployment dell'app.

Migrazione da servizi non supportati

Alcuni servizi deprecati disponibili per il runtime Java 7 non sono supportati dal runtime Java 8. Google consiglia di eseguire la migrazione della tua applicazione alle alternative consigliate e di testare l'app nel runtime Java 7 con queste modifiche prima di eseguire la migrazione a Java 8.

I seguenti servizi deprecati non sono disponibili nel runtime Java 8:

Servizio deprecato Alternativa consigliata
Cloud Endpoints v1 Migrate to v2, il prodotto è stato rinominato Cloud Endpoints Frameworks. Tieni presente che questa operazione potrebbe richiedere la modifica delle app web, Android o iOS.
AppStats (jar appengine-api-labs) Esegui la migrazione a Cloud Trace. L'SDK genera un errore per le app che utilizzano la classe com.google.appengine.tools.AppstatsFilter nel runtime Java 8. Assicurati di eliminare tutti i riferimenti a AppstatsFilter da web.xml.

Le classi rinnovate richiederanno nuovi percorsi di importazione su Java 8. Ad esempio, se la tua app utilizzava com.google.appengine.repackaged.com.google.common.base.Optional, dovrai importare com.google.appengine.repackaged.com.google.common.base.$Optional, il cui nome è preceduto da $.

Migrazione di app gratuite che utilizzano java.net.HttpURLConnection

Se la fatturazione non è abilitata per la tua app ed effettua richieste HTTP(S) utilizzando la classe java.net.HttpURLConnection o una libreria client di Google che la utilizza, si verificheranno errori di runtime. Per evitare che questo accada, imposta <url-stream-handler> su urlfetch nel appengine-web.xml dell'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>

In alternativa, anziché specificare urlfetch, puoi abilitare la fatturazione per la tua applicazione e utilizzare l'impostazione predefinita di native. La tua app non dovrebbe comportare alcun aumento dei costi derivanti dall'esecuzione su Java 7. Tieni presente che se la tua app si basa sull'intestazione HTTP X-Appengine-Inbound-Appid (utilizzata per la comunicazione da modulo a modulo), è necessario utilizzare urlfetch.

Modifica della codifica predefinita dei file

App Engine ha cambiato la codifica file predefinita da US-ASCII in Java 7 a UTF-8 in Java 8. Per ripristinare la codifica predefinita su US-ASCII in Java 8, aggiungi quanto segue a appengine-web.xml:

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

Possono verificarsi errori se alcuni caratteri non sono presenti nel set ASCII e la tua applicazione formula determinate ipotesi, ad esempio someString.getBytes().length == someString.length(). Nella codifica US-ASCII, questo è vero perché i caratteri non ASCII vengono mappati a "?", ma questo non è necessariamente vero con la codifica UTF-8.

Ad esempio, se stampi i byte esadecimali dalle chiamate Éamonn.getBytes(), con UTF-8 sarà: c3 89 61 6d 6f 6e 6e (Éamonn), mentre con US-ASCII otterrai: 3f 61 6d 6f 6e 6e (?amonn) a causa del diverso valore di codifica di É.

Sfruttare appieno le funzionalità di runtime di Java 8

Di seguito è riportato un elenco parziale dei vantaggi della migrazione al runtime Java 8:

  • Jetty 9 supporta le applicazioni web Servlet 2.5 e 3.1, incluse le annotazioni servlet.
  • Ora sono disponibili tutte le classi Java standard e non esiste una lista consentita per le classi.
  • Il file system /tmp è scrivibile, occupando l'allocazione della RAM dell'app.
  • Ora l'I/O di rete può essere eseguito su qualsiasi thread Java. Le chiamate API App Engine richiedono ancora l'utilizzo di un thread di richiesta o di un thread creato dall'API Thread Manager.
  • Ora è supportato il linguaggio Java 8 completo, incluse API Stream, Lambdas e API Data / Ora.