Spring Boot项目瘦身

news2024/11/16 5:30:11

目录

  • 1,什么是瘦身?
  • 2,为什么要瘦身?
  • 3,如何瘦身?
    • 3.1,瘦身思路:
    • 3.2,瘦身方法
  • 4,瘦身后运行

1,什么是瘦身?

瘦身:thinBody,又称“减肥”、“减重”,就是合理,科学的减轻自身重量。Spring Boot应用瘦身顾名思义就是:将Spring Boot应用打包后的jar包,利用合理的方式,方法减小体积。

2,为什么要瘦身?

场景: 当前后端开发大部分都是采用Spring Boot作为底层架构,在前后端分离的方式下,后端项目最终都是打包成jar包来部署。因为项目中通常会引入各种的依赖,所以打成的jar包体积都是比较大的(百M左右),如果项目还是微服务分布式的,好几个项目加起来能达到GB,部署升级时会比较麻烦。
痛点: 项目上线后要升级,各个项目打包后加起来好几个G,运维老哥收到后肯定吐槽:“这么多包,要上传到什么时候”,尤其当带宽小,每秒上传几KB,运维老哥当场奔溃。
那么有什么办法可以减小jar包体积呢?

3,如何瘦身?

3.1,瘦身思路:

项目=code+dependency,code是我们编写的代码,这部分是升级必须的,新的功能就是在这里实现的,那dependency呢?
比如我们在项目中引入了操作数据库所需的依赖,例如MyBatis,Mysql等,我们在升级的时候这部分依赖还需要升级吗?明显不需要,那我们就可以想办法,使每次升级时只升级新的业务代码。
注意:在第一次部署时,我们还是要上传所有的代码和依赖,在之后的升级时,就可以只上传业务代码,如果有新增的依赖,也只需要将新增的依赖上传即可。

3.2,瘦身方法

这里需要借助一个插件来实现,首先来看一下不用插件时我们的jar,可以看到jar总大小是73.7M,jar包中的lib目录下是我们引入的各种依赖。
在这里插入图片描述
在项目的pom.xml中引入如下插件:

<!-- build 标签:用来配置对构建过程的定制 -->
    <build>
        <!-- plugins 标签:定制化构建过程中所使用到的插件 -->
        <plugins>
            <!-- plugin 标签:一个具体插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.6.1</version>
                <configuration>
                    <mainClass>com.tick.tack.TickTackApplication</mainClass>
                    <!--解决Windows命令行窗口中文乱码-->
                    <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
                    <layout>ZIP</layout>
                    <!--配置需要打包进项目的jar-->
                    <includes>
                        <!--这里是填写需要包含进去的jar,
                        比如是项目中某些我们自己编写的common模块(假如项目是个多模块的项目),会经常变动,
                        那么就应该将其坐标写进来
                        如果没有则non-exists,表示不打包依赖-->
                        <include>
                            <groupId>non-exists</groupId>
                            <artifactId>non-exists</artifactId>
                        </include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!--此插件用于将依赖包抽出-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <!--关联指定生命周期的目标-->
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!--将依赖拷贝到项目构建目录的lib下-->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!--是否排除传递性-->
                            <excludeTransitive>false</excludeTransitive>
                            <!--是否去掉jar包版本信息-->
                            <stripVersion>false</stripVersion>
                            <!--包含范围:拷贝运行时的依赖,例如测试的就不需要了-->
                            <includeScope>runtime</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

再次打包可以看到项目结构如下所示:
在这里插入图片描述
原先大的jar包被分成了两部分,lib下是依赖的包,web-server-1.0-20230323.jar是我们自己的业务代码。

4,瘦身后运行

瘦身后的项目结构发生了变化,在启动时也有变动

java -jar -Dloader.path=./lib web-server-1.0-20230323.jar

在这里插入图片描述

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

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

相关文章

CSS进阶

01-复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09;。 后代选择器 后代选择器&#xff1a;选中某元素的后代元素。 选择器写法&#xff1a;父选择器 …

Spring AOP续--织入

上篇讲到SpringAOP的一些用法以及概念&#xff0c;这里我们单独讲一下AOP中的“织入”。 我们知道&#xff0c;SpringAOP是基于动态代理实现的技术&#xff0c;而织入则是一个生成动态代理对象并且将切面和目标对象方法编织成为约定流程的过程。 对于通知&#xff0c;上篇文章…

数字化转型导师坚鹏:如何制定与实施企业数字化转型年度培训规划

如何制定与实施企业数字化转型年度培训规划 ——以推动企业数字化转型战略落地为核心&#xff0c;实现知行果合一 课程背景&#xff1a; 很多企业都在开展企业数字化转型培训工作&#xff0c;目前存在以下问题急需解决&#xff1a; 缺少针对性的企业数字化转型年度培训规划…

Python每日一练(20230507) 丑数I\II\III、超级丑数

目录 1. 丑数 Ugly Number I 2. 丑数 Ugly Number II 3. 丑数 Ugly Number III 4. 超级丑数 Super Ugly Number &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 丑数 Ugly Number I …

JavaWeb——1.JavaWeb概述

这是我们javaweb的第一篇文章&#xff0c;首先我们来介绍一下什么是Javaweb JavaWeb&#xff1a;使用java语言完成服务器端程序开发 如下面这张图所示&#xff1a; 可能不太好理解&#xff0c;那么就用通俗的语言来解释一下。 任何的一个应用程序&#xff0c;首先它会有页面…

在 Python 中将秒转换为小时、分钟和秒

