使用maven对springboot项目进行瘦身分离jar的多种处理方案

文章目录

  • 前言
  • 一、方案一(修改自带的spring-boot-maven-plugin插件)
  • 二、方案二(使用spring-boot-thin-maven-plugin插件)
  • 总结


前言

springboot项目打包一般我们都使用它自带的spring-boot-maven-plugin插件,这个插件默认情况下,会把所有的依赖包全部压缩到一个jar里面。在有时这给我们的部署或者更新带来很多的不方便,有的项目很大,最终的打包文件甚至可以达到几百M,有时可能我们只修改了一个小bug,更新时却要上传几百M的安装包,极度不方便,今天给大家分享几种方案来如何减小我们的打包文件,已方便我们的更新操作。
我们构造一个测试项目,具体的依赖如下:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version>
</dependency>
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

默认情况下我们直接运行打包命令:

mvn clean -DskipTests package

完成后,我们检查文件大小:
在这里插入图片描述
有18M,下面我们来进行瘦身处理


一、方案一(修改自带的spring-boot-maven-plugin插件)

我们可以使用自带的spring-boot-maven-plugin插件进行修改,然后再配合另外两个插件,这两个插件就是:maven-jar-plugin和maven-dependency-plugin,可以轻松完成,下面我们来具体操作。

在pom.xml文件中的plugins节点下加入下面的配置:

<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><classesDirectory>target/classes/</classesDirectory><archive><manifest><mainClass>com.example.testmvnpkgexespringboot.TestApplication</mainClass><!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 --><useUniqueVersions>false</useUniqueVersions><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix></manifest><manifestEntries><Class-Path>.</Class-Path></manifestEntries></archive></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><type>jar</type><includeTypes>jar</includeTypes><outputDirectory>${project.build.directory}/lib</outputDirectory><overWriteReleases>false</overWriteReleases><overWriteSnapshots>false</overWriteSnapshots><overWriteIfNewer>true</overWriteIfNewer></configuration></execution></executions></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!--重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖 --><includes><include><groupId>null</groupId><artifactId>null</artifactId></include></includes><layout>ZIP</layout><!--使用外部配置文件,jar包里没有资源文件 --><addResources>true</addResources><outputDirectory>${project.build.directory}</outputDirectory></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin>
</plugins>

下面进行打包:

mvn clean -DskipTests package

然后再查看文件大小:
在这里插入图片描述

我们发现,文件只有102K,而且这里多了一个lib文件,那么要运行这个文件,lib包就是必须的,我们直接运行jar包进行测试:

java -jar pkg-sb.jar

发现正常启动,如果我们把lib包删掉,在运行,这时就会报错。因此我们在发布项目的时候,lib和我们自己的jar必须再同级目录下,当然也可以修改maven-jar-plugin中的配置,大家可以自行研究。

最后我们使用assembly来制作一个ZIP发布包,assembly的配置如下:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"><id>package</id><formats><format>zip</format></formats><includeBaseDirectory>true</includeBaseDirectory><fileSets><fileSet><directory>${project.build.directory}/lib</directory><outputDirectory>\lib</outputDirectory></fileSet><fileSet><directory>${project.build.directory}</directory><outputDirectory>\</outputDirectory><includes><include>pkg-sb.jar</include></includes></fileSet></fileSets>
</assembly>

二、方案二(使用spring-boot-thin-maven-plugin插件)

这个插件功能比较强大,如果你的项目想要弄的高大上一点,可以选择这个插件,我们先看下效果。
首先在项目的pom.xml里面加入下面配置:

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><dependencies><dependency><groupId>org.springframework.boot.experimental</groupId><artifactId>spring-boot-thin-layout</artifactId><version>1.0.31.RELEASE</version></dependency></dependencies>
</plugin>
<plugin><groupId>org.springframework.boot.experimental</groupId><artifactId>spring-boot-thin-maven-plugin</artifactId><version>1.0.31.RELEASE</version><executions><execution><!-- Download the dependencies at build time --><id>resolve</id><goals><goal>resolve</goal></goals><inherited>false</inherited></execution></executions>
</plugin>

然后我们直接打包:

mvn clean -DskipTests package

查看打包后的结果:
在这里插入图片描述
这里我们看jar包只有12k,比方案一的还小,但是下面多了一个thin文件夹打开再看:
在这里插入图片描述
最下面的repository就是依赖的jar包。如果我们要运行这个jar,就需要运行thin/root下的Java包:

