Tomcat 9部署Vaadin 19生产模式war包时出现StackOverflowError异常
问题根因
报错是Tomcat注解扫描过程中,触发了BouncyCastle加密库的类循环继承链检测,加上Vaadin打包引入的依赖数量多,栈深度超过默认JVM线程栈阈值,因此出现偶发的StackOverflowError,同时全量依赖扫描也会导致部署速度变慢。
解决方案
1. 优化Tomcat注解扫描规则(优先推荐,可同时解决部署慢和报错问题)
在项目的WEB-INF/web.xml中新增如下配置,跳过无需扫描的第三方依赖包:
<context-param> <param-name>tomcat.util.scan.StandardJarScanFilter.jarsToSkip</param-name> <param-value>bcprov*.jar,bcpkix*.jar,vaadin-*.jar,webjars-*.jar</param-value> </context-param>
如果需要全局生效,可直接修改Tomcat安装目录下conf/catalina.properties文件中的tomcat.util.scan.StandardJarScanFilter.jarsToSkip参数,追加上述jar包匹配规则即可。
2. 调大JVM线程栈容量
编辑Tomcat的bin/setenv.sh(Linux环境)文件,增加JVM参数提升线程栈大小:
export CATALINA_OPTS="$CATALINA_OPTS -Xss2m"
默认JVM线程栈大小通常为1M,调整为2M即可覆盖扫描场景的栈深度需求,不会额外占用过多系统内存。
3. 排查BouncyCastle依赖冲突
在项目根目录执行Gradle命令排查依赖:
./gradlew dependencies | grep bouncycastle
排除重复引入的不同版本BouncyCastle库,保证整个项目仅保留一套统一版本的加密库,避免多版本类加载导致的循环继承判断异常。
4. 优化Vaadin生产打包配置
检查Vaadin Gradle插件配置,开启生产构建的依赖裁剪规则,排除开发环境依赖、前端构建缓存等非运行必要内容,减小最终war包体积,降低Tomcat扫描压力。
内容的提问来源于stack exchange,提问作者Ximo Dante
相关产品推荐
相关产品推荐