文章目录 在 Python 中使用数学计算将秒转换为小时、分钟和秒的自定义函数在 Python 中使用 divmod() 函数将秒转换为小时、分钟和秒在 Python 中使用 DateTime 模块将秒转换为小时、分钟和秒在 Python 中使用时间模块将秒转换为小时、分钟和秒 本篇文章将讨论使用 Python 中的…

Golang每日一练(leetDay0058) 比较版本号、分数转小数

目录 165. 比较版本号 Compare Version Numbers &#x1f31f;&#x1f31f; 166. 分数到小数 Fraction To Recurring Decimal &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 …

Python动态绘图详解

文章目录 示例FuncAnimation三维情况 示例 matplotlib中的animation提供了动态绘图功能&#xff0c;下面列举一个最简单的动态绘制三角函数的例子&#xff0c;来初步演示一下。 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animatio…

深入理解Java虚拟机——垃圾收集器

1.前言 在前面我们已经说过了垃圾收集算法&#xff0c;那么现在我们要讲的垃圾收集器&#xff0c;实际上就是对垃圾收集算法的实践。 首先我们先看一张图&#xff0c;这张图可以帮助我们了解各款经典垃圾收集器之间的关系&#xff1a; 图中的垃圾收集器所在的区域代表了它是属…

学系统集成项目管理工程师(中项)系列18b_进度管理(下)

1. 制定进度计划 1.1. 分析活动顺序、持续时间、资源需求和进度制约因素&#xff0c;创建项目进度模型的过程 1.2. 输入 1.2.1. 进度管理计划 1.2.2. 活动清单 1.2.3. 活动属性 1.2.4. 项目进度网络图 1.2.5. 活动资源需求 1.2.6. 资源日历 1.2.7. 活动持续时间估算 …

Linux网络编程——套接字网络编程预备知识

0.关注博主有更多知识 操作系统入门知识合集 目录 1.理解IP地址和MAC地址 2.认识端口号 3.感性认识TCP协议和UDP协议 4.网络字节序 5.socket编程接口 1.理解IP地址和MAC地址 事实上在上一篇博客当中粗浅了介绍一个IP地址MAC地址&#xff0c;其中我们知道IP地址提供方向…

坐标系变换推导(欧拉角、方向余弦矩阵、四元数)+代码解析

一、为什么选择四元数 描述两个坐标系之间的变换关系主要有几个方法 1、欧拉角法(存在奇异性和万向锁而且三个轴旋转的顺序不好定) 2、方向余弦矩阵法(翻译为Directional cosine matrix&#xff0c;简称DCM&#xff0c;也称为旋转矩阵&#xff0c;看了很多博客写的是C11-C33的那…

【Python实操】如何快速写一个乒乓球游戏?

文章目录 前言一、 导入 turtle 和 Screen二、创建一个球3.创建一个 AI 挡板4.创建自己的挡板5.创建移动AI挡板的函数6.创建一个函数以移动你的挡板并用键盘控制它7.全部代码总结 前言 本文提供了一个 Python 实现的乒乓球游戏代码&#xff0c;你只需要将代码复制并粘贴到编辑…

如何防御流量攻击

随着互联网的发展&#xff0c;网络安全问题也日益突出。其中&#xff0c;流量攻击成为网络攻击的一种常见手段。那么流量攻击属于什么攻击&#xff0c;服务器防御流量攻击的方法有哪些呢?本文小编将为您一一解答。 一、流量攻击是什么? 流量攻击即DDoS攻击&#xff0c;全称为…

如何进行DNS优化

在互联网时代&#xff0c;网站的访问速度直接影响着用户体验和转化率。而DNS(Domain Name System)作为域名解析系统&#xff0c;负责将域名转换为IP地址&#xff0c;是网站访问速度的重要因素之一。因此&#xff0c;DNS优化成为了提升网站速度的重要手段之一。 DNS优化到底是什…

SpringMVC-RESTful

REST风格 1. REST简介1.1 REST介绍1.2 RESTful介绍1.3 注意事项 2. RESTful入门案例2.1 快速入门2.2 PathVariable介绍2.3 RequestBody、RequestParam、PathVariable区别和应用 3. REST快速开发【重点】3.1 代码中的问题3.2 Rest快速开发 4. 案例&#xff1a;基于RESTful页面数…

拿捏c语言循环

&#x1f4d5;博主介绍&#xff1a;目前大一正在学习c语言&#xff0c;数据结构&#xff0c;计算机网络。 c语言学习&#xff0c;是为了更好的学习其他的编程语言&#xff0c;C语言是母体语言&#xff0c;是人机交互接近底层的桥梁。 本章用循环去写一些题目。 让我们开启c语言…

Kubernetes系列---Kubernetes 理论知识 | 初识

Kubernetes系列---Kubernetes 理论知识 | 初识 1.K8s 是什么&#xff1f;2.K8s 特性3.小拓展&#xff08;业务升级&#xff09;4.K8s 集群架构与组件①架构拓扑图&#xff1a;②Master 组件③Node 组件 五 K8s 核心概念六 官方提供的三种部署方式 1.K8s 是什么&#xff1f; K…

springboot打包成jar包运行到服务器 java v 1.8

1.项目打包成jar包 1.1 1.2 2 jdk安装 2.1 jdk 官网 -> oracle 官方的jdk https://www.oracle.com/java/technologies/downloads/#java8 2.2 本地上传文件到服务器 2.3 配置安装 tar -zvxf jdk-8u131-linux-x64.tar.gz -->解压修改配置文件 source /etc/profile /…

Java 10 字符串

1.API 1.1API 概述 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java 中的 API ​ 指的就是 JDK 中提供的各种功能的 Java 类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只…