java -jar target/thin/root/pkg-sb.jar

运行结果:

2024-01-31 16:51:29.955  INFO 16785 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-01-31 16:51:29.955  INFO 16785 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 635 ms
2024-01-31 16:51:30.087  INFO 16785 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2024-01-31 16:51:30.229  INFO 16785 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 12345 (http) with context path ''
2024-01-31 16:51:30.232  INFO 16785 --- [           main] c.e.t.TestApplication                    : Started TestApplication in 1.411 seconds (JVM running for 4.141)

说明启动正常。

下面我们来讲下这个插件的强大之处。

1、spring-boot-thin-maven-plugin的原理其实就是把我们项目中的所有依赖当成转换成maven的本地库

2、如果目标机上安装了maven环境,我们可以直接来运行jar包,这是这个jar会自动启动maven来下载我们项目中需要的jar依赖包。你可以使用调试模式来启动jar,然后观察他的启动过程:

调试模式启动:

java -jar -Dthin.debug=true pkg-sb.jar

然后运行情况如下:

[root@localhost test]# java -jar -Dthin.debug=true pkg-sb.jar 
Cached launcher found: /root/.m2/repository
Using launcher: /root/.m2/repository/org/springframework/boot/experimental/spring-boot-thin-launcher/1.0.31.RELEASE/spring-boot-thin-launcher-1.0.31.RELEASE-exec.jar
131, 2024 5:02:20 下午 org.springframework.boot.loader.thin.ThinJarLauncher launch
信息: Version: 1.0.31.RELEASE
131, 2024 5:02:20 下午 org.springframework.boot.loader.thin.PathResolver resolve
信息: Extracting dependencies from: jar:file:/root/test/pkg-sb.jar!/, with profiles []
131, 2024 5:02:20 下午 org.springframework.boot.loader.thin.PathResolver loadProperties
信息: Searching for properties in: jar:file:/root/test/pkg-sb.jar!/
131, 2024 5:02:20 下午 org.springframework.boot.loader.thin.PathResolver loadProperties
信息: Searching for properties in: classpath:/
131, 2024 5:02:20 下午 org.springframework.boot.loader.thin.PathResolver loadProperties
信息: Searching for properties in: file:./
131, 2024 5:02:20 下午 org.springframework.boot.loader.thin.PathResolver extract
信息: Extracting dependencies from: URL [jar:file:/root/test/pkg-sb.jar!/META-INF/maven/org.example/test-sb-lib/pom.xml], with profiles []
131, 2024 5:02:21 下午 org.springframework.boot.loader.thin.MavenSettingsReader loadSettings
信息: No settings found at: /root/.m2/settings.xml
131, 2024 5:02:22 下午 org.springframework.boot.loader.thin.DependencyResolver dependencies
信息: Computing dependencies from pom and properties
131, 2024 5:03:11 下午 org.springframework.boot.loader.thin.DependencyResolver dependencies
信息: Resolved: org.springframework.boot:spring-boot-starter-web:2.2.5.RELEASE=/root/.m2/repository/org/springframework/boot/spring-boot-starter-web/2.2.5.RELEASE/spring-boot-starter-web-2.2.5.RELEASE.jar
131, 2024 5:03:11 下午 org.springframework.boot.loader.thin.DependencyResolver dependencies
信息: Resolved: org.springframework.boot:spring-boot-starter:2.2.5.RELEASE=/root/.m2/repository/org/springframework/boot/spring-boot-starter/2.2.5.RELEASE/spring-boot-starter-2.2.5.RELEASE.jar
131, 2024 5:03:11 下午 org.springframework.boot.loader.thin.DependencyResolver dependencies

这里他自动去下载了我们项目依赖的jar包并自动存放到${user.home}/.m2 下面,

3、我们可以手动指定依赖库的位置,启动命令如下:

java -jar -Dthin.debug=true -Dthin.root=. pkg-sb.jar 

这样他会启动maven把依赖库下载到我当前的目录下

4、还可以手动指定去下载依赖库的maven仓库地址,命令如下:

java -jar -Dthin.debug=true -Dthin.root=. -Dthin.repo=http://192.168.101.170:8081/repository/maven-public pkg-sb.jar 

这里我们使用了前面我们自己搭建的私有库,因此我们能很好的去控制项目的运行。

