当前位置: 首页 > news >正文

Spring Boot项目通过tomcat部署项目(包含jar包、war包)

在Spring Boot项目中,有两种常见的部署方式:

1.使用Spring Boot自带的 内置 Tomcat , 将项目打包为 jar 并直接运行

2.使用 外置 Tomcat,将项目打包为 war 并部署到传统的 Tomcat 服务器中

本文将从这两种方式的基础配置到实际部署,逐步展示 Spring Boot 项目如何通过内置和外置Tomcat实现部署~

目录

1、Tomcat简介

1.1 起源

1.2 作用

1.3 优点

2、使用内置Tomcat打包为Jar部署

2.1 什么是内置Tomcat部署?

2.2 Jar部署的优势

2.3 Jar 部署步骤

2.3.1 项目结构

2.3.2 确保 pom.xml 中的依赖支持打包为 Jar

2.3.3 打包

第一种方式

第二种方式

2.3.4 运行Jar文件

2.3.5 访问接口

2.3.6 配置端口和其它的参数

3.使用外置 Tomcat 打包为 War 部署

3.1 什么是外置 Tomcat 部署?

3.2 War 部署的优势

3.3 War 部署

3.3.1 更换入口类

3.3.2 配置 pom.xml 文件

3.3.4 提醒

3.3.5 打包


1、Tomcat简介

Tomcat 是一个非常流行的 轻量级Web服务器,他用来运行 Java语言编写的 Web 应用程序。Tomcat 就像是一个"中间人"或者"服务员",负责接收用户的请求,然后把这些请求转给后台的java程序,处理后再把结果返回给用户。它与传统的 Web服务器 (比如Apache HTTP Server、Nginx)不同,Tomcat主要是为动态 Web应用 服务的

1.1 起源

Tomcat的起源可以追溯到 1999 年,由 Apache 软件基金会(一个非盈利的组织,负责很多开源项目)开发出来的。它最早是 Java Servlet 和 JavaServer Pages(JSP)的参考实现,也是一个帮助 Java 程序处理网页请求的标准工具。Tomcat之所以得名,是因为Apache 基金会的成员觉得"猫科动物" 代表着敏捷、速度和轻巧。和Tomcat的特点非常的契合~

1.2 作用

  • 接收请求: 比如打开一个 Java Web应用(比如说在线商店、博客网站),Tomcat 就负责接收你的请求,比如点击商品详细页面。
  • 调用后台程序:Tomcat 会把这个请求交给运行在后台的 Java 程序,让它处理你的请求,比如查询商品信息。
  • 返回网页内容:当后台程序处理好你的请求后,Tomcat 会把结果(比如商品详细信息的页面)返回给你的浏览器,让你能看到网页。

1.3 优点

  • 免费开源:Tomcat 是免费的,任何人都可以下载、使用、甚至可以改进它的代码。对于个人和企业来说,是非常不错的选择
  • 轻量级:相比于其他复杂的 Java 应用服务器(比如 WebSphere、WebLogic),Tomcat 非常轻量,不需要太多的资源,占用的内存和 CPU 比较少。适合一些中小型的 Java Web 项目
  • 跨平台: 不管是用Windows、Mac还是Linux,Tomcat 都可以无缝运行,这意味着可以轻松地在不同的操作系统上搭建 Web 服务
  • 支持多种 Java 技术: Tomcat 支持 Java Servlet、JSP 等Java技术,这些技术都是开发Java Web应用的基础。

2、使用内置Tomcat打包为Jar部署

2.1 什么是内置Tomcat部署?

Spring Boot 默认内置了 Tomcat 服务器,在开发和生产环境中可以直接使用。打包时,将 Tomcat 与项目代码一起打包成一个可执行的jar文件,然后可以通过命令直接运行该 jar 文件来启动服务器。Spring Boot默认使用Tomcat 作为内嵌的Servlet 容器,有这些步骤可以验证:

  1. 首先在自己的Spring Boot项目中的pom.xml文件中找到这一条依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

ctrl+鼠标左键 点击spring-boot-starter-web

我们可以看到,spring-boot-starter-web这一jar包已经引入了如下这一条依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>3.1.3</version><scope>compile</scope>
</dependency>

根据依赖的传递性,可知,我们的Spring Boot项目已经默认使用Tomcat作为内嵌的servlet容器。当然我们也可以使用其他的容器,比如使用undertow作为Spring Boot的内置容器:

<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-undertow</artifactId>
</dependency>

在上面的代码中,我们排除了spring-boot-starter-web默认引入的tomcat,而手动引入了undertow。

2.2 Jar部署的优势

  • 简单直接: 无需安装额外的 Tomcat 服务器。
  • 开放方便: 在开发阶段可以通过内置的 Tomcat 快速启动和调试
  • 跨平台性:只需确保系统上有正确版本的 JDK, jar 文件在不同的环境中都可以轻松运行。

2.3 Jar 部署步骤

2.3.1 项目结构

2.3.2 确保 pom.xml 中的依赖支持打包为 Jar

在 pom.xml 文件中,确保添加了以下插件配置,以支持打包为jar:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
2.3.3 打包
第一种方式

