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

Spring MVC(非Spring Boot)部署Heroku遇主方法缺失错误求助

解决Heroku部署非Spring Boot的Spring MVC应用(无web.xml)启动报错问题

嘿,我之前也踩过这个坑!Heroku默认会把Java应用当成可执行JAR来处理,所以会强制找带main方法的类,但咱们这种基于注解配置的传统Spring MVC WAR包(非Spring Boot)根本不需要这个,而且你用的<skipMain>true是maven-jar-plugin的配置,因为你打包的是WAR包,maven-war-plugin根本不吃这个参数,所以没用。下面给你两个靠谱的解决方案:

方案一:用Heroku官方的Webapp Runner运行WAR包(推荐)

Webapp Runner是Heroku专门为传统Java Web应用做的工具,本质是一个带嵌入式Tomcat的JAR,能直接运行你的WAR包,完全不需要自己写main方法。

步骤1:在pom.xml里添加依赖和插件

首先添加Webapp Runner的依赖,再用maven-dependency-plugin把它下载到target目录:

<dependencies>
    <!-- 你的其他Spring MVC等依赖 -->
    <dependency>
        <groupId>com.heroku</groupId>
        <artifactId>webapp-runner</artifactId>
        <version>9.0.70.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- 你的maven-compiler-plugin等其他插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>com.heroku</groupId>
                                <artifactId>webapp-runner</artifactId>
                                <version>9.0.70.0</version>
                                <destFileName>webapp-runner.jar</destFileName>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

步骤2:创建Procfile文件

在项目根目录新建一个名为Procfile的文件(注意首字母大写,没有后缀),内容如下:

web: java -jar target/dependency/webapp-runner.jar target/你的应用名称.war --port $PORT

把你的应用名称替换成你pom.xml里<finalName>指定的名称,或者默认的artifactId-version。$PORT是Heroku提供的环境变量,必须用这个,不然Heroku会启动失败。

方案二:自己写一个带main方法的嵌入式容器启动类

如果不想用Webapp Runner,也可以自己写个简单的main方法,用嵌入式Tomcat来加载你的Spring MVC应用:

步骤1:编写Main类

创建一个Main.java类,内容如下:

import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import java.io.File;

public class Main {
    public static void main(String[] args) throws LifecycleException {
        // 指定webapp目录路径
        String webappDirLocation = "src/main/webapp/";
        Tomcat tomcat = new Tomcat();
        
        // 读取Heroku的PORT环境变量,本地默认用8080
        String port = System.getenv("PORT");
        if (port == null || port.isEmpty()) {
            port = "8080";
        }
        tomcat.setPort(Integer.parseInt(port));
        
        // 添加你的web应用
        tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
        
        tomcat.start();
        tomcat.getServer().await();
    }
}

步骤2:添加嵌入式Tomcat依赖

在pom.xml里添加Tomcat嵌入相关的依赖:

<dependencies>
    <!-- 你的其他依赖 -->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>9.0.70</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>9.0.70</version>
    </dependency>
</dependencies>

因为你的MyWebAppInitializer实现了WebApplicationInitializer,嵌入式Tomcat会自动扫描并加载这个类,所以Spring MVC的配置会正常生效。

之后重新提交代码到GitHub,Heroku就能正常构建并启动你的应用了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:47:20