锦囊妙计1: 知己知彼,百战不殆
Q
为什么从 Tomcat 9 升级到 Tomcat 10如此困难?
升级到 Tomcat 10的最大挑战是 Java EE 到 Jakarta EE 的迁移。所有 Java EE 的`javax.*`包都变成了 Jakarta EE 的`jakarta.*`包,需要全面检查和更新代码、依赖项和配置文件。迁移过程,不止是简单的文本替换,还需要确保所有功能在新依赖下的兼容性。
建议升级到的 Tomcat 版本是10.1.x,因为10.0.x版本线已经停止更新,不再发布新版本。
锦囊妙计2: 未雨绸缪,有备无患
Q
在迁移之前,应该做哪些准备工作?
1. 数据备份:对现有的应用程序和数据进行全面备份。
2. 检查依赖项:列出使用的依赖项,并确认是否有对应的 Jakarta EE 版本。
3. 代码审查:使用 IDE(如IntelliJ IDEA、Eclipse)的搜索功能或脚本工具,查找和分析 javax 的使用情况。
4. 测试环境:搭建测试环境,用于迁移、验证和测试。
锦囊妙计3: 工欲善其事,必先利其器
Q
有哪些工具可以帮助我完成迁移?
常用的工具有这些:
1. IDE 搜索替换:大部分 IDE 都有强大的搜索和替换功能。
2. 迁移工具:一些迁移工具或插件可以顺利将 javax 包替换为 jakarta 包,比如 Intellij IDEA 的Java EE to Jakarta EE和Eclipse Transformer 等。
3. 依赖分析:使用 Gradle 的 dependencies 或其他类似工具,分析项目依赖。
锦囊妙计4: 步步为营,循序渐进
Q
迁移过程有哪些关键步骤?
迁移过程可以分为以下几个关键步骤:
1. 更新依赖项:将使用的 Java EE 依赖项更新为 Jakarta EE 版本。
2. 代码修改:将代码中的所有 javax 包替换为 jakarta 包,需要检查并修改所有引用、导入和使用的API。
3. 配置文件更新:调整 pom.xml、server.xml 等配置文件中的相关配置。
4. 测试和调试:尝试使用 Tomcat 10 部署,进行全面测试,排查并解决出现的问题。
Tips
1
哪些依赖项需要更新呢?
常见的依赖项有这些:
Tips
2
怎么完成 javax 到 jakarta 的替换呢?
可以看下这个例子,比如:将 javax 导入更新到 jakarta,
修改前:`import javax.servlet.http.HttpServletRequest;`
更新后:`import jakarta.servlet.http.HttpServletRequest;`
这看起来似乎很简单,是不是直接搜索然后全局替换就可以了?
小心掉进陷阱里:并不是所有的 javax 都要换成 jakarta。
建议使用 IntelliJ IDEA 的 Java EE to Jakarta EE 的迁移工具,打开 Refactor,找到 Migrate Packages and Classes,点击 Java EE to Jakarta EE,之后选择迁移范围并确认即可。
整个流程做完后,你会发现代码里面还有些地方在使用 `javax.*`。不必太过担心,这些可能属于 Java SE,它们是不被 Jakarta EE 命名空间的变化所影响的,比如这些:
锦囊妙计5: 检查HTTPS和HTTP/2配置
Q
升级到 Tomcat 10之后,原来配置的 HTTPS 链接不能访问了?
可能是因为有些标记成已弃用的 HTTPS 配置属性在 Tomcat 9时可用,但是在 Tomcat 10.1.x 中被删除了。我们需要使用 Tomcat 10.1.x 中的相应属性进行调整。
1. 找到 Tomcat 10安装目录,打开服务器配置文件 - [$TOMCAT_HOME]\conf\server.xml
2. 找到任何带有 scheme="https" 的 Connector 配置,使用 Tomcat 10.1.x 中支持的属性替换掉那些被删除的属性。
3. 最后保存改动,重启 Tomcat 即可。
Tips
要怎么调整配置呢?
下面表格中列出了两个 Tomcat 版本之间的部分属性映射:
以下是一个修改的示例:
Tomcat 9
```
<Connector
SSLEnabled="true"
clientAuth="false"
port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
sslProtocol="TLSv1.2"
scheme="https"
secure="true"
keystorePass="$PWD$"
keystoreFile="$KEYSTORE_PATH$"
compression="on"
compressionMinSize="1024">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" compression="on" compressionMinSize="1024"/>
</Connector>
```
Tomcat 10
```
<Connector
SSLEnabled="true"
port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
scheme="https"
secure="true"
compression="on"
compressionMinSize="1024">
<SSLHostConfig certificateVerification="none" sslProtocol="TLSv1.2">
<Certificate certificateKeystorePassword="$PWD$" certificateKeystoreFile="$KEYSTORE_PATH$"/>
</SSLHostConfig>
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"/>
</Connector>
```
为什么 compression 和 compressionMinSize 属性在 UpgradeProtocol 节点删除了?
这是因为它们可以从 Connector 继承下来。
其他可从 Connector 继承下来的属性,请访问 Tomcat 官方文档了解:
https://tomcat.apache.org/tomcat-10.1-doc/config/http2.html
锦囊妙计6: 保驾护航,测试为王
Q
迁移完成后,怎么保证应用程序运行正常?
当然是全面的测试:
1. 部署测试:模拟生产环境进行部署,检查部署后的配置和运行状态。
2. 功能测试:运行所有测试用例,确保各项功能正常工作。
3. 性能测试:确保迁移后应用程序的性能没有显著下降。
4. 回归测试:确保没有引入新的错误或破坏现有功能。
虽然从 Tomcat 9 到 Tomcat 10的迁移充满挑战,但通过合理的准备、适用的工具、逐步展开和全面测试,我们都可以成功完成这一任务。希望这些锦囊妙计能为你的迁移之旅提供帮助和启示。
参考链接:
https://waynebeaton.wordpress.com/2019/04/04/renaming-java-ee-specifications-for-jakarta-ee/
https://tomcat.apache.org/migration-10.html
https://www.jetbrains.com/guide/java/tutorials/migrating-javax-jakarta/use-migration-tool/
https://tomcat.apache.org/tomcat-9.0-doc/config/http.html#SSL_Support_-_Connector_-_NIO_and_NIO2_(deprecated)
https://tomcat.apache.org/tomcat-10.1-doc/ssl-howto.html#Edit_the_Tomcat_Configuration_File
https://tomcat.apache.org/tomcat-10.1-doc/config/http2.html