Spring Boot 项目打成 war 包部署,接口报 404 问题
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 版本
作者:程序员自由之路
出处:https://www.cnblogs.com/54chensongxia/p/13730179.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
15-问题解决
标签:
Spring Boot
, Tomcat
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?