内容
目录
通用
请首先阅读通用的迁移指南页面,了解适用于 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.*
的显式导入将提供对 Servlet 4.0 中添加的类 PushBuilder
的冲突定义。解决方案是使用显式导入,即 import="a.PushBuilder"
。
JavaServer Pages 2.3
这与 Tomcat 8.x 保持不变。
Expression Language 3.0
这与 Tomcat 8.x 保持不变。
WebSocket 1.1
这与 Tomcat 8.x 保持不变。
BIO 连接器已移除
以下变更从 8.5.0 版本开始存在。
HTTP 和 AJP 的 Java 阻塞式 IO 实现 (BIO) 已被移除。建议用户切换到 Java 非阻塞式 IO 实现 (NIO)。
HTTP 连接器变更
HTTP 原因短语已完全移除。已知一些不符合 RFC 标准的客户端在缺少原因短语时会失败。此类失败是客户端的问题,而非 Tomcat 的问题。
Comet 支持已移除
以下变更从 8.5.0 版本开始存在。
Comet 支持已被移除,没有直接替代方案。建议使用 Comet 的应用程序迁移到 WebSockets。
已添加 HTTP/2 支持
以下功能从 8.5.0 版本开始可用。
HTTP/2 支持 h2(通过 ALPN 协商的 TLS)和 h2c(通过 HTTP/1.1 升级协商的明文)。需要为连接器显式启用 HTTP/2。要启用它,请在连接器中插入
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
已添加 TLS 虚拟主机和多证书支持
以下功能从 8.5.0 版本开始可用。
Tomcat 9 支持单个连接器的多个 TLS 虚拟主机,每个虚拟主机都能够支持多个证书。虚拟主机定义嵌套在 Connector 元素内,如果指定了多个虚拟主机,则使用 Connector 上的 defaultSSLHostConfigName 属性指定默认值。证书定义嵌套在虚拟主机内。
以下示例展示了如何使用此功能为单个 APR/native 连接器配置多个 TLS 虚拟主机,每个主机都具有 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
曾用于向 MessageDispatchInterceptor 添加 Java 5 特性。通过将 Java 5 特性合并到 MessageDispatchInterceptor
,MessageDispatch15Interceptor
已在 Tomcat 8.5.x 和 9.0.x 中移除。
InstanceListener 已移除
以下变更从 8.5.0 版本开始存在。
对 InstanceListener 的支持已在 8.5.x 和 9.0.x 中移除。具体来说,以下类已被移除。
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>
元素的值继承的。Manager
的sessionIdLength
属性已被SessionIdGenerator
的sessionIdLength
属性替换。
Cookie
默认的 CookieProcessor
现在是 Rfc6265CookieProcessor
。CookieProcessor
可以按 Context
进行配置,并且可以使用 LegacyCookieProcessor
来获得 8.0.x 的行为。
Web 应用程序
Manager 和 HostManager web 应用程序默认配置了 RemoteAddrValve
,它将对这些应用程序的访问限制为来自 localhost 的连接。
Engine 和 Host 配置
当 startStopThreads
的有效值为 1 时,其行为已发生变化。在这种情况下,子组件将在当前线程上启动,而不是通过配置了单线程的 ExecutorService
启动。
Context 配置
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 开发者旨在使每个补丁版本都与之前的版本完全向后兼容。偶尔,为了修复 Bug,有必要破坏向后兼容性。在大多数情况下,这些更改不会被注意到。本节列出了不完全向后兼容并可能在升级时导致故障的更改。
- 在 9.0.96 版本中,对池化 JSP 标签的释放方式进行了更改,导致某些使用 Apache Tomcat 9 早期版本编译的 JSP 文件之间出现二进制不兼容性。此不兼容性将在 9.0.97 中得到纠正,因此在 9.0.96 之前编译的 JSP 应在 9.0.97 及更高版本中再次无需重新编译即可运行。
- 从 9.0.74 版本开始,连接器属性
maxParameterCount
的默认值已从 10,000 减少到 1,000。 从 9.0.31 版本开始,AJP 连接器的默认监听地址已更改为回环地址,而不是所有地址。
参考:AJP 连接器。
从 9.0.31 版本开始,AJP 连接器的 requiredSecret 属性已被弃用,并由 secret 属性替换。
参考:AJP 连接器。
从 9.0.31 版本开始,AJP 连接器添加了 secretRequired 属性。如果将其设置为
true
(默认值),AJP 连接器将不会启动,除非已指定 secret。参考:AJP 连接器。
从 9.0.31 版本开始,AJP 连接器添加了 allowedRequestAttributesPattern 属性。具有无法识别属性的请求现在将被 403 阻止。
参考:AJP 连接器。
从 9.0.44 版本开始,
HostConfig.check(String)
方法的语义已更改。该方法将不再在调用方法前将应用程序标记为已服务,而是在检查资源前将应用程序标记为已服务,并在检查完成后取消标记。如果在调用方法时应用程序已被标记为已服务,则该方法将是一个空操作(NO-OP)。从 9.0.48 版本开始,NIO 轮询器已简化,并移除了阻塞轮询器和选择器配置。如果它们存在于配置中,这不会导致启动错误,但可能会产生警告并且不会产生任何效果。
从 9.0.51 版本开始,由于 CONFIDENTIAL 传输保证,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/