You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker部署Vaadin23应用(Java17容器启动故障求助)

Java 17下Docker化Vaadin应用Tomcat崩溃问题解决

问题背景

按照旧教程用Java 11部署Vaadin应用到Docker无异常,但切换到Java 17(最新LTS版本)时,镜像构建成功,容器启动时Tomcat服务器却崩溃,核心异常为模块访问权限相关的初始化错误。

复现步骤

  • 从Vaadin初始项目生成平台创建Java 17版本的Vaadin项目
  • 沿用旧教程的Docker配置,仅将基础镜像替换为openjdk:17
  • 构建镜像并运行容器,触发Tomcat崩溃

解决方法

1. 添加Java 17模块权限参数

在Dockerfile的Tomcat启动命令中补充--add-opens参数,开放Tomcat所需的JDK模块访问权限:

CMD ["catalina.sh", "run", "--add-opens=java.base/java.lang=ALL-UNNAMED", "--add-opens=java.base/java.io=ALL-UNNAMED", "--add-opens=java.base/java.util=ALL-UNNAMED", "--add-opens=java.base/java.util.concurrent=ALL-UNNAMED", "--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"]

2. 使用适配Java 17的Tomcat官方镜像

替换基础镜像为官方tomcat:10-jdk17,该镜像已预先配置好Java 17的运行环境,无需手动调整模块权限:

FROM tomcat:10-jdk17
# 复制WAR包到Tomcat webapps目录(示例)
COPY target/your-vaadin-app.war /usr/local/tomcat/webapps/ROOT.war

3. 升级Vaadin版本至兼容Java 17的版本

确保使用Vaadin 23及以上版本,该版本正式支持Java 17,旧版本可能存在未适配的兼容性问题。

原因说明

Java 17启用了更严格的模块化系统,Tomcat的部分内部逻辑需要访问JDK中未默认开放的模块,因此需通过--add-opens显式授权,或使用已完成适配的Tomcat镜像来规避权限问题。

内容的提问来源于stack exchange,提问作者Zero_MaDi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:06:27