Von der Java 7-Laufzeit zur Java 8-Laufzeit migrieren

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:

  1. Fügen Sie <runtime>java8</runtime> zu Ihrer Datei appengine-web.xml hinzu:

    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java8</runtime>
      <threadsafe>true</threadsafe>
    </appengine-web-app>
  2. 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.