從 Java 7 遷移至 Java 8 執行階段

這個頁面說明如何將現有 App Engine 應用程式從 Java 7 執行階段遷移至 Java 8 執行階段。請注意,App Engine Java 執行階段以 OpenJDK 為基礎。

為應用程式指定 Java 8 執行階段

在 Java 8 執行階段中執行應用程式:

  1. <runtime>java8</runtime> 新增至 appengine-web.xml 檔案:

    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java8</runtime>
      <threadsafe>true</threadsafe>
    </appengine-web-app>
  2. 重新部署您的應用程式。

從不支援的服務遷移

Java 8 執行階段不支援可在 Java 7 執行階段中使用的某些淘汰的服務。Google 建議您將應用程式遷移至建議的替代方案,並在進行這些變更的情況下在 Java 7 執行階段中對應用程式進行測試,然後再遷移至 Java 8。

以下淘汰的服務無法在 Java 8 執行階段中使用:

淘汰的服務 建議的替代方案
Cloud Endpoints v1 遷移至 v2,產品已重新命名為 Cloud Endpoints Frameworks。請注意,這可能需要您變更 Web、Android 或 iOS 應用程式。
AppStats (appengine-api-labs jar) 遷移至 Stackdriver Trace。SDK 會針對在 Java 8 執行階段中使用 com.google.appengine.tools.AppstatsFilter 類別的應用程式產生錯誤。請務必從您的 web.xml 中刪除對於 AppstatsFilter 的所有參考。

重新封裝的類別在 Java 8 上將需要新匯入路徑。例如,如果您的應用程式使用 com.google.appengine.repackaged.com.google.common.base.Optional,您將需要匯入 com.google.appengine.repackaged.com.google.common.base.$Optional,並在類別名稱前面加上 $

遷移使用 java.net.HttpURLConnection 的免費應用程式

如果您的應用程式沒有啟用計費功能,而提出使用 java.net.HttpURLConnection 類別的 HTTP(S) 要求或使用該類別的 Google 用戶端程式庫,則會導致發生執行階段錯誤。 為了避免發生這種錯誤,請在應用程式的 appengine-web.xml 中將 <url-stream-handler> 設定為 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>

您也可以啟用應用程式的計費功能,並使用預設 native 設定,而不用指定 urlfetch。這樣您的應用程式就不會因為執行 Java 7 而增加任何費用。請注意,如果您的應用程式依賴 X-Appengine-Inbound-Appid HTTP 標頭 (用於模組之間的通訊),則必須使用 urlfetch

變更預設檔案編碼

App Engine 已將預設檔案編碼方式從 Java 7 的 US-ASCII 變更為 Java 8 的 UTF-8。如要將預設編碼方式改回在 Java 8 中使用 US-ASCII,請將以下程式碼新增至您的 appengine-web.xml

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

如果某些字元不在 ASCII 集中,且您的應用程式進行了某些假設 (例如 someString.getBytes().length == someString.length()),則可能會發生錯誤。US-ASCII 編碼即屬於這種情形,因為非 ASCII 字元會對應至「?」,但對於 UTF-8 編碼而言就不一定是這樣。

例如,如果您透過呼叫 Éamonn.getBytes() 來輸出十六進位位元組,對於 UTF-8 而言就會是:c3 89 61 6d 6f 6e 6e (Éamonn),而對於 US-ASCII 而言就會得到:3f 61 6d 6f 6e 6e (?amonn),這是因為 É 的編碼值不同。

完全利用 Java 8 執行階段功能

以下是遷移至 Java 8 執行階段的部分優點清單:

  • Jetty 9 支援 Servlet 2.5 與 3.1 網路應用程式,包括 Servlet 註解在內。
  • 現在可以使用所有標準 Java 類別,沒有類別許可清單。
  • 可以寫入 /tmp 檔案系統 - 這會佔用應用程式的 RAM 分配。
  • 網路 I/O 現在可在任何 Java 執行緒上執行。現在仍然需要對要求執行緒或 Thread Manager API 建立的執行緒進行 App Engine API 呼叫。
  • 現在支援完整的 Java 8 語言,包括 Stream API、Lambda 與 Date/Time API。
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Java 適用的 App Engine 標準環境