由于项目安全升级,需要升级到最新的 tomca10.1.0-M17 ,之前的服务放到新的 tomcat 启动失败,
严重 [main] org.apache.catalina.core.StandardContext.listenerStart 配置应用程序监听器[org.springframework.web.util.WebAppRootListen
er]错误
java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
于是我把 javax 的包也放到 tomcat 的 lib 下,然后看了下 tomcat 这个版本需要使用到 Jakarta 6.0 的版本。我也在对应的 build.gradle 将所有的 javax 的依赖换成了最新的 Jakarta 版本。 然后启动又报错
java.lang.ClassCastException: class org.springframework.web.filter.CharacterEncodingFilter cannot be cast to class jakarta.servlet.Filter
我发现 spring 的 WEN-INF 下的 web.xml 配置了 org.springframework.web.filter.CharacterEncodingFilter,这个 CharacterEncodingFilter 类是 spring 的,它依赖的是 javax 的包。
这个问题我看了两天 也不知道怎么解决。我怀疑是 tomcat 启动使用的 Jakarta ,但是 spring 项目 CharacterEncodingFilter 使用的 javax 冲突了。但是不知道怎么处理 麻烦各位老哥了。
1
cweijan 2022-08-10 12:17:57 +08:00
要么降级 tomcat 要么升级 spring 版本, 但是升级 spring 版本估计也有兼容问题, 最好还是降级 tomcat 吧
|
2
zed1018 2022-08-10 12:30:40 +08:00 1
spring boot 3 还没有 GA ,你别直接 tomcat 10 ,升级 9 的安全更新版本就好了。一般补丁都会 backport 的。
|
3
lzrainchen 2022-08-10 12:55:40 +08:00
理论上来讲,Java EE 8 (2017 年 8 月 31 日)已经结束了,之后就没有 Java EE 了。原文是这么说的 Oracle waves good-bye to Java Enterprise Edition, as the Eclipse Foundation takes over Java EE under a new name, Jakarta, and without the "Java" trademark 。所以以后基于 Java EE 的规范,比如 Servlet 等都需要做不兼容的升级
你可以使用工具来将原来的 javax 包名的项目转换到新的项目下: GitHub 在这里: https://github.com/apache/tomcat-jakartaee-migration 或者这里: https://tomcat.apache.org/download-migration.cgi |
4
fmvp520 OP 好的 谢谢各位老哥的帮助 ,我这边还是再尝试一下 升级 tomcat10.
我先按照 @lzrainchen 老哥说的试试。 |
5
fmvp520 OP |
6
iPisces77 2022-08-11 09:13:30 +08:00
建议先用 9 版本的,命名空间不兼容,spring 目前 GA 的都还是 JavaEE 的命名空间
|
7
fmvp520 OP @iPisces77 谢谢。目前我这边升级 tomcat10 成功了。主要就是安照 3 楼大哥的解答,也是 tomcat 官网的解决方案。先将之前的项目 war 包使用工具转换后就可以部署到 tomcat10 了,但是启动的时候又遇到其他的一些问题,
java.lang.NoClassDefFoundError: sun/reflect/Reflection 在网上找了一圈,尝试了一下 没有成功解决这个问题。于是我就替换了相关的工具包,因为项目使用了 hutool 工具包,里面有使用 sun.reflect.Reflection 我就换了对于使用相关的方法做改用其他工具包做了替换。基本一些问题都是用了替换方法完成了升级~ 就是这样比较麻烦 每次都需要使用工具转换 war 包,才能部署 -。- |