升级现有应用

您必须将应用升级到受支持的最新运行时版本,才能继续接收安全更新并有资格获得技术支持。您还应该考虑迁移到 Cloud Run,这是 Google Cloud 无服务器技术的最新发展成果。Cloud Run 整合了标准环境和柔性环境中的许多最佳功能,在 App Engine 体验的基础上加以改进。如需比较功能并了解迁移方式,请参阅 App Engine 和 Cloud Run 比较指南

升级现有应用的过程取决于应用当前使用的运行时版本:

  • Java 8:您必须将应用迁移到受支持的最新 Java 版本。Java 8 已于 2024 年 1 月 31 日达到支持终止期限。现有的 Java 8 应用将继续运行并接收流量。但是,您无法部署新应用或更新使用支持终止日期之后的运行时的现有应用。

  • Java 11 或 Java 17

    这些运行时是受支持的 Java 版本。如需继续升级到最新的支持版本,请执行以下操作:

    • 通过指定您希望应用运行的 Java 版本来更新 app.yaml 文件。例如:

        runtime: javaVERSION
      

      其中,VERSIONMAJOR 版本号。

      示例:对于 Java 21,请指定 21(例如 runtime: java21)。如需了解详情,请参阅 Java 运行时概览

    • 如果您使用的是旧版捆绑服务,则必须升级应用以在以下任一环境中运行:

      • Java Enterprise Edition 10(EE10 - 默认,推荐使用):Java EE10 不支持 javax.servlet.* API,需要您更新应用和第三方依赖项以使用较新的 Java 工件,例如 Jakarta 命名空间。

      • Java Enterprise Edition 8 (EE8):Java EE8 允许您使用 javax.servlet.* API,但您必须对 appengine-web.xml 文件进行细微的配置更改。

      如需了解所有选项,请参阅升级到适用于旧版捆绑服务的 Java 21

升级到适用于旧版捆绑服务的 Java 21

Java 运行时兼容性

请参阅下表,了解哪些 Java 版本与您的 Jetty 和 servlet 版本兼容:

企业版 (EE) Jetty 版本 Java 版本 Servlet 兼容性
EE7 9.4 11 2.5 或 3.1
EE7 9.4 17 2.5 或 3.1
EE8 12 21 2.5 及更高版本 Java EE8 向后兼容 Java EE6 及更高版本。如需了解详情,请参阅在 EE8 上升级到 Java 21
EE10 12 21 6.0(推荐)。Java 21 默认配置为运行 EE10。 如需使用 Java EE10,您必须更新应用 servlet 和依赖项以包含 Jakarta 命名空间。如需了解详情,请参阅在 EE10 上升级到 Java 21

在 EE10 上升级到 Java 21

如需在 Enterprise Edition 10 (EE10) 上使用 Java 21,您必须升级 Maven 和 Gradle 文件中的应用 servlet 和依赖项以包含 Jakarta 命名空间:

  1. web.xml 配置文件中的版本号更改为 version=6.0。例如:

        <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
          version="6.0">
          ...
        </web-app>
    
  2. 将应用 servlet 和依赖项从 javax.servlet.* 重命名为 jakarta.servlet.*

         import jakarta.servlet.ServletException;
         import jakarta.servlet.annotation.WebServlet;
         import jakarta.servlet.http.Cookie;
         import jakarta.servlet.http.HttpServlet;
         import jakarta.servlet.http.HttpServletRequest;
         import jakarta.servlet.http.HttpServletResponse;
    
         @WebServlet(name = "viewer", urlPatterns = {"/view"})
         public class MyServlet extends HttpServlet {
        ......
    
  3. 将其余的应用第三方依赖项更新为较新的 Java 工件,具体取决于 Jakarta 命名空间。

  4. 可选:Java 21 支持虚拟线程。如需启用虚拟线程,请在 appengine-web.xml 文件的 system-properties 标记中添加 appengine.use.virtualthreads 属性。

在 EE8 上升级到 Java 21

您可以继续在 Java EE8 上使用 javax.servlet.* API,而无需对应用配置进行重大更改,因为 Jetty 12 会为 Java EE6 及更高版本提供向后兼容性。如需在 Java EE8 上运行应用,您必须在 appengine-web.xml 文件中声明新的 system-properties 标记并使用非默认 app.engine.use.EE8 配置:

   <?xml version="1.0" encoding="utf-8"?>
   <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java21</runtime>
      <system-properties>
        <property name="appengine.use.EE8" value="true"/>
      </system-properties>
      <app-engine-apis>true</app-engine-apis>
   </appengine-web-app>

可选:Java 21 支持虚拟线程。如需启用虚拟线程,请在 system-properties 标记中添加 appengine.use.virtualthreads 属性。示例: <property name="appengine.use.virtualthreads" value="true"/>