「编程」Tomcat9升级Tomcat10遇到的坑
由于公司需要,在解决开源漏洞的时候需要将Tomcat从9升级到10版本,只是改了pom文件中的版本后发现,程序无法正常运行,提示某些函数不存在。
pom文件修改
<!--tomcat版本修改-->
<properties>
<tomcat.version>10.0.23</tomcat.version>
</properties>
<!--修改依赖版本-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>${tomcat.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</exclusion>
</exclusions>
</dependency>
出现的错误
java: 无法访问javax.servlet.ServletException,找不到javax.servlet.ServletException的类文件
具体原因是代码中用了MissingServletRequestParameterException类,但是找不到了,通过查找源头,发现spring-web的5.3.13版本NestedServletException文件中无法找到javax.servlet.ServletException。难道是升级带来的问题?!
查看Tomcat官网介绍10版本的更新内容:
servlet的包名有变化
Tomcat 10 已将servlet的包名从javax.servlet更改为jakarta.servlet,所以代码中凡是引入了servlet包的地方都需要修改。如果不修改,有很大的概率会遇到一些莫名其妙的报错。
Java代码中可以通过批量的查找替换进行修改。将javax.servlet替换为jakarta.servlet。
但是Spring Framework的源码我们也改不了啊,难道5.3.13版本没有支持jakarta.servlet?
查看Spring Framework官网内容:
如果项目中使用Spring Framework,实际引用Tomcat的是Spring Framework。所以要去官网或者源码好好看看,Spring Framework那个版本才是真正使用Tomcat10的。
原来从6.0版本开始才支持。
另外,如果升级Spring Framework,还需要升级其他依赖。
所以,升级一定要仔细,先看好新版本内容,升级之后要详细测试。
建议,先不要将Tomcat升级到10版本。