5、也可以采用离线模式去运行,这就需要我们要把打包后产生的依赖一起进行打包,这种方式和方案一的模式一样,但是这种对目标机就没有maven环境的依赖,我们再使用assembly来制作一个ZIP的发布包:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"><id>package</id><formats><format>zip</format></formats><includeBaseDirectory>true</includeBaseDirectory><fileSets><fileSet><directory>${project.build.directory}/thin/</directory><outputDirectory>\</outputDirectory></fileSet></fileSets>
</assembly>

6、spring-boot-thin-maven-plugin的更多用法,大家可以参照官网,点击这里


总结

1、以上给大家分享了2中瘦身方案,反正各自都有一定的缺点和优点,大家根据实际情况进行选择

2、方案一比较传统,整个过程中规中矩,没什么亮点,但实用性很强,缺点就是如果有新增依赖,在更新的时候就需要更新lib下的jar包,需要把新增的加入进去。

3、方案二很有创意,而且功能很强大,能玩出很多姿势来,如果采用离线模式也就和方案一没区别,采用在线模式缺点就是要依赖maven环境,但是也可以将maven和项目整个打包,然后编写脚本来实现自带maven环境。大家可以自己去尝试。

4、这两种方式都能实现对springboot项目的瘦身处理,对更新来说方便很多。

5、如果有自己的私有库,我们可以把项目进行分模块化处理,核心业务用一个单独的jar来实现,这样方案二能利用maven实现优雅更新

6、虽然有的同学会想到利用docker来运行,对更新来说也很方便,其实方式二也将maven环境打入docker镜像,然后利用在线模式来运行,这样可以大大减少docker镜像的大小,后面的章节我们可以继续来研究

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

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

相关文章

大数据本地环境搭建03-Spark搭建

需要提前部署好 Zookeeper/Hadoop/Hive 环境 1 Local模式 1.1 上传压缩包 下载链接 链接&#xff1a;https://pan.baidu.com/s/1rLq39ddxh7np7JKiuRAhDA?pwde20h 提取码&#xff1a;e20h 将spark-3.1.2-bin-hadoop3.2.tar.gz压缩包到node1下的/export/server目录 1.2 解压压…

两个重要极限【高数笔记】

【第一个&#xff1a;lim &#xff08;sinx / x&#xff09; 1, x -- > 0】 1.本质&#xff1a; lim &#xff08;sin‘&#xff1f;’ / ‘&#xff1f;’&#xff09; 1, ‘&#xff1f;’ -- > 0&#xff1b;保证‘&#xff1f;’ -- > 0,与趋向无关 2.例题&#x…

【ELK】logstash快速入门

1.概述 1.1.什么是logstash&#xff1f; 之前我们聊了es&#xff0c;并且用docker搭建了一个eskibana的环境。es目前最普遍的用法是用来存储日志的&#xff0c;然后结合kibana对日志做一些可视化的工作。既然要收集日志&#xff0c;就面临着一个问题&#xff1a; 各个系统的…

口味多样的碱水贝果面包,香气饱满松松软软

这两天在吃一款碱趣贝果面包&#xff0c;感觉味道很不错&#xff0c;它是一种加热一下就可以吃的手工面包&#xff0c;口感十分独特。这款面包有着清香有韧性的表皮&#xff0c;里面松软可口&#xff0c;加热后更是香气四溢。 除了标准的原味全麦之外&#xff0c;碱趣贝果面包还…

SpringBoot数据访问复习

SpringBoot数据访问复习 数据访问准备 引入jdbc所需要的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency> 原理分析 导入的启动器引入了两个…

【年度盛会征稿】第二届全国精准营养与生命健康创新大会(PNHIC 2024)

第二届全国精准营养与生命健康创新大会&#xff08;PNHIC 2024&#xff09; 【高层次专家齐聚交流&#xff0c;年度盛会&#xff01;】 近年来&#xff0c;人们对营养与健康愈加关注&#xff0c;精准营养学研究也成为一个快速发展的热点领域。“精准营养”研究借助多组学、可…

MySQL进阶45讲【13】为什么表数据删掉一半,表文件大小不变?

1 前言 有些小伙伴在删数据库数据时&#xff0c;会产生一个疑问&#xff0c;我的数据库占用空间大&#xff0c;我把一个最大的表删掉了一半的数据&#xff0c;怎么表文件的大小还是没变&#xff1f; 那么这篇文章&#xff0c;就介绍一下数据库表的空间回收&#xff0c;看看如…

如何把vue项目打包成桌面程序 electron-builder

