Spring MVC(非Spring Boot)部署Heroku遇主方法缺失错误求助
嘿,我之前也踩过这个坑!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

