Vaadin 14应用配置Java 9+后Tomcat生产构建无法正常运行求助
Vaadin 14 适配 Java 9+ 并在 Tomcat 正常运行的配置方案
确认Vaadin版本兼容性
确保使用Vaadin 14的最新维护分支版本(如14.10.x及以上),旧的小版本可能存在Java 9+的兼容瑕疵,官方维护分支已修复相关模块适配问题。修正Maven编译配置
仅设置source和target不足以保证Java 9+的字节码兼容性,必须添加release参数,确保编译产物符合指定Java版本的规范。完整的maven-compiler-plugin配置如下:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>9</source> <target>9</target> <release>9</release> <encoding>UTF-8</encoding> </configuration> </plugin>同时可以保留
<java.version>9</java.version>的properties配置,让其他插件(如Spring Boot插件)自动对齐版本。配置Tomcat的JVM模块访问权限
Java 9+的模块系统默认限制了对JDK内部模块的反射访问,而Vaadin运行依赖部分反射操作,需在Tomcat启动参数中开放相关权限:- Linux环境:编辑
TOMCAT_HOME/bin/catalina.sh,在文件开头添加:JAVA_OPTS="$JAVA_OPTS --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED" - Windows环境:编辑
TOMCAT_HOME/bin/catalina.bat,添加:set JAVA_OPTS=%JAVA_OPTS% --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED
这个配置会允许未命名模块(即你的应用代码)访问JDK内部的核心模块,确保Vaadin的Servlet能正常初始化。
- Linux环境:编辑
验证Servlet映射与Tomcat运行环境
- 确保Vaadin的Servlet(
SpringServlet或VaadinServlet)映射路径为/*,避免请求被静态资源处理器拦截。 - 确认Tomcat运行的JVM版本为OpenJDK 11,可通过
catalina.out中的启动日志查看JVM版本信息,避免部署到Java 8环境。
- 确保Vaadin的Servlet(
清理构建缓存重新打包
执行mvn clean package彻底清理旧的编译产物,确保所有类文件都是基于Java 9编译生成的,避免混合字节码导致的隐性问题。
内容的提问来源于stack exchange,提问作者ZZerog
相关产品推荐
相关产品推荐

