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

Docker环境下运行带Vaadin的Spring Boot应用时Tomcat初始化失败求助

问题排查与解决建议

核心报错

Caused by: java.lang.IllegalStateException: StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[] failed to start
Dec 11 12:57:44 PM      at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.rethrowDeferredStartupExceptions(TomcatWebServer.java:171) ~[spring-boot-2.2.4.RELEASE.jar!/:2.2.4.RELEASE]
Dec 11 12:57:44 PM      at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:110) ~[spring-boot-2.2.4.RELEASE.jar!/:2.2.4.RELEASE]  

相关配置文件

1. Vaadin开发服务器配置(vaadin-dev-server-settings.json)

{
  "frontendFolder": "C:/Users/kiemoon/IdeaProjects/Vadin/assistant_vaadin/frontend",
  "themeFolder": "themes",
  "themeResourceFolder": "C:/Users/kiemoon/IdeaProjects/Vadin/assistant_vaadin/build/flow-frontend",
  "staticOutput": "build/classes/META-INF/VAADIN/webapp/VAADIN/static",
  "generatedFolder": "generated",
  "frontendBundleOutput": "build/classes/META-INF/VAADIN/webapp/",
  "addonFrontendFolder": "build/flow-frontend/",
  "themeName": "",
  "clientServiceWorkerSource": "C:\\Users\\kiemoon\\IdeaProjects\\Vadin\\assistant_vaadin\\build\\sw.ts",
  "pwaEnabled": false,
  "offlineEnabled": false,
  "offlinePath": "'offline.html'"
}

2. Dockerfile

FROM openjdk:11
WORKDIR /
ADD build/libs/assistant_vaadin-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar -Dspring.profiles.active=prod app.jar

3. application.properties

server.tomcat.accesslog.enabled=true

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

spring.datasource.url=jdbc:*******
spring.datasource.username=*******
spring.datasource.password=*******
spring.datasource.driver-class-name=org.postgresql.Driver

vaadin.productionMode=true

4. build.gradle

buildscript {
    repositories {
        mavenCentral()
        maven { setUrl("https://maven.vaadin.com/vaadin-prereleases") }
        maven { setUrl("https://maven.vaadin.com/vaadin-addons") }
    }
}
plugins {
    id 'org.springframework.boot' version '2.2.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
    id 'com.vaadin'
}

defaultTasks("clean", "build")

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
    maven { setUrl("https://maven.vaadin.com/vaadin-prereleases") }
    maven { setUrl("https://maven.vaadin.com/vaadin-addons") }
}

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}

dependencies {
    implementation('com.vaadin:vaadin-spring-boot-starter')
    implementation 'org.jetbrains:annotations:20.1.0'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    implementation 'com.opencsv:opencsv:5.7.1'
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'org.postgresql:postgresql:42.5.1'

    annotationProcessor 'org.projectlombok:lombok'
    implementation 'org.springframework.boot:spring-boot-starter'
}

dependencyManagement {
    imports {
        mavenBom "com.vaadin:vaadin-bom:$vaadinVersion"
    }
}

test {
    useJUnitPlatform()
}

// The following pnpmEnable = true is not needed as pnpm is used by default,
// this is just an example of how to configure the Gradle Vaadin Plugin:
// for more configuration options please see: https://vaadin.com/docs/latest/guide/start/gradle/#all-options
vaadin {
    pnpmEnable = true
}

bootRun {
    systemProperties = System.properties
}

排查与解决步骤

1. 修复Vaadin配置文件问题

vaadin-dev-server-settings.json是本地开发生成的文件,绝对不能打包进生产jar包,里面的Windows本地路径在Docker容器中完全不存在,会直接导致资源加载失败:

  • 在build.gradle中添加排除规则,避免该文件被打包:
    jar {
        exclude 'vaadin-dev-server-settings.json'
    }
    
  • 执行./gradlew vaadinBuildFrontend预编译Vaadin生产环境前端资源,确保所有静态资源被正确打包进jar。

2. 优化Dockerfile

FROM openjdk:11-jre-slim
WORKDIR /app
COPY build/libs/assistant_vaadin-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "-Dspring.profiles.active=prod", "app.jar"]
  • 使用轻量的openjdk:11-jre-slim镜像,减少容器体积
  • 用COPY代替ADD,避免不必要的文件解压
  • 添加EXPOSE 8080声明端口,适配render.com的路由规则
  • 指定/app作为工作目录,避免根目录权限问题

3. 验证数据库连接

确认application.properties中的数据库URL、用户名、密码正确,同时检查render.com的网络策略:数据库是否允许容器所在网络访问,是否开启了正确的端口权限。

4. 获取完整报错日志

当前日志仅显示Tomcat启动失败的上层异常,需要查看render.com控制台的完整日志,找到Caused by开头的具体根因(比如资源缺失、数据库连接失败、端口冲突等)。

5. 本地Docker测试

先在本地构建并运行镜像,复现问题便于排查:

docker build -t vaadin-app .
docker run -p 8080:8080 vaadin-app

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:20:31