Spring Boot应用部署至Heroku启动时崩溃,报H10错误的解决方案咨询
嘿,从你提供的日志和配置来看,问题的核心其实很明确——咱们一步步来搞定它:
核心问题:JAR包缺少主清单属性
你的日志里有个关键报错:
no main manifest attribute, in target/clinica-0.0.1-SNAPSHOT.jar
这说明你打包出来的JAR不是可执行的Spring Boot JAR。原因是你移除了spring-boot-maven-plugin,这个插件是Spring Boot打包的核心:它会帮你生成包含主类信息的MANIFEST.MF文件,还会把所有依赖打包进JAR,让它能独立运行。
第一步:恢复Spring Boot Maven插件
把pom.xml里的<build>部分改回原来的配置(这才是正确的Spring Boot打包方式):
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
另外注意:你当前maven-compiler-plugin指定的source和target是1.8,但<java.version>是11,版本不一致会导致潜在问题。建议直接移除这个maven-compiler-plugin配置——Spring Boot的父POM已经帮你默认配置了匹配Java版本的编译参数。
第二步:修正Heroku适配配置
1. 动态端口配置
Heroku会给每个应用动态分配端口,通过环境变量PORT传递。你现在硬编码了server.port=8080,这会导致应用无法监听Heroku分配的端口,修改application.properties:
server.port=${PORT:8080}
这样本地开发时用8080,部署到Heroku时自动用平台分配的端口。
2. 数据库配置适配
你当前的数据库配置指向本地PostgreSQL,部署到Heroku后要使用平台提供的数据库实例。修改application.properties的数据库部分:
spring.datasource.url=${DATABASE_URL} spring.datasource.username=${DB_USERNAME:postgres} spring.datasource.password=${DB_PASSWORD:password}
Heroku会自动设置DATABASE_URL等环境变量,这样应用在Heroku上能正确连接数据库,本地开发时依然用你原来的账号密码。
3. 可选但推荐:添加Procfile
虽然Heroku能自动检测Spring Boot应用,但创建Procfile可以明确启动命令,避免自动检测的异常。在项目根目录创建一个无后缀的Procfile文件,内容:
web: java -Dserver.port=$PORT $JAVA_OPTS -jar target/clinica-0.0.1-SNAPSHOT.jar
第三步:重新部署并验证
完成所有修改后,提交代码到GitHub触发Heroku重新部署,或者用Heroku CLI执行:
git add . git commit -m "Fix packaging and Heroku configurations" git push heroku main
部署完成后,实时查看日志确认启动状态:
heroku logs --tail
内容的提问来源于stack exchange,提问作者decd