引入 我们想要把我们写的vue项目,打包成桌面程序&#xff0c;我们需要使用electron-builder这个库 如何使用 首先添加打包工具 vue add electron-builder 选择最新版本 下载完毕 我们可以看到我们的package.json中多了几行 electron:build&#xff1a;打包我们的可执行程序 e…

在 iOS 上安装自定企业级应用

了解如何安装您的组织创建的自定应用并为其建立信任。 本文适用于学校、企业或其他组织的系统管理员。 您的组织可以使用 Apple Developer Enterprise Program 创建和分发企业专用的 iOS 应用&#xff0c;以供内部使用。您必须先针对这些应用建立信任后&#xff0c;才能将其打…

服装品牌如何利用数字化工具提升商品管理效率

随着科技的快速发展&#xff0c;数字化工具在商品管理中的应用越来越广泛。数字化工具不仅可以提高商品管理的效率&#xff0c;还可以帮助企业更好地满足客户需求&#xff0c;提升市场竞争力。本文将探讨如何利用数字化工具提升商品管理效率。 一、建立数字化管理系统 数字化…

备战蓝桥杯---搜索(应用基础1)

话不多说&#xff0c;直接看题&#xff1a; 显然&#xff0c;我们直接用深搜&#xff0c;我们可以先把空位用结构体存&#xff0c;然后打表存小方块&#xff0c;再用数组存行列。 下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int a[12][12];…

linux中的gdb调试

gdb是在程序运行的结果与预期不符合时&#xff0c;可以使用gdb进行调试 注意&#xff1a;使用gdb调试时要在编译上加-g参数 gcc -g -c hello.c 启动gdb调试&#xff1a; gdb file 对gdb进行调试 设置运行参数&#xff1a; set args 可指定运行参数 show args 可以查…

uniapp基于Android的环境保护环保商城系统生活垃圾分类 小程序_rsj68

本环境保护生活App是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户和管理员这两者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能优化界面…

WPF布局面板

StackPanel StackPanel 是一种常用的布局控件,可以支持水平或垂直排列,但不会换行。当子元素添加到 StackPanel 中时,它们将按照添加的顺序依次排列。默认情况下,StackPanel 的排列方向是垂直的,即子元素将从上到下依次排列。可以使用 Orientation 属性更改排列方向。可以…

Apache POI与easyExcel:Excel文件导入导出的技术深度分析

在处理Excel文件时&#xff0c;Java开发者经常会面临多种选择&#xff0c;其中Apache POI和easyExcel是两个非常受欢迎的选择。这两个库都提供了强大的Excel文件处理功能&#xff0c;但在性能、内存使用、API设计以及扩展性方面有所不同。本文将深入分析Apache POI和easyExcel在…

Unity 通过配置文件生成代码

文章目录 示例1&#xff1a;基于ScriptableObject的配置生成类示例2&#xff1a;预制体路径列表生成加载代码示例3&#xff1a;动画剪辑生成动画控制器片段示例4&#xff1a;Excel配置表生成序列化类示例5&#xff1a;UI元素及其事件绑定生成代码 在Unity编辑器模式下&#xff…

电商实战练习部署

基于阿里云ECS服务器实战部署 1 单架构部署方案 1.1 部署流程 传统方案 基于docker 2 持续集成&持续部署方案 随着软件开发复杂度的不断提高&#xff0c;团队开发成员间如何更好地协同工作以确保软件 开发的质量已经慢慢成为开发过程中不可回避的问题。互联网软件的开发…

护眼台灯有aaa级吗为什么?一文揭晓护眼台灯照度等级分类

尽管台灯是一个很成熟的行业&#xff0c;但却时不时也会冒出一些新的概念和名词。比如近些年的”AAA级”台灯&#xff0c;很频繁地出现在我们视野中。给人感觉似乎带”AAA级”的台灯&#xff0c;要比其他的强上一头。那到底是真是假呢&#xff1f; 一、护眼台灯有AAA级吗&…

字节跳动推出MagicVideo-V2超高清文生视频模型

&#x1f989; AI新闻 &#x1f680; 字节跳动推出MagicVideo-V2超高清文生视频模型 摘要&#xff1a;MagicVideo-V2是由字节跳动的研究人员开发的一种超高清文生视频模型。该模型在视频的高清度、润滑度、连贯性、文本语义还原等方面表现出色&#xff0c;比目前主流的文生视…

leetcode 1.两数之和(C++)DAY1(待补充哈希表法)

文章目录 1.题目描述示例提示 2.解答思路3.实现代码结果4.总结 1.题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&…