用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案
Spring Boot 的 Fat JAR(通过 spring-boot-maven-plugin
打包)虽然简化了部署,但也存在一些潜在缺点,需根据场景权衡:
1. 启动速度较慢
- 原因:
Fat JAR 需要在启动时解压并加载所有依赖的 JAR 文件到类路径,尤其是依赖较多时,类加载和初始化耗时显著。 - 表现:
依赖较多的项目(如微服务)可能出现冷启动延迟(如 10~30 秒)。 - 优化:
- 使用 Spring Native(AOT 编译为本地镜像)。
- 开启分层打包(
layers.enabled=true
)。
2. 内存占用较高
- 原因:
所有依赖库被加载到 JVM 内存中,即使某些依赖仅在特定场景下使用。 - 表现:
应用内存峰值较高,可能影响资源受限环境(如低配服务器、云函数)。 - 优化:
- 移除未使用的依赖(
mvn dependency:analyze
检测无用依赖)。 - 使用 模块化 JVM(JPMS) 按需加载依赖。
- 移除未使用的依赖(
3. 文件体积过大
- 问题:
Fat JAR 包含所有依赖,可能导致 JAR 文件体积膨胀(如 100MB+),影响网络传输和存储效率。 - 示例:
一个简单的 REST API 服务可能因引入Spring Data JPA
和Hibernate
导致 JAR 包增大。 - 优化:
- 使用 Docker 分层构建,将依赖层与应用代码层分离。
- 通过
<excludes>
移除非必要依赖(如测试库)。
4. 依赖冲突风险
- 问题:
当多个依赖库引入不同版本的同一库时(如guava
),可能导致版本冲突,且调试困难。 - 表现:
ClassNotFoundException
或NoSuchMethodError
等运行时异常。 - 优化:
- 使用
mvn dependency:tree
分析依赖树。 - 通过
<exclusions>
显式排除冲突版本。
- 使用
5. 调试与分析困难
-
问题:
Fat JAR 将所有内容打包为单一文件,导致日志、堆栈跟踪中的路径复杂化(如BOOT-INF/classes!
)。 -
示例:
异常堆栈中可能显示:java.lang.NullPointerException: null
at com.example.MyController E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB… (MyController.java:20) -
优化:
-
使用
-Djarmode=layertools
解压 JAR 分析内容:java -Djarmode=layertools -jar your-app.jar extract
-
6. 安全性与更新成本
- 问题:
如果依赖库存在安全漏洞(如log4j
漏洞),需重新打包并部署整个 Fat JAR,而非仅替换单个依赖。 - 优化:
- 使用 Docker 镜像分层,仅更新依赖层。
- 定期通过
mvn versions:display-dependency-updates
检查依赖更新。
7. 不适用于所有场景
不适用场景:
- 需共享依赖的环境:
若多个应用部署在同一服务器且共享部分依赖,Fat JAR 会导致冗余存储。 - 热更新需求:
修改代码后需重新打包整个 JAR,无法像传统 WAR 包那样快速替换部分文件。 - 超大依赖库:
如机器学习模型库(几百 MB),Fat JAR 会显著增大体积。
替代方案
方案 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
传统 WAR + 外部 Tomcat | 多应用共享服务器资源 | 依赖集中管理,更新灵活 | 需维护外部 Tomcat 环境 |
瘦 JAR + 外部依赖目录 | 依赖变动少的场景 | JAR 体积小,启动略快 | 需手动管理依赖路径 |
Docker 容器化 | 云原生、微服务架构 | 依赖隔离,资源可控 | 需 Docker 环境支持 |
Spring Native | 超快启动(Serverless/边缘计算) | 毫秒级启动,内存占用低 | 需适配 GraalVM,编译时间较长 |
总结
Fat JAR 的缺点主要集中在 性能开销、维护成本 和 场景适配性 上。建议根据以下场景选择:
- 继续使用 Fat JAR:
适合简单应用、快速原型开发或容器化部署(如 Docker + 分层构建)。 - 切换其他方案:
若追求极致启动速度 → Spring Native;
若需共享依赖 → WAR + Tomcat;
若依赖频繁更新 → Docker 分层镜像。
相关文章:
用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案
Spring Boot 的 Fat JAR(通过 spring-boot-maven-plugin 打包)虽然简化了部署,但也存在一些潜在缺点,需根据场景权衡: 1. 启动速度较慢 原因: Fat JAR 需要在启动时解压并加载所有依赖的 JAR 文件到类路径…...
Spring Boot 使用 WebMagic 爬虫框架入门
1. 创建 Spring Boot 项目 使用 Spring Initializr 创建一个 Spring Boot 项目,选择需要的依赖,如 Spring Web 等。 2. 添加 WebMagic 依赖 在项目的 pom.xml 文件中添加 WebMagic 的核心和扩展依赖: <dependency><groupId>u…...
【软件设计师:复习】上午题核心知识点总结(二)
一、计算机网络(常考) 1.网络模型与协议(必考) 1.OSI七层模型 vs. TCP/IP四层模型 OSI七层TCP/IP四层核心协议/设备功能应用层(Application)应用层HTTP、FTP、DNS、SMTP提供用户接口和服务表示层(Presentation)SSL/TLS、JPEG、ASCII数据格式转换、加密/解密会话层(S…...
TensorRt10学习第一章
建立TensorRt时必须要有Public ILogger,因为createInferBuiler和createruntime要用,是一个接口 出错打印 和...
【LeetCode Hot100】回溯篇
前言 本文用于整理LeetCode Hot100中题目解答,因题目比较简单且更多是为了面试快速写出正确思路,只做简单题意解读和一句话题解方便记忆。但代码会全部给出,方便大家整理代码思路。 46. 全排列 一句话题意 给定一个无重复数字的序列…...
Go 语言中一个功能强大且广泛使用的数据验证库github.com/go-playground/validator/v10
github.com/go-playground/validator/v10 是 Go 语言中一个功能强大且广泛使用的数据验证库,主要用于对结构体字段进行数据校验,确保数据的合法性和完整性。以下是其核心作用、使用场景及代码案例的详细说明: 核心作用 数据校验 支持对结构体…...
Java 多线程进阶:线程安全、synchronized、死锁、wait/notify 全解析(含代码示例)
在 Java 并发编程中,“线程安全” 是核心议题之一。本文将深入讲解线程安全的实现手段、synchronized 的使用方式、可重入锁、死锁的成因与避免、wait/notify 通信机制等,并配合实际代码案例,帮助你彻底搞懂 Java 线程协作机制。 一、线程安全…...
windows电脑端SSH连接开termux的安卓端
(确保你此前已经安装好了ssh)在手机termux当中输入: 查看状态:ssh 启动服务:sshd 查看IP:ifconfig 然后在电脑端:...
Java 期中考试练习题
一、引言 Java 作为一门广泛应用的编程语言,在计算机相关专业的课程体系中占据重要地位。期中考试是检验同学们对 Java 知识掌握程度的重要环节。本文将呈现一些典型的 Java 期中考试试题,并进行详细讲解,希望能帮助大家更好地理解和掌握 Ja…...
【Unity】 组件库分类详解
1️⃣ Audio(音频组件) 用于处理游戏中的声音。 Audio Source 读音[ˈɔːdiəʊ ˈsɔːs],音频源组件,用于播放音频文件,可设置音量、Pitch、循环播放等属性,是音频播放的核心组件。 Audio Listener 读音…...
Java 中使用正则表达式
1. 引入包 在使用正则表达式之前,需要引入包: import java.util.regex.Matcher; import java.util.regex.Pattern; 2. 常用模式规则 元字符 :这些是正则表达式中的特殊字符,用于匹配特定的模式。 . :匹配任意单个字…...
如何降低LabVIEW开发费用
在 LabVIEW 开发过程中,开发费用是用户和开发者共同关注的重点。过高的开发成本可能会压缩项目利润空间,甚至影响项目的可行性。下面将介绍降低 LabVIEW 开发费用的有效方法。 合理规划项目需求,避免后期增加 在项目启动阶段ÿ…...
WPF使用SQLSugar和Nlog
WPF应用中使用SQLSugar和NLog实现数据库操作与日志记录 1. 准备工作 首先,通过NuGet安装必要的包: Install-Package SQLSugarCore Install-Package NLog Install-Package NLog.Config Install-Package NLog.Targets.File 2. 配置NLog 在项目中添加nlog.config文件: <…...
Python10天冲刺-设计模型之策略模式
策略模式是一种行为设计模式,它允许你在运行时动态地改变对象的行为。这种模式的核心思想是将一组相关的算法封装在一起,并让它们相互替换。 下面是使用 Python 实现策略模式的一个示例: 示例代码 假设我们有一个简单的购物车系统…...
Js扩展DOM、BOM、AJAX、事件、定时器
BOM 操作 BOM指的是浏览器对象模型:Browser Object Mode,通过操作 window 对象的属性和方法来实现与浏览器的交互。 BOM的构成如下图所示: 其中,window对象是顶级对象,在 window 对象下面有一些重要的属性࿱…...
奥地利学派方法论的三个基础
主观价值论: 一切估价行为皆来自于个人,价格现象只能从主观估价中得到解释。 个人只在边际上做决策,边际价值是递减的。 罗斯巴德的等式:三个单位的某个东西的总效用 > 两个单位的总效用 > 一个单位的总效用,但…...
WPF之Image控件详解
文章目录 1. 概述2. Image控件的基本属性2.1 Source属性2.2 Stretch属性2.3 StretchDirection属性 3. 在XAML中使用Image控件3.1 基本用法3.2 设置拉伸模式3.3 设置图像对齐方式 4. 在代码中操作Image控件4.1 加载本地图像4.2 异步加载图像4.3 从流中加载图像4.4 控制图像的解码…...
如何将 VS Code 与 Linux 系统高效连接:从入门到进阶
引言 无论是开发服务器应用、管理远程主机,还是在本地 Linux 环境中提升开发效率,Visual Studio Code(VS Code) 凭借其强大的扩展能力,成为连接 Linux 系统的利器。本文将详细介绍 三种主流方法,助你无缝对…...
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用 前言一、animateRotorPosition脚本内容二、脚本功能讲解三、脚本修改与模型配置四、可视化效果展示五、修改后脚本内容文章相关模型文件下载链接参考链接 前言…...
安川机器人常见故障报警及解决办法
机器人权限设置 操作权限设置(如果密码不对,就证明密码被人修改) 编辑模式密码:无(一把钥匙,默认) 管理模式密码:999999999(9个9,二把钥匙) 安全模式密码:555555555(9个5,三把钥匙,权限最高,有的型号机器人,没有此模式,但最高密码为安全模式密码) 示教器…...
【Quest开发】极简版!透视环境下抠出身体并能遮挡身体上的服装
前两天发了一个很复杂的版本,又鼓捣了一下发现完全没有必要。我之前的理解有点偏(不是错误的但用法错了),但是有一些小伙伴收藏了,害怕里面的某些东西对谁有用,所以写了一篇新的,前两步配置环境…...
【Github仓库】Learn-Vim随笔
一、前言 学习vim的过程中发现了很多很好的资源,其中不乏bilibili上up主的精品教程。也在YouTube上看过很多教程。但Learn-Vim这个Github仓库实在让我受益良多。 本笔记便是出于此仓库: 仓库地址 附上个人.vimrc配置文件: syntax on " 开启语法高…...
【2025五一数学建模竞赛C题】社交媒体平台用户分析问题|建模过程+完整代码论文全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,…...
Wireshark抓取SMTP协议报文
文章目录 1. 实验:网络仿真软件使用及网络分析2. SMTP协议2.1 SMTP协议简介2.2 SMTP协议的核心功能2.3 SMTP的相关命令和作用 3. Wireshark抓取报文3.1 抓取SMTP协议报文流程3.1.1 Email邮件服务器背景3.1.2 具体实现流程 3.2 过滤SMTP协议相关报文 4. 协议时序图4.…...
PS学习笔记(一)
课程地址:【B站第一!】央美大佬198小时讲完的PS教程,全程干货无废话!学完秒变大神!还学不会,我不教设计了!!_哔哩哔哩_bilibili 第一章:基础知识 1.PS认识 一、PS应用领…...
部署.NET6.0 Web API项目到Docker
文章目录 介绍创建.NET WebAPI项目项目打包项目部署文件准备部署命令可能的问题与解决 介绍 使用VS2022创建一个.NET6的Web API项目,将其打包,并部署到Linux服务器上的Docker中。 Linux和Docker环境已经备好,本文不再赘述,主要记…...
前端函数防抖(Debounce)完整讲解 - 从原理、应用到完整实现
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…...
React Redux 与 Zustand
Redux 一、Redux 核心概念 1. 为什么需要 Redux? 解决的问题:在大型 React 应用中,跨组件共享状态、管理复杂数据流。 优势: 单一数据源:全局状态集中存储在 Store 中。 可预测性:通过严格的规则&#…...
Webug4.0靶场通关笔记07- 第9关反射XSS和第10关存储XSS
目录 第09关 反射型XSS 1.打开靶场 2.源码分析 3.渗透实战 第10关 存储型XSS 1.打开靶场 2.源码分析 3.渗透实战 本系列为通过《Webug4.0靶场通关笔记》的渗透集合,本文为反射型和存储型XSS漏洞关卡的渗透部分,通过对XSS关卡源码的代码审计找到漏…...
react学习笔记4——React UI组件库与redux
流行的开源React UI组件库 material-ui(国外) 官网: http://www.material-ui.com/#/github: GitHub - mui/material-ui: Material UI: Comprehensive React component library that implements Googles Material Design. Free forever. ant-design(国内蚂蚁金服) 官网: Ant…...
Java学习手册:Spring 事务管理
一、事务管理的概念 事务是一组操作的集合,这些操作要么全部成功,要么全部失败。事务管理的目的是保证数据的一致性和完整性。在数据库操作中,事务管理尤为重要,例如银行转账、订单支付等场景都需要事务管理来确保数据的正确性。…...
SpringBoot研究生双选系统开发实现
概述 SpringBoot研究生双选信息发布系统,该系统实现了研究生与导师双向选择的全流程管理,采用主流SpringBoot框架开发,是学习企业级教育管理系统开发的优质资源。适合作为计算机专业设计项目或高校信息化建设参考,完整实现…...
springboot中异步接口实现所有方式_20250501
几种异步接口实现demo package org.dromara.controller.app;// 导入必要的依赖库import cn.dev33.satoken.annotation.SaIgnore; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import o…...
【Linux网络】I/O多路转接技术 - epoll
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
机器学习经典算法:用决策树原理优化新能源汽车续航能力
🔥 “用决策树重构新能源车能量大脑!算法推导代码实战全解,续航暴增15%” 决策树算法就像我们生活中做决策的 “流程指南”,通过层层判断得出最终结论。比如你去超市买水果,站在琳琅满目的货架前,就不自觉地…...
深入探讨宾馆一次性牙刷价格,市场价格区间差异大
在我们日常出行、住宿的时候,宾馆的一次性牙刷是常见的、标配的物品。许多人或许都会感到好奇,这些一次性牙刷到底值多少钱。下面就来深入探讨一下宾馆一次性牙刷价格方面的问题。 市场价格区间 宾馆一次性牙刷价格差距大,便宜的一支可能只…...
深入解析 .NET Kestrel:高性能 Web 服务器的架构与最佳实践
Kestrel 是 .NET 中用于处理 HTTP 请求的高性能 Web 服务器。作为 ASP.NET Core 的默认服务器,Kestrel 被设计为在高并发、高吞吐量的环境下表现优异,并且能够支持多种协议和跨平台操作。本文将深入探讨 Kestrel 的架构设计、工作原理、配置方式、性能优…...
ZYNQ 纯PL端逻辑资源程序固化流程
ZYNQ 纯PL端逻辑资源程序固化 ZYNQ的程序固化流程比传统的FPGA固化流程复杂很多,Vivado生成的bit文件无法直接固化在ZYNQ芯片中。因为ZYNQ 非易失性存储器的引脚(如 SD 卡、QSPI Flash)是 ZYNQ PS 部分的专用引脚。这些非易失性存储器由 PS …...
【树莓派Pico FreeRTOS】-FreeRTOS-SMP移植
FreeRTOS-SMP移植 文章目录 FreeRTOS-SMP移植1、Raspberry Pi Pico SDK准备2、下载最新FreeRTOS-Kernel源码3、Raspberry Pi Pico的开发环境搭建4、编译配置5、FreeRTOSConfig.h文件设置6、演示代码RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 …...
数字智慧方案5961丨智慧能源与运维云平台解决方案(52页PPT)(文末有下载方式)
详细资料请看本解读文章的最后内容。 资料解读:智慧能源与运维云平台解决方案 在当今数字化时代,能源管理与设备运维的智能化、高效化成为企业发展的关键。智慧能源与运维云平台解决方案应运而生,为企业提供了全面且先进的能源管理和运维手段…...
2025东三省C题深圳杯C题数学建模挑战赛数模思路代码文章教学: 分布式能源接入配电网的风险分析
完整内容请看文章最下面的推广群 数据整理与分析 表1:有源配电网62节点系统负荷参数 内容:列出了62个节点的有功负荷(单位:kW)。 特点: 负荷范围:24 kW(节点19)到420 …...
腾讯云BI VS quickbi 企业选型(从企业实际功能使用和费用对比)
腾讯云BI VS quickbi 选型 一、总结 前段时间领导让调研腾讯云BI,用来做BI选型,现根据公司实际使用功能做如下总结。 建议继续使用quickbi,不选择腾讯云BI 原因: 腾讯云BI专业版,官方价格最低101996元。并且只能选…...
WebDeveloper 流量分析、sudo提权,靶场通关WP
一、信息收集 1、主机探测 arp-scan -l netdiscover -i eth0 -r 192.168.33.0/24 nmap -sP 192.168.66.0/24 2、端口扫描 nmap -sS -sV 192.168.66.141 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) 80/tcp op…...
编写教育网站后端页面笔记
callbacktitle.html 对应表: 对应的功能: 控制器层数据: 页面没有写内容 chapter.html 对应表: questionbank ,intofloortime,questionBank,title,didtitles,option,answer,analyse 对应的功能:问题反馈页面 控制器层数据(控制器类): ChapterQuestionbankTitle c…...
C++漫溯键值的长河:map set
文章目录 1.关联式容器2.set2.1 find2.2 lower_bound、upper_bound 3.multiset3.1 count3.2 equal_range 4.map4.1 insert4.2 operate->4.3 operate[ ]4.4 map的应用实践:随机链表的复制 5.multimap希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动…...
西门子数字化研发设计制造一体化规划案例P87(87页PPT)(文末有下载方式)
资料解读:《西门子数字化研发设计制造一体化规划案例》 详细资料请看本解读文章的最后内容。 该文档围绕西门子为企业打造的智能化制造研发工艺生产一体化平台规划方案展开,全面阐述了从业务现状分析到项目实施及案例分享的整个过程。 业务现状与需求分析…...
Rust多线程性能优化:打破Arc+锁的瓶颈,效率提升10倍
一、引言 在 Rust 开发中,多线程编程是提升程序性能的重要手段。Arc(原子引用计数)和锁的组合是实现多线程数据共享的常见方式。然而,很多程序员在使用 Arc 和锁时会遇到性能瓶颈,导致程序运行效率低下。本文将深入剖…...
基于python的人工智能应用简述
基于Python的人工智能应用简述 Python已成为人工智能(AI)开发的首选语言,凭借其简洁性、丰富的库生态系统和强大的社区支持,广泛应用于各类AI应用场景。以下是Python在人工智能领域的主要应用领域和技术实现。 1. 机器学习(Machine Learning) Python通过Scikit-learn、Ten…...
《Android 应用开发基础教程》——第十章:使用 Gson 实现网络 JSON 数据解析与对象映射
目录 第十章:使用 Gson 实现网络 JSON 数据解析与对象映射 🔹 10.1 什么是 Gson? 🔸 10.2 添加依赖 🔸 10.3 基础使用 ✦ 示例 JSON 字符串: ✦ 定义对应的 Java 类: ✦ JSON ➜ 对象&am…...
【Android】四大组件之BroadcastReceiver
目录 一、什么是BroadcastReceiver 二、创建和使用BroadcastReceiver 三、跨应用广播接收权限 四、广播方式 五、广播类型与特性 六、BroadcasReceiver注册方式 七、BroadcasReceiver工作流程 你可以把广播接收器想象成一个“收音机”。它的作用是监听系统或应用发出的“…...