使用IDEA中的maven管理,运行packsge,打成jar包

第二种方式

运行以下命令:

mvn clean package

这两种方式本质上是一样的,运行完之后就可以得到我们想要的jar包

打包完之后我们的项目target目录就会多出现两个包,如下图所示:

其中的.jar包是我们需要的,那么.jar.original包是什么呢?

.jar.original是普通jar包,不包含依赖

.jar是可执行jar包,包含了pom中的所有依赖,可以直接使用java -jar命令执行

如果是部署,我们就用.jar包

如果是给别的项目用,就要给.jar.original这个包

2.3.4 运行Jar文件

生成的jar 文件中包含了内置的Tomcat,进入cmd,运行java -jar +jar包名

注意:

  • nohub 不挂断运行
  • log.txt 输出的日志文件,没有则自动创建
nohup java -jar test.jar >log.txt &

注意:如果想要关闭项目,直接关闭这个cmd黑窗口就可以了

2.3.5 访问接口

使用postman测试接口会发现接口可以行通~

在浏览器输入网址访问,成功

2.3.6 配置端口和其它的参数

如果需要自定义 Tomcat 的端口、编码或其他的配置,可以在 application.properties 或 application.yml 中进行配置:

server.port = 9090
server.servlet.context-path = /myapp

通过这样的方式,可以直接修改应用启动参数和服务器配置~

clean清除构建结果,compile重新编译,package重新打包

重新运行

可见,访问本地的端口发生了变化

3.使用外置 Tomcat 打包为 War 部署

3.1 什么是外置 Tomcat 部署?

在一些企业环境中,常常需要将Spring Boot项目打包为 war 文件并部署到现有的 Tomcat 服务器中。这种方式比较符合传统的 Java Web 项目部署方式。

3.2 War 部署的优势

兼容传统的项目: Tomcat 作为一个 Web 服务器,支持部署多个 Web 应用。如果把每个应用都打包成 war 包,然后部署到 Tomcat 中,Tomcat 能够很好地管理这些应用,比如对它们进行独立的加载、启动、停止等操作,这种方式在长期的 Web 应用开发和部署实践中,形成了较为成熟和规范的流程。而如果采用其他不规范的部署方式,可能会出现应用之间相互干扰、Tomcat 管理困难等问题~

灵活配置:可以在 Tomcat 服务器层面配置资源池、连接器等,使多个项目共用

3.3 War 部署

3.3.1 更换入口类

入口类要继承SpringBootServletInitializer并重写configure方法

我们先找到Spring Boot的入口类,入口类的名字一定包含("~Application")

@SpringBootApplication
public class SpringbootstudyApplication extends SpringBootServletInitializer {//继承SpringBootServletInitializer 重写 configure@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder){return builder.sources(SpringbootstudyApplication.class);}public static void main(String[] args) {SpringApplication.run(SpringbootstudyApplication.class, args);}
}

3.3.2 配置 pom.xml 文件
  1. 修改打包方式

先让IDEA知道你这次要打包成war包,在pom.xml中设置打包方式 默认为jar 需要修改为war

<packaging>war</packaging>

如果你在自己的pom.xml文件中找不到标签,那么你可以自己添加,位置可以参考本图的

添加依赖

由于 SpringBootServletInitializer 类需要用到 servlet-api 的相关jar包,所以需要添加依赖

如果你的项目是Spring Boot2.X,你就使用下面的依赖

 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><!--版本号改成你自己适用的--><scope>provided</scope><!-- 使用 provided 作用域,因为外部容器会提供 Servlet API --></dependency>

如果你的项目是Spring Boot3.X的,那就使用下面的依赖

<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>5.0.0</version><scope>provided</scope> <!-- 使用 provided 作用域,因为外部容器会提供 Servlet API -->
</dependency>

我们需要使用provided作用域是因为:

Tomcat容器中存在Servlet,Maven 只会在编译和测试阶段将相关依赖加入到类路径中,打包时不会将其打入到最终的包中,这样就避免了与外部容器中已有的 Servlet API 版本冲突。

3.3.3 移除Spring Boot内嵌的Tomcat

第一种方式(推荐):

在pom.xml文件中添加以下的依赖

<!--设置此包运行时不可用--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency>

<scope>provided</scope> 这个配置项非常重要,它的作用是 指定作用范围 。provided 意味着这个依赖会在开发、编译和测试环境中存在,但是不会被打包到最终的 war 文件中(因为外部运行环境已经有 Tomcat 服务器,所以在项目中不需要再嵌入)

第二种方式:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

替换为:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!--排除内置tomcat jar包--><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency>

注意如果使用了这种方式,那么在开发、测试、编译环境中我们也移除了内置的 Tomcat 服务器,我们的Spring Boot项目就不可以在开发环境(IDEA)中运行了

运行时会出现报错提醒~

这是因为排除内置的 Tomcat 依赖后,Spring Boot 会认为你不再使用嵌入式的Web 容器(比如 Tomcat、Jetty 等),而是打算将应用部署到外部容器(如外部的 Tomcat)。这会导致Spring Boot 不再自动配置嵌入式的 Web 容器,因此你的应用在 IDEA 中无法启动,因为没有配置 SevletWebServerFactory 这个内置的 Servlet 容器工厂。Spring Boot 项目在 IDEA 中运行是需要嵌入式的 Web 容器的~

