Auf dieser Seite wird beschrieben, wie Sie Ihre vorhandene App Engine-Anwendung von der Java 7-Laufzeit zur Java 8-Laufzeit migrieren. Die Java-Laufzeiten von App Engine beruhen auf OpenJDK.
Java 8-Laufzeit für die Anwendung angeben
So führen Sie Ihre Anwendung in der Java 8-Laufzeit aus:
Fügen Sie
<runtime>java8</runtime>
zu Ihrer Dateiappengine-web.xml
hinzu:Stellen Sie die Anwendung noch einmal bereit.
Von nicht unterstützten Diensten migrieren
Einige veraltete Dienste, die in der Java 7-Laufzeit verfügbar sind, werden in der Java 8-Laufzeit nicht unterstützt. Google empfiehlt, dass Sie Ihre Anwendung zu den empfohlenen Alternativen migrieren und dann mit diesen Änderungen in der Java 7-Laufzeit testen, bevor Sie sie zu Java 8 migrieren.
Die folgenden veralteten Dienste sind in der Java 8-Laufzeit nicht verfügbar:
Veralteter Dienst | Empfohlene Alternative |
---|---|
Cloud Endpoints Version 1 | Migrieren Sie zu Version 2. Das Produkt wurde in Cloud Endpoints Frameworks umbenannt. Möglicherweise müssen Sie deshalb Ihre Web-, Android- oder iOS-Anwendungen ändern. |
AppStats (appengine-api-labs jar) | Zu Cloud Trace migrieren Das SDK generiert einen Fehler für Anwendungen, die die com.google.appengine.tools.AppstatsFilter -Klasse in der Java 8-Laufzeit verwenden. Achten Sie darauf, alle Verweise auf AppstatsFilter aus Ihrem web.xml zu löschen. |
Umgepackte Klassen erfordern neue Importpfade in Java 8. Wenn Ihre Anwendung beispielsweise com.google.appengine.repackaged.com.google.common.base.Optional
verwendet hat, müssen Sie com.google.appengine.repackaged.com.google.common.base.$Optional
importieren, wobei $
dem Klassennamen vorangestellt wird.
Kostenlose Anwendungen migrieren, die java.net.HttpURLConnection verwenden
Wenn Ihre Anwendung die Abrechnung nicht aktiviert hat und HTTP(S)-Anfragen über die java.net.HttpURLConnection
-Klasse oder eine Google-Clientbibliothek sendet, die diese Klasse verwendet, verursacht dies Laufzeitfehler.
Um dies zu vermeiden, setzen Sie <url-stream-handler>
im appengine-web.xml
Ihrer Anwendung auf urlfetch
:
<?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>
Anstatt urlfetch
anzugeben, können Sie auch die Abrechnung für Ihre Anwendung aktivieren und die Standardeinstellung native
verwenden. Die Anwendung sollte nicht mehr Kosten verursachen als unter Java 7. Verwenden Sie urlfetch
, falls Ihre Anwendung den HTTP-Header X-Appengine-Inbound-Appid
benötigt (wird für die Modul-zu-Modul-Kommunikation verwendet).
Standarddateicodierung ändern
In App Engine wurde die Standarddateicodierung von US-ASCII
in Java 7 zu UTF-8
in Java 8 geändert. Um die Standardcodierung in Java 8 wieder in US-ASCII
zu ändern, fügen Sie Folgendes zu Ihrer appengine-web.xml
hinzu:
<system-properties>
<property name="appengine.file.encoding" value="US-ASCII"/>
</system-properties>
Unter Umständen können Probleme auftreten, wenn einige Zeichen nicht im ASCII-Satz enthalten sind und Ihre Anwendung bestimmte Annahmen wie someString.getBytes().length == someString.length()
trifft. In der US-ASCII-Codierung trifft dies zu, da Nicht-ASCII-Zeichen dem Zeichen "?" zugeordnet werden. Dies ist in der UTF-8-Codierung jedoch nicht unbedingt der Fall.
Beispiel: Angenommen, Sie geben die Byte, die beim Aufruf von Éamonn.getBytes()
zurückgegeben werden, im Hex-Format aus. Dann erhalten Sie mit UTF-8 c3 89 61 6d 6f 6e 6e
(Éamonn
), mit US-ASCII aber: 3f 61 6d 6f 6e 6e
(?amonn
), da sich der Codierungswert von É
unterscheidet.
Potenzial von Java 8-Laufzeitfunktionen ausschöpfen
Im Folgenden finden Sie eine unvollständige Liste der Vorteile, die sich durch eine Migration zur Java 8-Laufzeit für Sie ergeben:
- Jetty 9 unterstützt sowohl Servlet 2.5- als auch 3.1-Webanwendungen, einschließlich Servlet-Annotationen.
- Alle Java-Standardklassen sind jetzt verfügbar und es gibt keine Klassen-Zulassungsliste.
- Das Dateisystem
/tmp
ist beschreibbar. Es belegt die RAM-Zuordnung der Anwendung. - Netzwerk-E/A-Vorgänge können jetzt in jedem Java-Thread ausgeführt werden. App Engine API-Aufrufe müssen immer noch über einen Anfragethread oder einen von der Thread Manager API erstellten Thread erfolgen.
- Die Java 8-Sprache wird jetzt vollständig unterstützt, einschließlich Stream API, Lambdas und Date/Time API.