Migrazione da Java 7 a Java 8 Runtime

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 l'app

Per eseguire l'app nel runtime Java 8:

  1. Aggiungi <runtime>java8</runtime> al 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 dell'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 ritirati non sono disponibili nel runtime Java 8:

Servizio ritirato Alternativa consigliata
Cloud Endpoints versione 1 Eseguire la migrazione alla versione 2, il prodotto è stato rinominato Cloud Endpoints Frameworks. Tieni presente che potrebbe essere necessario modificare le applicazioni web, Android o iOS.
AppStats (file 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.

I pacchetti di classi rielaborati 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 con $ anteposto al nome della classe.

Migrazione delle app gratuite che utilizzano java.net.HttpURLConnection

Se la fatturazione non è attivata nella tua app e invii richieste HTTP(S) utilizzando la classe java.net.HttpURLConnection o una libreria client Google che la utilizza, si verificheranno errori di runtime. Per evitare che ciò 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 attivare la fatturazione per la tua applicazione e utilizzare l'impostazione predefinita native. L'esecuzione dell'app su Java 7 non dovrebbe comportare alcun aumento dei costi. Tieni presente che se la tua app si basa sull'intestazione HTTP X-Appengine-Inbound-Appid (utilizzata per la comunicazione tra moduli), devi utilizzare urlfetch.

Modificare la codifica dei file predefinita

App Engine ha modificato la codifica dei 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>

Potrebbero verificarsi errori se alcuni caratteri non sono presenti nell'insieme ASCII e la tua applicazione fa determinate supposizioni, ad esempiosomeString.getBytes().length == someString.length(). Nella codifica US-ASCII questo è vero perché i caratteri non ASCII vengono mappati a "?", ma non è necessariamente vero con la codifica UTF-8.

Ad esempio, se stampi i byte esadecimali della chiamataÉamonn.getBytes(), con UTF-8 otterrai: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à del runtime Java 8

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

  • Jetty 9 supporta sia le applicazioni web Servlet 2.5 che 3.1, incluse le annotazioni servlet.
  • Ora sono disponibili tutte le classi Java standard e non esiste una lista consentita di classi.
  • Il file system /tmp è scrivibile e occupa l'allocazione della RAM dell'app.
  • Ora l'I/O di rete può essere eseguita su qualsiasi thread Java. Le chiamate all'API App Engine richiedono ancora di essere in un thread di richiesta o in un thread creato dall'API ThreadManager.
  • Ora è supportato il linguaggio Java 8 completo, incluse l'API Stream, le lambda e l'API Date / Time.