內容

目錄

一般

請先閱讀一般 遷移指南頁面,以了解 Apache Tomcat® 版本之間遷移或升級時適用的常見考量。

從 8.0.x 或 8.5.x 遷移至 9.0.x

本節列出 8.0.x / 8.5.x 與 9.0.x 之間所有已知變更,這些變更可能會在升級時造成向後相容性問題。其中一些變更和新功能已存在於 Apache Tomcat 8.5.x 中。

需要 Java 8

Apache Tomcat 9.0.x 需要 Java 8 或更新版本。Apache Tomcat 8.0.x 和 8.5.x 需要 Java 7。

規格 API

Apache Tomcat 9 支援 Java Servlet 4.0、JavaServer Pages 2.3、Java Unified Expression Language 3.0 和 Java API for WebSocket 1.0 規範。各規範文件中的附錄「變更」會說明各規範版本之間的變更。

Servlet 4.0 API

在使用萬用字元匯入語法的 JSP 頁面中,Servlet API 中新增的類別可能會與 Web 應用程式中的類別衝突。例如,如果套件 "a" 包含類別 PushBuilder,下列 JSP 頁面將無法在 Tomcat 9 中編譯

<%@page import="a.*"%>
<% PushBuilder pushBuilder = new PushBuilder(); %>

這是因為隱含匯入 javax.servlet.http.* 和明確匯入 a.* 會提供類別 PushBuilder 的衝突定義,而這個類別是在 Servlet 4.0 中新增的。解決方案是使用明確匯入,import="a.PushBuilder"

JavaServer Pages 2.3

這與 Tomcat 8.x 相同。

表達式語言 3.0

這與 Tomcat 8.x 相同。

WebSocket 1.1

這與 Tomcat 8.x 相同。

已移除 BIO 連接器

下列變更出現在 8.5.0 以後的版本中。

HTTP 和 AJP 的 Java 阻斷式 I/O 實作 (BIO) 已移除。建議使用者改用 Java 非阻斷式 I/O 實作 (NIO)。

已移除 Comet 支援

下列變更出現在 8.5.0 以後的版本中。

Comet 支援已移除,且沒有直接的替代方案。建議使用 Comet 的應用程式移轉到 WebSockets。

已新增 HTTP/2 支援

下列功能自 8.5.0 以後版本提供。

HTTP/2 支援 h2 (透過 TLS,經由 ALPN 協商) 和 h2c (純文字,經由 HTTP/1.1 升級協商)。HTTP/2 需要為連接器明確啟用。若要啟用,請插入

<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
在您想要為其啟用 HTTP/2 的連接器內。請注意,若要為安全的 NIO 或 NIO2 連接器啟用 HTTP/2,這些連接器必須使用 OpenSSL 引擎作為 TLS。

已新增 TLS 虛擬主機和多個憑證支援

下列功能自 8.5.0 以後版本提供。

Tomcat 9 支援單一連接器的多個 TLS 虛擬主機,每個虛擬主機都能支援多個憑證。虛擬主機定義會嵌套在 Connector 元素內,如果指定多個虛擬主機,則會使用 Connector 上的 defaultSSLHostConfigName 屬性指定預設值。憑證定義會嵌套在虛擬主機內。

下列範例說明如何使用此功能,為多個 TLS 虛擬主機設定單一 APR/原生連接器,每個主機都同時具有 RSA 和 EC 憑證。


<Connector port="8443"
           protocol="org.apache.coyote.http11.Http11AprProtocol"
           maxThreads="150"
           SSLEnabled="true"
           defaultSSLHostConfigName="openoffice.apache.org" >
    <SSLHostConfig hostName="openoffice.apache.org" >
        <Certificate certificateKeyFile="conf/openoffice.apache.org-rsa-key.pem"
                     certificateFile="conf/openoffice.apache.org-rsa-cert.pem"
                     type="RSA" />
        <Certificate certificateKeyFile="conf/openoffice.apache.org-ec-key.pem"
                     certificateFile="conf/openoffice.apache.org-ec-cert.pem"
                     type="EC" />
    </SSLHostConfig>
    <SSLHostConfig hostName="www.openoffice.org" >
        <Certificate certificateKeyFile="conf/www.openoffice.org-rsa-key.pem"
                     certificateFile="conf/www.openoffice.org-rsa-cert.pem"
                     type="RSA" />
        <Certificate certificateKeyFile="conf/www.openoffice.org-ec-key.pem"
                     certificateFile="conf/www.openoffice.org-ec-cert.pem"
                     type="EC" />
    </SSLHostConfig>
</Connector>

內部 API

雖然 Tomcat 9 內部 API 與 Tomcat 8 廣泛相容,但已在詳細層級進行許多變更,而且它們並非二進位相容。與 Tomcat 內部元件互動的客製化元件開發人員應檢閱相關 API 的 JavaDoc。