这时我猜细心的同学会问了,我们在(2)中不是引入了servlet-api这个依赖吗,这个的意思难道不是给我们的springboot项目引入容器?

当然不是了,servlet-api 依赖是 Servlet API 的实现,它为 Java Web 应用程序提供了处理 HTTP 请求和响应的核心功能。具体来说,Servlet 是 Java Web 应用程序的基础技术,定义了如何接收 HTTP 请求、处理业务逻辑,并返回 HTTP 响应。总的来说,它并不提供容器,而是仅提供Java Web 应用程序的核心 HTTP 处理能力。

推荐使用第一种移除方式,这样你可以完全不引入servlet-api,因为内置的tomcat服务器中已经包含了Servlet API,所以编译打包一点问题也没有。这也是我推荐第一种移除方式的原因~

3.3.4 提醒

就是这块地方,配置和不配置的效果都是一样的

server.port = 9090
server.servlet.context-path = /myapp

因为yml中的server配置应该是对内置的tomcat 的一个配置,我们现在并没有内置 tomcat ,所以配置和不配置都是一样的效果,都不会生效的~

port --> 还是以 tomcat 的配置文件中的端口启动

context-path --> 还是以 war包的名字作为项目路径

但是需要注意,就是一旦配置了,就需要将其配置对,不能有语法上的错误~

3.3.5 打包

在maven中双击package或者使用 mvn clean package命令

这个时候就可以看到出现了war包


文章转载自:

http://SHFkglJF.xtzkx.cn
http://HS03JQ0L.xtzkx.cn
http://rJWYxYtn.xtzkx.cn
http://6VEFi14B.xtzkx.cn
http://keTVhk4t.xtzkx.cn
http://1l9COfNz.xtzkx.cn
http://ULxJqSMW.xtzkx.cn
http://XmKnNq0E.xtzkx.cn
http://zSvzpXwj.xtzkx.cn
http://UTgogu8o.xtzkx.cn
http://3ofFCLI9.xtzkx.cn
http://Ao1JewUF.xtzkx.cn
http://tK9UWXYJ.xtzkx.cn
http://ocMhJt6H.xtzkx.cn
http://O0057tDn.xtzkx.cn
http://hFREWyP9.xtzkx.cn
http://Dirphoa4.xtzkx.cn
http://1zXm4Y3Z.xtzkx.cn
http://QA4Zs4Y3.xtzkx.cn
http://sGExFzDo.xtzkx.cn
http://hfKuDtM7.xtzkx.cn
http://laWmDOra.xtzkx.cn
http://KXPAneM8.xtzkx.cn
http://YSEg8kOT.xtzkx.cn
http://ioXVz2IH.xtzkx.cn
http://ULChmZUk.xtzkx.cn
http://9nBMIjtf.xtzkx.cn
http://KWdxtkFJ.xtzkx.cn
http://Yk6NFXSu.xtzkx.cn
http://eetU4LYZ.xtzkx.cn
http://www.dtcms.com/a/386999.html

相关文章:

  • 网络四层模型和七层模型的区别
  • 项目部署——LAMP、LNMP和LTMJ
  • 支付宝免押租赁平台源码
  • 不建议在 Docker 中跑 MySQL
  • PPT中将图片裁剪为爱心等形状
  • YOLO 模型前向推理全流程(以 YOLOv8 为例)
  • 【Redis】--集群
  • TRUNCATE还是DELETE?MySQL高效清空表的选择策略与实战指南
  • 【AI】AI评测入门(四):Evaluator Prompt拆解
  • Redis以`后台`方式启动方法
  • 【每日算法】找出字符串中第一个匹配项的下标 LeetCode
  • 【12】新国都 ——新国都 嵌入式 第一轮一面,技术面,校招,面试问答记录
  • 线程池-面试
  • 设计模式学习笔记(一)
  • 贪心算法应用:旅行商问题最近邻算法(TSP Nearest Neighbor)
  • 高系分七:软件工程
  • spark hive presto doris 对substr函数的差异
  • webpack5
  • M:Dijkstra算法求最短路径
  • C++11 atomic
  • 工作中真正常用的 git 操作
  • 【Java】P5 Java流程控制——分支结构详解
  • 下载 | Win10 2021官方精简版,预装应用极少!(9月更新、Win 10 IoT LTSC 2021版、适合老电脑安装)
  • 【面试场景题】交易流水表高qps写入会有锁等待或死锁问题吗
  • 嵌入式系统arm高级系统调试技能-24./proc/slabinfo 文件解读与内存异常分析
  • 关于单片机编程的循环以及全局变量应用的思考
  • C++string类详解
  • 卷积神经网络搭建实战(一)-----torch库中的MNIST手写数字数据集(简明版)
  • 2025 Android 知识体系总结(含面试要点,持续补充,更新中...)
  • elementui中表单先上传但不请求接口,点击按钮后在请求接口的方式上传文件,及校验