Gradle构建的Spring Boot项目部署Heroku时报NoSuchMethodException如何解决
问题根因
首先抛出的java.lang.NoSuchMethodException错误核心是Kotlin编写的Spring Boot启动类的main方法不符合JVM入口要求,no main manifest attribute报错是打包时未正确生成可执行JAR的清单配置。
可行解决方案
- 修正启动类main方法写法
Kotlin的Spring Boot启动类有两种符合JVM要求的写法,二选一即可:- 顶层main函数写法(无静态注解要求,推荐)
@SpringBootApplication class ApiApplication fun main(args: Array<String>) { runApplication<ApiApplication>(*args) }- 伴生对象写法(必须加
@JvmStatic注解)
@SpringBootApplication class ApiApplication { companion object { @JvmStatic fun main(args: Array<String>) { runApplication<ApiApplication>(*args) } } } - 补充Gradle打包配置
在现有的build.gradle中添加如下配置,确保生成的可执行JAR携带正确的清单信息,避免清单属性报错:
// 启用bootJar打包,配置正确的主类属性 tasks.named('bootJar') { enabled = true manifest { attributes 'Main-Class': 'org.springframework.boot.loader.JarLauncher' attributes 'Start-Class': 'com.abade.apigateway.ApiApplication' } } // 禁用普通jar任务,避免和bootJar生成的文件冲突 tasks.named('jar') { enabled = false }
- 优化Procfile配置(可选)
可以将原有硬编码JAR包名的配置替换为通用写法,后续版本号变更无需修改Procfile:
web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/*.jar
验证步骤
修改完成后先在本地执行./gradlew bootJar打包,再执行java -jar build/libs/api-gateway-0.0.1-SNAPSHOT.jar验证本地启动正常,再推送到Heroku部署即可。
内容的提问来源于stack exchange,提问作者Pierrick Compois
相关产品推荐
相关产品推荐

