升级到 Tomcat 10 的锦囊妙计

文摘   2024-06-04 12:06   浙江  

Tomcat 10 在4年前就开始发布了,但是很多 Web 应用还是部署在Tomcat 9上,升级到 Tomcat 10 很难吗?本文将提供一些『锦囊妙计』,将迁移过程变得清晰。 




锦囊妙计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 



微策略 商业智能
微策略 MicroStrategy (Nasdaq: MSTR) 是企业级分析和移动应用软件行业的佼佼者。关注我们了解行业资讯、技术干货和程序员日常。
 最新文章