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:
Aggiungi
<runtime>java8</runtime>
al tuo fileappengine-web.xml
: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.