Heroku部署Vaadin SpringBoot应用报H10 App crashed错误求助
故障原因
H10错误是应用启动进程直接崩溃导致,从日志可以看到核心报错:
Error: Unable to access jarfile server/webapp-runner.jar
启动命令找不到指定路径的webapp-runner.jar文件,进程以状态码1退出,直接导致应用崩溃。
路径不匹配的根源有两个:
- 你在
pom.xml中配置的maven-dependency-plugin没有指定webapp-runner.jar的输出目录,该插件默认会将复制的依赖存放到target/dependency/路径下,和Procfile中写的server/路径完全不一致。 - 你使用的是SpringBoot + Vaadin技术栈,本身打包后会生成自带Tomcat容器的可执行FatJar,根本不需要依赖webapp-runner(webapp-runner是用于传统WAR包部署的工具),这套配置属于冗余配置还出现了路径错误。
另外你当前Procfile中target/*的通配符写法也有问题:Maven构建后target目录下会存在原始jar、测试jar、可执行jar等多个文件,通配符匹配多个文件时会导致Java启动命令参数异常。
解决方法
二选一即可,优先推荐第一种方案,是SpringBoot应用部署Heroku的标准方式。
方案一(推荐):移除webapp-runner依赖,直接启动SpringBoot可执行包
- 直接删除
pom.xml中maven-dependency-plugin下复制webapp-runner的整段配置,不需要这个依赖。 - 确认
pom.xml中已经配置了spring-boot-maven-plugin(SpringBoot初始化项目默认会带该插件,无需额外修改),打包时会自动生成可执行FatJar。 - 在项目根目录新建
system.properties文件,写入以下内容指定Heroku使用JDK17运行,和你本地编译版本保持一致,避免字节码版本不兼容错误:java.runtime.version=17 - 将根目录下
Procfile的内容替换为:web: java $JAVA_OPTS -Dserver.port=$PORT -jar target/*.jar - 本地执行
mvn clean package确认构建成功后,重新推送代码到Heroku即可正常启动。
方案二:修正现有webapp-runner配置(仅适用于需要打WAR包部署的场景)
如果你坚持使用webapp-runner部署,按以下步骤修正配置:
- 修改
pom.xml中maven-dependency-plugin的配置,在<configuration>标签下增加输出目录配置,将webapp-runner复制到你Procfile指定的路径:<outputDirectory>${project.basedir}/server</outputDirectory> - 在
pom.xml的根节点下增加packaging配置,指定打包为WAR格式:<packaging>war</packaging> - 同样新增
system.properties文件指定JDK17版本,和方案一第3步一致。 - 修改Procfile内容,明确指定WAR包路径,避免通配符匹配多文件:
web: java $JAVA_OPTS -jar server/webapp-runner.jar --port $PORT target/*.war
本地验证技巧
推送代码到Heroku之前,可以本地安装Heroku CLI后执行heroku local web命令模拟线上启动环境,本地能正常启动再推送,可避免绝大多数路径、配置类启动错误。
内容的提问来源于stack exchange,提问作者Rizky Ghifari
相关产品推荐
相关产品推荐

