SpringBoot引入外部jar包,项目打包成war包发布(亲测有效) - 第453篇

news2024/11/17 5:22:32

历史文章(文章累计450+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

利用Spring扩展点对敏感信息加密解密,一文集齐n多知识点「扩展点实战系列」」- 第447篇

利用Spring扩展点模拟MyBatis的注解编程「知识点多多」「扩展点实战系列」- 第448篇

走进MyBatis源码一探Spring扩展点「知识点多多」「扩展点实战系列」- 第449篇

走进SpringBoot源码吃透Spring扩展点「扩展点实战系列」- 第450篇

5个月的精华:Spring/SpringBoot扩展点手册:手册在手,编码无忧:全网独一份 - 第451篇

SpringBoot添加外部jar包及打包(亲测有效) - 第452篇

​悟纤:师傅,有粉丝留言了。

师傅:说什么了?

悟纤:如果打的是war包,要怎么打包?

师傅:那徒儿觉得呢?

悟纤:应该大差不差呢。

师傅:这个要怎么说呢,从配置上来说,要是要做一些配置的,没人和你说的话,自己摸索还是有一定困难的。

悟纤:那师傅你懂吗?

师傅:To understand or not to understand, that is the question。

悟纤:师傅赶紧的吧,教教我呗。

师傅:那你赶紧调整下状态,马上开始。

悟纤:时刻准备着了~

导读

有粉丝留言:

将Spring Boot打包成war包,对于开发自己,可能都没有想过这个问题吧~需求都是来源于实际的,产品要求、技术领导要求、历史原因等等。

总结下需求:

(1)将Spring Boot项目打包成war包。

(2)将war包部署到web容器。

(3)引入外部jar如何配置?

一、为什要打成war包

1.1 jar与war包的区别

l jar包:直接通过内置 tomcat 运行,不需要额外安装 tomcat。如需修改内置 tomcat 的配置,只需要在SpringBoot 的配置文件中配置。内置 tomcat 没有自己的日志输出,全靠 jar 包应用输出日志。但是比较方便,快速,比较简单。

lwar 包:传统的应用交付方式,需要安装 tomcat,然后放到 webapps 目录下运行 war 包,可以灵活选择tomcat 版本,可以直接修改 tomcat 的配置,有自己的 tomcat 日志输出,可以灵活配置安全策略。相对打成 jar 包来说没那么快速方便。

1.2 为什么要打包成war包的场景

有解决方案,那么就存在解决方案的一些场景或者原因。

(1)共用一个web容器:在某些特殊场景下需要将后台和其他应用共用一个web容器(Tomcat之类)。

(2)方便运维人员维护,修改配置:当我们使用springboot开发时,有的时候需要打war包在外部tomcat部署,方便运维人员维护,但是修改配置文件后重新打包给运维的时候,又需要修改一些配置这样还是不方便维护。

(3)公司旧的技术体系:由于在早期没有SpringBoot时,一些老的项目已经通过Tomcat独立部署war包,并构建了相应的部署体系和闭环。而且对于老的成熟的项目不期望在投入精力去升级和改造,只需要最小大家的保证运行稳定,为了投入和产出的平衡。

(4)通过外部的可配置Web容器(Tomcat)进行项目管理:Spring Boot项目使用了内嵌的Web容器,如果要使用外部的可配置的Web容器,那么打包成war包,再部署到Web容器中。

(5)项目需要集群部署或者进行优化:SpringBoot默认达成jar包,使用SpringBoot构想web应用,默认使用内置的Tomcat,但考虑到项目需要集群部署或者进行优化时,就需要打成war包部署到外部的Tomcat服务器中。

(6)class增量升级:一些客户需要 class 增量升级,虽然 jar 也可以做到,但是过程太过复制。这个时候如果直接打成 war 包,整理升级 class 文件就非常的好办了。

(7)项目中使用了JSP:如果项目中有使用 JSP,那么使用 war 包部署会更方便一些,虽然我们也可以通过配置集成 JSP 通过 jar 包方式运行;新项目的话就不要用 JSP 了。

(8)公司使用的是其它的Web容器:如果公司用的 web 容器不是 Tomcat、Jetty 或undertow,那就只能打成 war 包部署。

二、如何打成war包

打包成war整体思路就是排查web容器依赖,添加maven-war-plugin插件。接下来就使用Tomcat容器给大家做个示范,亲测有效。

在讲解下说明一下环境,避免因为环境的问题,给大家带来不必要的烦恼:

(1)操作系统:Mac OS。

(2)开发工具:IntelliJ IDEA 2022.2.2 (Ultimate Edition)。

(3)JDK版本:1.8。

(4)Spring Boot版本:2.7.6。

(5)Tomcat版本:apache-tomcat-8.5.57。

2.1 pom设置:添加war打包方式

在pom.xml文件, 添加war打包方式:

<packaging>war</packaging>

该配置和<name>节点同级,如下截图所示:

2.2 pom设置:排除SpringBoot内置的tomcat

现在是打包成war包了,那么打包的时候就不需要内嵌web容器了,要排除掉。修改pom.xml文件的spring-boot-starter-web添加属性exclusions:

<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>

2.3 pom设置:添加tomcat容器

你是不是搞错了,前面的步骤不是刚说排除掉吗?这里又要添加进来。是的,你没有看错,打包的时候不需要打包了,但项目开发的时候还是需要使用到了,所以需要重新添加进来,并且将scope设置为provided:

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-tomcat</artifactId>    <scope>provided</scope></dependency>

这里是测试用的,scope设置为provided。

2.4 pom设置:添加war打包插件

在<build> - <plugins>下maven-war-plugin:

<plugin>    <groupId>org.apache.maven.plugins</groupId>    <artifactId>maven-war-plugin</artifactId>    <version>3.3.2</version>    <configuration>        <failOnMissingWebXml>false</failOnMissingWebXml>    </configuration></plugin>

说明:failOnMissingWebXml设置为false,让系统忽略缺少WEB-INF的错误。

2.5 pom设置:添加最终打包项目名

在build下添加fileName:

<finalName>package-war-test</finalName>

最终打包成package-war-test.war。当然这个不配置也是打包的,只是打包的war文件是name加上版本号的。

2.6 启动类设置

(1)继承SpringBootServletInitializer

(2)重写其configure方法

package com.example.packagewartest;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;@SpringBootApplicationpublic class PackageWarTestApplication extends SpringBootServletInitializer {    @Override    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {        return builder.sources(PackageWarTestApplication.class);    }    public static void main(String[] args) {        SpringApplication.run(PackageWarTestApplication.class, args);    }}

2.7 配置文件:添加content-path

访问tomcat的项目,很多时候是有项目名称的,为了访问地址的统一,可以配置属性content-path,当然这个不配置的话,也不影响打包。

在application.properties添加属性:

server.servlet.context-path=/package-war-test

2.8 maven打包

(1)clean

(2)package

(3)获取targert war包

2.9 部署到tomcat

(1)把war包放在tomcat的webapps目录下。

(2)启动tomcat:bin/startup.sh

(3)localhost+tomcat端口号+项目名+接口,进行访问。

2.10 引入外部jar打包成war包

引入jar,在使用外部jar的方法,重新进行打包部署。

更多@添加外部jar包及打包的知识,关注公众号「SpringBoot」回复关键词[452],查看文章:

《SpringBoot添加外部jar包及打包(亲测有效) - 第452篇》

启动访问接口,报错:

报错信息的意思,就是类早不到,也就是说外部jar并没有被打包进来。

只需要稍微修改下配置,指定资源路径即可:

<plugin>    <groupId>org.apache.maven.plugins</groupId>    <artifactId>maven-war-plugin</artifactId>    <version>3.3.2</version>    <configuration>        <failOnMissingWebXml>false</failOnMissingWebXml>        <webResources>            <webResource>                <directory>${pom.basedir}/libs/</directory>                <targetPath>WEB-INF/lib/</targetPath>                <includes>                    <include>**/*.jar</include>                </includes>            </webResource>        </webResources>    </configuration></plugin>

然后再重新打包部署,访问一下:

测试使用的源码如下截图:

总结

总的来说,打包成war包的一个好处,就是把多个项目部署到同一个tomcat下,对tomcat统一配合优化和管理,至于要不要打包成war包看自己的需求,非不要下当然是使用jar的方式了,在Spring Boot2.3的版本还支持了分层jar了,可以自行了解下。

最后对核心步骤做个简单的总结:

(1)如何打包成war包:使用插件maven-war-plugin。

(2)如何将外部jar进行打包:配置属性webResource。

(3)没有属性web.xml文件文件报错:配置属性failOnMissingWebXml为false。

(4)内嵌容器依赖问题:先从starter-web依赖节点排除,然后再添加,并将scope设置为provided。

(5)名称问题:打包名称可以在pom.xml文件设置fileName,项目名称可以在application.properties(yml)中设置context-path。

文章已经写的不能再详细了,如果你还是碰到了问题,那么… 还是有可能的~

\(^o^)/~ 你的小小鼓励,是博主坚持的动力,如果本文你有收获,点个赞再走呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小f的刷题笔记】(JS)数组 - 前缀和 LeetCode303 LeetCode34

【数组】 前缀和&#xff1a; &#x1f31f; 原始数组不会被修改的情况下&#xff0c;频繁查询某个区间的累加和 ✔ 一次把所有从一开始到本数的累加值计算出来存在一个新数组里&#xff0c;区间的累加值通过减法得出 LeetCode303 链接&#xff1a; 303.区域和检索 - 数组…

刷爆力扣之至少是其它数字两倍的最大数

刷爆力扣之至少是其它数字两倍的最大数 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷…

一文带你了解【深度学习】中CNN、RNN、LSTM、DBN等神经网络(图文解释 包括各种激活函数)

觉得有帮助请点赞关注收藏~~~ 一、深度学习概述 深度学习算法属于机器学习算法的范畴&#xff0c;深度学习一般具有自主学习能力 基于深度学习的自然语言处理基本操作步骤包括&#xff1a; 将原始信息输入神经网络模型&#xff0c;通过自主学习算法识别输入特征&#xff1b;…

Redis 发布订阅

Redis 发布订阅 Redis 发布/订阅 (publish/subscribe) 是一种消息通信模式&#xff1a;发送者 (publish) 发送消息&#xff0c;订阅者 (subscribe) 接收消息。 Redis 客户端可以订阅任意数量的频道。 下图展示了频道 channel1&#xff0c;以及订阅这个频道的三个客户端 ——…

李沐论文精度系列之八:视频理解论文串讲

文章目录一 、前言二、 DeepVideo&#xff08;IEEE 2014&#xff09;2.1 模型结构2.2 实验结果2.3 总结三、双流网络及其变体3.1 Two-Stream&#xff08;NeurIPS 2014&#xff09;3.1.1 简介3.1.2 改进工作3.2 Two stream LSTM&#xff08;CVPR 2015 &#xff09;3.2.1 模型结构…

Django的学习笔记

Django初笔记一、认识Django1.基本原理2.框架二、建立一个简单的项目1.建立一个HelloWord&#xff08;1&#xff09;进入虚拟环境&#xff08;2&#xff09;建立项目三、基本应用结构&#xff08;1&#xff09;配置文件setting&#xff08;2&#xff09;URL&#xff08;路由系统…

【C语言进阶(NEW)】一、数据储存详解|数据类型介绍|整形在内存中的存储|浮点型在内存中的存储

目录 一、数据类型介绍 1.1 基本内置类型 1.2 类型的基本归类 1.3 有符号&#xff08;signed&#xff09;与无符号&#xff08;unsigned&#xff09;的区别 二、整形在内存中的存储 2.1 原码、反码、补码 2.2 大小端 2.2.1 什么是大小端 2.2.2 为什么有大端和小端 2.…

Dubbo(分布式框架·上)

Dubbo上一、导入1、基础知识1.1、什么是分布式系统1.2、发展演变1.2.1 单一应用架构1.2.2分布式应用架构1.2.3 流动计算架构1.3 RPC1.3.1 什么是RPC1.3.2 RPC核心模块二、Dubbo概念三、设计架构四、环境搭建4.1 Zookeeper注册中心4.2 测试Zookeeper4.1 监控中心五、测试5.1 需求…

论文阅读-ATLAS: A Sequence-based Learning Approach for Attack Investigation

论文代码&#xff1a; https://github.com/purseclab/ATLAS 代码预处理写的太乱了&#xff0c;很多预处理过程都不是特别合理。不过这篇论文思想还是挺合理的&#xff0c;相比其实溯源图工作在路径上的处理更加合理一些。 背景简介 高级可持续威胁攻击&#xff08;Advanced P…

AXI VDMA回环测试

Block Design 搭建如下图所示的硬件系统&#xff1a; 该硬件系统的数据流向为&#xff1a; DDR–>AXI VDMA–>AXI DATA FIFO–>AXI VDMA–>DDR 即将一幅图像由一段地址空间搬运至另一段地址空间。 其中&#xff0c;AXI VDMA配置如下&#xff1a; 地址位宽32&…

[附源码]Python计算机毕业设计SSM健身房管理系统 (程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

认识3dmax 轴心

轴心&#xff0c;pivot&#xff1b; 资料对轴心的说明如下&#xff0c; 物体轴心 每个物体有且仅有一个轴心&#xff0c; 轴心位置确定了物体的位置&#xff0c; 物体旋转是围绕轴心旋转的; 轴心&#xff0c;我没看到说是一个点或一条线&#xff1b;在三维空间应…

什么样的护眼灯适合孩子用?真正适合孩子的护眼台灯

在现在这个时代&#xff0c;科技的更新迭代&#xff0c;我们生活水平得到提高&#xff0c;在灯具行业也是越来越多样化了&#xff0c;作为家长的&#xff0c;希望能买到适合孩子的护眼灯&#xff0c;那么在那么多种类的台灯中&#xff0c;什么样的适合孩子呢&#xff1f;这次主…

虹科方案|用Western Digital和ATTO技术优化SMR存储解决方案的负载

​ 一、引言 Western Digital 与 ATTO Technology 的长期合作基于对当今复杂企业环境的存储和数据基础设施需求的共同洞察。我们正在共同为用户准备迎接下一波性能挑战。 二、背景 随着动态数据过渡到静态数据&#xff0c;存储成为关键基础架构组件之一。然而&#xff0c;以…

【教学类-21-01】20221205《青花茶杯-A4纸插入式纸盒》(大班主题《我是中国人》)

展示效果&#xff1a; 单张效果 多张效果 隐藏的部分 信息&#xff1a; 1.右侧第1列&#xff1a;幼儿园名字&#xff1b; 2.右侧第3列&#xff0c;幼儿名字 &#xff08;1&#xff09;3个名字印 &#xff08;为了统一4字&#xff09; &#xff08;2&#xff09;2个名字印…

初识多线程编程

文章目录一、线程线程与进程的区别二、多线程编程Thread创建线程的方法一、线程 我们开始引入进程&#xff0c;最主要的目的是去解决"并发编程"的问题&#xff0c;电脑进入了多核心&#xff0c;想要提高程序执行速度&#xff0c;就得将这些核心用起来。 我们在每次…

【vue3】代码格式化和volar卡顿问题解决

一、格式化策略 用eslint做代码检查和格式化是很方便的东西&#xff1b; 这里我们使用vscode完成这些操作&#xff1b; 在代码保存的时候&#xff0c;顺便完成格式化操作 1)装上eslint和prettier插件 2)装完插件之后&#xff0c;我们需要配置一下 打开 文件 > 首选项 >…

「Whale Cast」功能更新,让全网看到您的直播高光时刻

直播为王的时代&#xff0c;品牌如何在直播中增强运营能力&#xff0c;降本增效&#xff1f; 11 月&#xff0c;「帷幄开播 Whale Cast」迎来新的功能更新&#xff0c;一起来看一看&#xff0c;它将为您的直播间运营优化带来哪些强大助力。 我们将分别按智能裁切、直播场控、直…

springboot定义统一的异常返回格式(全局,特定,自定义)等

一 设置全局统一的返回格式 1.1 没有加全局异常处理 1.这里设置一个字符串为空指针异常&#xff0c;然后看看返回给前端的信息。 2.返回结果 3.效果看起来不友好的提示 1.2 添加全局异常处理 1.代码&#xff1a;添加一个全局异常处理类 ControllerAdvice public class Glo…

MySQL存在这么多的数据引擎 , 所有的引擎都在使用吗

一 . 前言 总是看到有说MySQL某个数据引擎哪里哪里有问题的 , 让我一度怀疑我是不是Mysql 用的不对 , 有些问题都没有遇到过&#xff0c;所以我非常好奇 , 数据库的存储引擎 , 大家真的在用吗? MySQL 官方文档:: MySQL 5.7 Reference Manual :: 15 Alternative Storage Engi…