從 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) 遷移至 Cloud 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。