在Heroku部署Spring Boot应用时遭遇NoClassDefFoundError错误求助
解决Heroku部署Spring Boot应用时的
java.lang.NoClassDefFoundError错误 这个错误的核心原因是部署到Heroku的包没有包含Spring Boot核心依赖,或者你的构建配置和Spring Boot的部署方式不匹配——你当前用的webapp-runner是为传统WAR包设计的,但Spring Boot默认采用内嵌容器的可执行JAR包模式,两者不兼容。以下是针对性解决方案:
方案1:构建Spring Boot可执行JAR包(推荐)
Spring Boot的标准部署方式是打包成包含所有依赖的可执行JAR,只需修改pom.xml的构建配置:
<build> <plugins> <!-- Spring Boot Maven插件:打包所有依赖到可执行JAR,并配置启动逻辑 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>你的Spring Boot版本号</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <!-- Heroku部署插件:指定启动命令 --> <plugin> <groupId>com.heroku.sdk</groupId> <artifactId>heroku-maven-plugin</artifactId> <version>1.1.3</version> <configuration> <procfile> <web>java -jar target/你的项目名称-版本号.jar</web> </procfile> </configuration> </plugin> </plugins> </build>
替换说明:
你的Spring Boot版本号:对应项目中spring-boot-starter-parent的版本,比如2.7.15你的项目名称-版本号:对应pom.xml中artifactId和version的组合,比如demo-1.0-SNAPSHOT
方案2:改用WAR包部署(仅当需要外部容器时)
如果必须用WAR包部署,需要两步调整:
1. 修改启动类
让Spring Boot启动类继承SpringBootServletInitializer:
@SpringBootApplication public class YourApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
2. 修改pom.xml配置
指定打包类型为war,并调整Heroku插件的启动命令:
<!-- 在pom.xml根节点添加打包类型 --> <packaging>war</packaging> <!-- 修改build部分的插件配置 --> <build> <plugins> <!-- Spring Boot插件:支持WAR包构建 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>你的Spring Boot版本号</version> </plugin> <!-- Heroku部署插件:配置webapp-runner启动WAR包 --> <plugin> <groupId>com.heroku.sdk</groupId> <artifactId>heroku-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <phase>package</phase> <configuration> <artifactItems> <artifactItem> <groupId>com.github.jsimone</groupId> <artifactId>webapp-runner</artifactId> <version>8.5.11.3</version> <destFileName>webapp-runner.jar</destFileName> </artifactItem> </artifactItems> <procfile> <web>java -jar target/webapp-runner.jar --port $PORT target/你的项目名称-版本号.war</web> </procfile> </configuration> </execution> </executions> </plugin> </plugins> </build>
验证与部署
- 本地先执行
mvn clean package,测试包是否能正常运行:- 可执行JAR:
java -jar target/xxx.jar - WAR包:
java -jar target/webapp-runner.jar target/xxx.war
- 可执行JAR:
- 测试通过后,执行
mvn heroku:deploy完成部署
内容的提问来源于stack exchange,提问作者Wiktor Bartoszyn
相关产品推荐
相关产品推荐

