You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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>

验证与部署

  1. 本地先执行mvn clean package,测试包是否能正常运行:
    • 可执行JAR:java -jar target/xxx.jar
    • WAR包:java -jar target/webapp-runner.jar target/xxx.war
  2. 测试通过后,执行mvn heroku:deploy完成部署

内容的提问来源于stack exchange,提问作者Wiktor Bartoszyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:16:15