特別要注意的是

  • 已在所有連接器中進行重大重構,以減少重複程式碼並讓行為與所有實作保持一致。(此變更存在於 8.5.x 中。
  • 已從 Realm 中移除已棄用的 digest 屬性。(此變更存在於 8.5.x 中。

已移除 JSR-77 實作

下列變更出現在 8.5.0 以後的版本中。

JSR-77 實作不完整,已在 8.5.x 和 9.0.x 中移除。特別是,已移除下列顯示於 JMX 的方法。

  • StandardContext.getServlets()
  • StandardContext.isStateManageable()
  • StandardContext.getDeploymentDescriptor()
  • StandardWrapper.isStateManageable()

叢集

下列變更出現在 8.5.0 以後的版本中。

MessageDispatch15Interceptor 已用於將 Java 5 功能新增至 MessageDispatchInterceptor。MessageDispatch15Interceptor 已在 Tomcat 8.5.x 和 9.0.x 中移除,方法是將 Java 5 功能併入 MessageDispatchInterceptor

已移除 InstanceListener

下列變更出現在 8.5.0 以後的版本中。

已在 8.5.x 和 9.0.x 中移除 InstanceListener 支援。特別是,已移除下列類別。

  • org.apache.catalina.InstanceListener
  • org.apache.catalina.InstanceEvent
  • org.apache.catalina.util.InstanceSupport

SessionManager

下列變更出現在 8.5.0 以後的版本中。

下列會話管理員屬性已在 8.5.x 和 9.0.x 中完全移除。

  • distributable
  • maxInactiveInterval
  • sessionIdLength

取代方式如下

  • distributable 屬性已在 8.0 中棄用,且指定的數值會被忽略。這應透過 Context 設定。此數值會根據 /WEB-INF/web.xml.<distributable /> 元素是否存在而繼承。
  • maxInactiveInterval 屬性已在 8.0 中棄用。如果指定數值,會發出警告記錄。這應透過 Context 設定。此數值會根據 /WEB-INF/web.xml<session-timeout> 元素的數值而繼承。
  • ManagersessionIdLength 屬性已由 SessionIdGeneratorsessionIdLength 屬性取代。

Cookie

預設的 CookieProcessor 現在是 Rfc6265CookieProcessorCookieProcessor 可針對每個 Context 設定,且 LegacyCookieProcessor 可用於取得 8.0.x 行為。

Web 應用程式

Manager 和 HostManager 網路應用程式預設會設定 RemoteAddrValve,以將這些應用程式的存取限制為來自本機端連線。

引擎和主機組態

當有效值為 1 時,startStopThreads 的行為已變更。在這種情況下,會在目前執行緒上啟動子執行緒,而非透過配置單一執行緒的 ExecutorService 啟動。

內容組態

clearReferencesStatic 屬性已在 8.5.x 和 9.0.x 中移除。

記錄

預設情況下,日誌檔會保留 90 天,然後從檔案系統中移除。

升級 9.0.x

在將 Apache Tomcat 實例從 Tomcat 9 的一個版本升級到另一個版本時,特別是在 $CATALINA_HOME 和 $CATALINA_BASE 使用不同位置時,必須確保將組態檔中的任何變更(例如新的屬性和預設值的變更)套用為升級的一部分。為了協助辨識這些變更,可以使用下方的表單來檢視 Tomcat 9 不同版本中組態檔的差異。

Tomcat 9.0.x 重要變更

Tomcat 開發人員的目標是讓每個修補程式版本都與前一個版本完全向下相容。偶爾,為了修正錯誤,必須中斷向下相容性。在大部分情況下,這些變更不會被注意到。本節列出未完全向下相容且可能在升級時造成中斷的變更。

  • 在 9.0.74 之後,Connector 屬性 maxParameterCount 的預設值已從 10,000 減少到 1,000。
  • 在 9.0.31 之後,AJP Connector 的預設監聽位址已變更為迴圈位址,而非所有位址。

    參考:AJP Connector

  • 在 9.0.31 之後,AJP Connector 的requiredSecret 屬性已棄用,並由secret 屬性取代。

    參考:AJP Connector

  • 在 9.0.31 之後,secretRequired 屬性已新增至 AJP Connector。如果設定為預設值 true,AJP Connector 只有在指定secret 時才會啟動。

    參考:AJP Connector

  • 在 9.0.31 之後,allowedRequestAttributesPattern 屬性已新增至 AJP Connector。具有無法辨識屬性的要求現在會以 403 遭到封鎖。

    參考:AJP Connector

  • 在 9.0.44 之後,HostConfig.check(String) 方法的語意已變更。該方法會在呼叫方法之前將應用程式標記為已服務,而非在呼叫方法之前將應用程式標記為已服務,該方法會在檢查資源之前將應用程式標記為已服務,然後在檢查完成後將應用程式標記為未服務。如果在呼叫方法時將應用程式標記為已服務,該方法將為 NO-OP。

  • 在 9.0.48 之後,NIO 輪詢器已簡化,並且已移除區塊輪詢器和選擇器組態。如果這些組態存在於組態中,這不會造成啟動錯誤,但可能會產生警告,而且不會有任何效果。

  • 在 9.0.51 之後,由於機密傳輸保證,Tomcat 在新增「Cache-Control: private」時不再新增「Expires」HTTP 回應標頭。對於未明確設定自己的標頭但依賴 Tomcat 之前行為的應用程式,這可能會導致快取行為改變。如果您想要停用快取,您需要在應用程式中明確地組態它。請參閱 BZ 65513 以取得更多資訊。

  • 在 9.0.53 之後,由於 Commons FileUpload 的更新分支現在使用 java.nio.file.Files,使用多部分上傳的應用程式需要確保 JVM 已組態為具有足夠的直接記憶體來儲存所有進行中的多部分上傳。

  • 在 9.0.56 之後,系統屬性 org.apache.juli.AsyncLoggerPollInterval 已不再使用。

Tomcat 9.0.x 組態檔案差異

從下方的方塊中選擇組態檔、舊版本和新版本,然後按一下「檢視差異」以查看差異。差異將顯示在新分頁/視窗中。

註解:如果沒有差異,您將會看到錯誤頁面。

您也可以在工作副本中使用類似以下的 Git 指令

git diff 9.0.0 9.0.12 -- conf/