Bermigrasi dari Java 7 ke Runtime Java 8

Halaman ini menjelaskan cara memigrasikan aplikasi App Engine yang ada dari runtime Java 7 ke runtime Java 8. Perhatikan bahwa runtime Java App Engine didasarkan pada OpenJDK.

Menentukan runtime Java 8 untuk aplikasi Anda

Untuk menjalankan aplikasi Anda di runtime Java 8:

  1. Tambahkan <runtime>java8</runtime> ke file appengine-web.xml Anda:

    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java8</runtime>
      <threadsafe>true</threadsafe>
    </appengine-web-app>
  2. Deploy ulang aplikasi Anda.

Bermigrasi dari layanan yang tidak didukung

Beberapa layanan yang tidak digunakan lagi dan tersedia untuk runtime Java 7 tidak didukung oleh runtime Java 8. Google merekomendasikan agar Anda memigrasikan aplikasi ke alternatif yang direkomendasikan dan menguji aplikasi di runtime Java 7 dengan perubahan tersebut sebelum bermigrasi ke Java 8.

Layanan yang tidak digunakan lagi berikut ini tidak tersedia di runtime Java 8:

Layanan yang tidak digunakan lagi Alternatif yang direkomendasikan
Cloud Endpoints v1 Bermigrasi ke v2, produk ini telah diganti namanya menjadi Cloud Endpoints Frameworks. Perhatikan bahwa Anda mungkin perlu mengubah aplikasi Web, Android, atau iOS.
AppStats (jar appengine-api-labs) Bermigrasi ke Cloud Trace. SDK menghasilkan error untuk aplikasi yang menggunakan class com.google.appengine.tools.AppstatsFilter pada runtime Java 8. Pastikan Anda menghapus semua referensi ke AppstatsFilter dari web.xml Anda.

Class yang dikemas ulang akan memerlukan jalur impor baru di Java 8. Misalnya, jika aplikasi Anda menggunakan com.google.appengine.repackaged.com.google.common.base.Optional, Anda harus mengimpor com.google.appengine.repackaged.com.google.common.base.$Optional, dengan $ yang diawali dengan nama class.

Memigrasikan aplikasi gratis yang menggunakan java.net.HttpURLConnection

Jika aplikasi Anda belum mengaktifkan penagihan dan membuat permintaan HTTP(S) menggunakan class java.net.HttpURLConnection atau library klien Google yang menggunakan class tersebut, aplikasi akan menyebabkan error runtime. Untuk menghindari hal ini, tetapkan <url-stream-handler> ke urlfetch di appengine-web.xml aplikasi Anda:

<?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>

Atau, alih-alih menentukan urlfetch, Anda dapat mengaktifkan penagihan untuk aplikasi Anda dan menggunakan setelan native default. Aplikasi Anda tidak boleh menimbulkan kenaikan biaya apa pun karena menjalankan Java 7. Perhatikan bahwa jika aplikasi Anda bergantung pada header HTTP X-Appengine-Inbound-Appid (digunakan untuk komunikasi Modul-ke-Modul), urlfetch harus digunakan.

Mengubah encoding file default

App Engine telah mengubah encoding file default dari US-ASCII di Java 7 menjadi UTF-8 di Java 8. Untuk mengubah encoding default kembali ke US-ASCII di Java 8, tambahkan kode berikut ke appengine-web.xml Anda:

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

Error dapat terjadi jika beberapa karakter tidak ada dalam set ASCII dan aplikasi Anda membuat asumsi tertentu, seperti someString.getBytes().length == someString.length(). Dalam encoding US-ASCII, hal ini berlaku karena karakter non ASCII dipetakan ke "?", tetapi hal ini tidak selalu berlaku dengan encoding UTF-8.

Misalnya, jika Anda mencetak byte heksa dari memanggil Éamonn.getBytes(), dengan UTF-8, formatnya akan menjadi: c3 89 61 6d 6f 6e 6e (Éamonn), sedangkan dengan US-ASCII, Anda akan mendapatkan: 3f 61 6d 6f 6e 6e (?amonn) karena nilai encoding É yang berbeda.

Memanfaatkan sepenuhnya fitur runtime Java 8

Berikut adalah sebagian daftar keuntungan bermigrasi ke runtime Java 8:

  • Jetty 9 mendukung aplikasi web Servlet 2.5 dan 3.1, termasuk anotasi servlet.
  • Semua class Java standar kini tersedia, dan tidak ada daftar class yang diizinkan.
  • Sistem file /tmp dapat ditulisi - ini akan menghabiskan alokasi RAM aplikasi.
  • I/O jaringan sekarang dapat dilakukan di semua thread Java. Panggilan App Engine API masih harus berada di Request Thread atau thread yang dibuat oleh Thread Manager API.
  • Bahasa Java 8 lengkap kini didukung, termasuk Stream API, Lambda, dan Date / Time API.