Spring Boot Java应用部署Heroku遇404,本地正常求排查
问题:Spring Boot应用部署Heroku后404错误(本地正常)
部署Spring Boot(Java)应用到Heroku,部署状态显示成功且应用已启动,但访问https://herokuprojectest.herokuapp.com/main/status返回HTTP Status 404 – Not Found,Heroku日志记录了该404请求;本地访问http://localhost:8080/main/status可正常获取{"status":"ok"}结果。
pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.3</version> <relativePath/> </parent> <packaging>war</packaging> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>project</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.7.1</version> </dependency> </dependencies> <build> <plugins> <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.30.0</version> <destFileName>webapp-runner.jar</destFileName> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
Procfile内容
web: java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --port $PORT target/*.war
Controller代码
@RestController @CrossOrigin(origins = "*") @RequestMapping("/main") public class MainController { @GetMapping("/status") public ResponseEntity<Model> getStatus(Model model, WebRequest request) { model.addAttribute("status", "ok"); return ResponseEntity.ok(model); } }
错误排查与解决办法
WAR包部署缺少Servlet初始化配置
打包成WAR包部署到外部容器时,Spring Boot启动类需要继承SpringBootServletInitializer,否则容器无法识别应用入口。修改启动类:@SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(DemoApplication.class); } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }webapp-runner与Spring Boot版本不兼容
当前使用的webapp-runner:9.0.30.0对应Tomcat 9.0.30,而Spring Boot 2.7.3默认依赖Tomcat 9.0.65,版本差距过大可能引发兼容性问题。升级webapp-runner版本:<artifactItem> <groupId>com.heroku</groupId> <artifactId>webapp-runner</artifactId> <version>9.0.65.0</version> <destFileName>webapp-runner.jar</destFileName> </artifactItem>依赖版本冲突
手动添加的spring-boot-autoconfigure:2.7.1与父依赖管理的2.7.3版本不一致,会导致配置加载异常。删除该手动依赖:<!-- 移除以下依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.7.1</version> </dependency>Procfile中WAR包路径匹配问题
若Maven生成的WAR包带版本号(如demo-0.0.1-SNAPSHOT.war),target/*.war可能匹配异常,可明确指定包名:web: java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --port $PORT target/demo-0.0.1-SNAPSHOT.war
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

