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

多模块Spring Gradle+Vaadin应用同时部署后访问崩溃问题求助

解决Vaadin多模块应用部署后首个启动应用访问崩溃的问题

根据你描述的场景和堆栈报错信息,这个问题核心原因是两个Vaadin应用共享了前端资源缓存或构建产物路径。Vaadin在生产模式下依赖webpack.stats.json文件加载前端资源,当两个应用使用相同的临时目录或缓存路径时,第二个应用启动时会覆盖第一个应用的stats文件,导致第一个应用被访问时找不到属于自己的资源文件,进而触发BootstrapException。

下面是具体的解决步骤:

1. 为每个应用配置独立的前端缓存目录

在每个应用的application.properties(或application.yml)中添加专属的缓存路径配置,彻底隔离资源:

  • 应用1的配置:
    vaadin.frontend.cache-dir=/var/cache/vaadin/app1
    
  • 应用2的配置:
    vaadin.frontend.cache-dir=/var/cache/vaadin/app2
    

配置完成后,手动创建这些目录并赋予运行systemd服务的用户读写权限:

mkdir -p /var/cache/vaadin/app1 /var/cache/vaadin/app2
chown <你的服务运行用户>:<你的服务运行组> /var/cache/vaadin/*

2. 隔离Gradle模块的前端构建产物

在每个模块的build.gradle中,明确指定专属的前端资源目录和构建输出目录,确保每个模块的前端产物独立存储:

vaadin {
    // 指定当前模块专属的前端资源目录
    frontendDirectory.set(file("${projectDir}/frontend"))
    // 指定当前模块专属的Vaadin构建输出目录
    buildOutputDirectory.set(file("${projectDir}/build/vaadin"))
}

这样每个模块执行vaadinPrepareFrontend和构建JAR时,会把自己的webpack.stats.json和前端资源打包到独立位置,不会和其他模块混淆。

3. 配置systemd服务的独立工作目录

修改每个应用的systemd服务文件,设置专属的WorkingDirectory,避免运行时临时文件冲突:

  • 应用1的service文件示例:
    [Service]
    WorkingDirectory=/opt/apps/app1
    ExecStart=/usr/bin/java -jar app1.jar
    User=<你的服务运行用户>
    
  • 应用2的service文件示例:
    [Service]
    WorkingDirectory=/opt/apps/app2
    ExecStart=/usr/bin/java -jar app2.jar
    User=<你的服务运行用户>
    

4. 确保每个模块单独构建生产模式产物

构建JAR时,为每个模块单独指定生产模式参数,确保各自生成完整的前端生产资源:

# 构建应用1的生产模式JAR
./gradlew :app1:bootJar -Pvaadin.productionMode
# 构建应用2的生产模式JAR
./gradlew :app2:bootJar -Pvaadin.productionMode

完成以上配置后,重新部署两个应用,访问时应该就不会出现首个启动应用崩溃的问题了。如果还有异常,可以检查每个应用的缓存目录下是否生成了webpack.stats.json,以及文件内容是否对应当前应用的前端资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:47:46