把spring-boot项目部署到tomcat容器中

本文介绍如何将Spring Boot项目以WAR包的形式部署到Tomcat服务器上。具体步骤包括修改打包方式、移除嵌入式Tomcat插件、添加servlet-api依赖、重写初始化方法及最终的打包部署。

把spring-boot项目按照平常的web项目一样发布到tomcat容器下

一、修改打包形式

在pom.xml里设置 <packaging>war</packaging>

二、移除嵌入式tomcat插件

在pom.xml里找到spring-boot-starter-web依赖节点,在其中添加如下代码,

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 移除嵌入式tomcat插件 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

三、添加servlet-api的依赖

下面两种方式都可以,任选其一

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-servlet-api</artifactId>
    <version>8.0.36</version>
    <scope>provided</scope>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

四、修改启动类,并重写初始化方法

我们平常用main方法启动的方式,都有一个App的启动类,代码如下:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

我们需要类似于web.xml的配置方式来启动spring上下文了,在Application类的同级添加一个SpringBootStartApplication类,其代码如下:

/**
 * 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
 */
public class SpringBootStartApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // 注意这里要指向原先用main方法执行的Application启动类
        return builder.sources(Application.class);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

五、打包部署

在项目根目录下(即包含pom.xml的目录),在命令行里输入:
mvn clean package即可, 等待打包完成,出现[INFO] BUILD SUCCESS即为打包成功。
然后把target目录下的war包放到tomcat的webapps目录下,启动tomcat,即可自动解压部署。
最后在浏览器中输入

http://localhost:[端口号]/[打包项目名]/

发布成功

### 不移除 `spring-boot-starter-tomcat` 的后果分析 如果在将 Spring Boot 项目从 JAR 打包方式改为 WAR 时不移除 `spring-boot-starter-tomcat`,可能会引发以下问题和影响: #### 1. 冲突的 Servlet 容器实例化 Spring Boot 默认集成了嵌入式的 Tomcat 作为其内置 Web 服务器。当项目部署到外部 Servlet 容器(如 Apache Tomcat 或 Jetty)时,内部的 Tomcat 实例仍然会被加载并尝试启动。这可能导致两个独立的 Servlet 容器试图在同一进程中运行,从而引起端口冲突或其他资源争用问题[^7]。 #### 2. 类加载机制混乱 外部 Servlet 容器通常有自己的类加载器来处理应用中的依赖项。然而,由于未排除掉 `spring-boot-starter-tomcat`,它所携带的一整套 Tomcat 组件也会进入 Classpath 中。这种双重存在可能造成版本不一致或者重复定义某些核心接口和服务实现的情况发生,进而破坏正常的类加载过程[^8]。 #### 3. 性能开销增加 即使成功解决了上述技术难题,保留不必要的嵌入式 Tomcat 还是会给整个系统带来额外负担——无论是内存占用还是 CPU 时间消耗都会有所上升。因为现在不仅有外置容器负责请求响应工作流管理职责,还有另一个完全相同的子系统处于待命状态却无法实际发挥作用[^9]。 #### 4. 可维护性下降 长期来看,这样的设计决策会让未来升级变得更加复杂困难。每当需要更新某个特定部分的时候都需要特别小心谨慎以免打破现有平衡;而且对于新加入团队成员而言理解这样一个混合架构也需要更多时间成本去学习掌握其中细节差异所在之处[^6]。 综上所述,在大多数场景下建议遵循最佳实践即通过合理配置去除不需要的部分以获得更加简洁高效稳定可靠的解决方案。不过也有例外情况比如出于特殊需求考虑希望同时支持两种不同的运行模式,则可以根据实际情况灵活调整相应设置选项达到目的即可满足业务灵活性要求的同时兼顾其他方面因素的影响评估结果做出权衡取舍决定如何实施具体措施步骤计划安排等等相关内容描述如下所示代码片段展示了一个典型例子说明了这一点: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>runtime</scope> </dependency> ``` 此处我们将作用域设定为 runtime ,意味着只有在运行时期才会需要用到该组件而不是在整个生命周期内始终生效 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值