多模块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
相关产品推荐
相关产品推荐

