Spring Boot 项目打成 war 包部署,接口报 404 问题
2023-09-14 08:57:30 时间
Spring Boot 一个非常方便的功能就是支持内置的 Servlet 容器,一般我们部署 Spring Boot 应用时都是打成一个可执行的 Jar 包进行部署。其实 Spring Boot 也是支持打成传统的 war 包部署的。肯定有人问:既然 Jar 包简单又方便,为什么还要 用 war 包部署呢?其实我就是自己折腾下,哈哈~
需要注意的是,假如你的应用使用了 Spring 的 WebFlux 功能,那么是不支持 war 包部署的。
配置调整
1. 修改 pom.xml 中的打包方式
<packaging>war</packaging>
2. 调整依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!-- 该包只在编译和测试的时候使用 -->
<scope>provided</scope>
</dependency>
3. 继承 SpringBootServletInitializer
@SpringBootApplication
public class AppQuickStart extends SpringBootServletInitializer {
private static Logger logger = LoggerFactory.getLogger(AppQuickStart.class);
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
logger.info("app begin to start...");
SpringApplication.run(AppQuickStart.class, args);
logger.info("app start success...");
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(AppQuickStart.class);
}
}
4. 一些其他注意点
下面是 build 的配置,主要是设置了应用的名称,还用就是加了maven-war-plugin
这个插件,不然会报找不到web.xml
这个错误。
<build>
<finalName>appName</finalName>
<!-- 省略其他配置 -->
<plugins>
<plugin>
<configuration>
<excludeDevtools>true</excludeDevtools>
</configuration>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
好了,到此就可以执行mvn clean install
命令打包了。
报 404 问题
网上有很多文章说 Spring Boot 应用打成 war 部署 Tomcat 后访问接口会报 404 错误。如果你是完全上面的步骤配置的不应该会有问题。
假如真的有问题,建议从下面几方面来解决:
- URL 有没有写对:部署 Tomcat 后是需要填写 context-path 的,这个 context-path 并不是 Spring Boot 中配置的,而是 Tomcat 中配置的,如果你没对 Tomcat 做特殊的配置,那么这个 context-path 就是你打包好的项目的名称;
- 检查接口参数有没传对;
- 终极办法,打开日志的 Dubug 级别,一般问题都能看出来,如果你日志是 info 级别,你的全局异常处理没做到位,有些异常是看不出来的。
说明
本文基于 Tomcat 9 和 Spring Boot 2.0.0.Release 版本
相关文章
- spring boot 引用外部配置文件
- 【Spring Boot】Spring Boot之两种引入spring boot maven依赖的方式
- 【Spring Boot】Spring Boot之使用AOP实现数据库多数据源自动切换
- spring boot: 用thymeleaf嵌套循环展示多层数据(spring boot 2.3.2)
- spring boot使用WebClient调用其他系统提供的HTTP服务
- Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
- spring boot单元测试之十一:给带有filter的controller做单元测试(spring boot 2.4.4)
- spring boot:接口站增加api版本号后的安全增强(spring boot 2.3.3)
- spring boot: 设计接口站api的版本号,支持次版本号(spring boot 2.3.2)
- spring boot:使用validator做接口的参数、表单、类中多字段的参数验证(spring boot 2.3.1)
- 使用 Docker 部署 Spring Boot 项目
- Vue+Spring boot前后端响应流程总结
- 为什么Spring Boot推荐使用logback-spring.xml来替代logback.xml来配置logback日志的问题分析
- 【springboot系列】Spring Boot 实现接口幂等性的 4 种方案
- spring boot 单元测试 --- 在测试类使用 javabean注解操作接口
- Exploring Micro-Frameworks: Spring Boot
- Developing JSF applications with Spring Boot
- Spring Boot从入门到实战:集成AOPLog来记录接口访问日志
- Spring MVC单文件上传(附带实例)
- 【java】Spring Boot --spring boot项目整合xxl-job
- 鬼吹灯,掘金Spring容器中的Aware接口