這個頁面說明如何將現有 App Engine 應用程式從 Java 7 執行階段遷移至 Java 8 執行階段。請注意,App Engine Java 執行階段以 OpenJDK 為基礎。
為應用程式指定 Java 8 執行階段
在 Java 8 執行階段中執行應用程式:
將
<runtime>java8</runtime>
新增至appengine-web.xml
檔案:重新部署您的應用程式。
從不支援的服務遷移
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。