版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SpringBoot部署Jar文件,瘦身优化指南!概要说明瘦身打怪升级过程Level0:常规的FatJar构建Level1:常见的依赖jar分离构建方式Level2:合并所有模块依赖jar到同一个lib目录Level3:支持system引入的非官方的三方依赖组件最终实现效果特别提示大家好,我是架构师!本文截取代码片段来自于对应的完整示例源码工程:/xautlx/package-optimize-demo相关代码和配置均实际执行测试过(基于OpenJDK8环境,其余JDK未做验证,如-Djava.ext.dirs=lib等参数和JDK版本有关,注意对应调整),如在验证过程发现有任何问题可Issue反馈以便及时更正,感谢支持!概要说明随着SpringBoot的流行,大家体验到只需构建输出一个jar文件,然后只需一个java-jar命令就能部署运行应用的爽快。常见一些单体应用随着项目规模的扩展单个jar文件的大小越来越大,动辄两三百MB。如果再引入微服务架构,动辄一二十个微服务,所有模块jar加起来整个系统光部署文件就一两个GB。一个系统一旦上线运行,无论新需求迭代还是Bug修复,免不了需要做部署更新,尤其对于一些交付类型项目,首次部署或异地更新,动不动就需要传输几百MB或几个GB的部署文件,确实是一个让人头疼的问题。可以想象一下,线上系统发现一个紧急严重Bug捅到了主管那里,交代马上紧急修复解决,研发同事火速分析排查分分钟搞定提交代码并完成构建打包并交付给运维。过一会领导着急上火来过问问题更新解决了吗?运维只能很尴尬的回答:还没呢,部署包文件比较大,正在上传有点慢...一听领导就火了,就改了几行代码,部署更新为啥要上传几百MB的文件呢?难道没有办法优化一下吗?遇到这样的情况,建议你往下看,或许能找到你想要的答案。本文内容包括:如何把一两百MB的单一SpringBootjar文件,分离为依赖组件lib目录和一个业务jar来进行部署,优化单个jar文件大小到一两百KB。。如何把一二十个微服务高度重叠的依赖组件合并到单一lib目录和多个一两百KB的业务jar来进行部署,优化整个项目部署文件大小从一两个GB大小到两三百MB。本文内容不包括:不包括进行SpringBoot配置文件分离相关,一般简单采用通过指定activeprofile从外部yaml配置文件覆盖jar文件中配置即可或是采用Nacos等配置服务模式。不包括Maven最佳实践用法,列入样例工程中出于演示方便的考虑比如把一些本应放到各个Boot模块特定的配置声明直接放到顶层的parent中定义,请注意按实际情况优化调整使用。不包括可执行jar的运行模式支持参考,文中实现方式主要面向java-jar运行模式。瘦身打怪升级过程Level0:常规的FatJar构建参考项目目录:package-optimize-level0主要配置:<build>
<finalName>${project.artifactId}finalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>配置输出:cd
package-optimize-level0
mvn
clean
install
ls
-lh
package-optimize-app1/target/package-optimize-app1.jar
-rw-r--r--
1
lixia
wheel
16M
Feb
24
21:06
package-optimize-app1/target/package-optimize-app1.jar
java
-jar
package-optimize-app1/target/package-optimize-app1.jar重点说明:(当前演示应用仅依赖了spring-boot-starter-web极少组件,所有构建输出只有十来MB)实际情况单一构建根据项目依赖组件量输出jar一般在几十MB到一两百MB甚至更大。假如有十来个微服务需要部署,那就意味着需要传输一两个GB的文件,耗时可想而知。就算是单一更新个别微服务也需要传输一两百MB。Level1:常见的依赖jar分离构建方式参考项目目录:package-optimize-level1关解决问题:降低单个微服务jar的文件大小,以便部署过程秒传文件。搜索公众号顶级架构师回复关键字“offer”,获取一份惊喜礼包。主要配置:重点配置说明请详见如下注释说明:<build>
<finalName>${project.artifactId}finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-dependency-pluginartifactId>
<executions>
<execution>
<id>copy-dependenciesid>
<phase>packagephase>
<goals>
<goal>copy-dependenciesgoal>
goals>
<configuration>
<outputDirectory>${project.build.directory}/liboutputDirectory>
<excludeTransitive>falseexcludeTransitive>
<stripVersion>falsestripVersion>
<silent>truesilent>
configuration>
execution>
executions>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<includes>
<include>
<groupId>nullgroupId>
<artifactId>nullartifactId>
include>
includes>
<layout>ZIPlayout>
configuration>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>配置输出:cd
package-optimize-level1
mvn
clean
install
ls
-lh
package-optimize-app1/target/package-optimize-app1.jar
-rw-r--r--
1
lixia
wheel
149K
Feb
24
20:56
package-optimize-app1/target/package-optimize-app1.jar
java
-jar
-Djava.ext.dirs=lib
package-optimize-app1/target/package-optimize-app1.jar实现效果:单一构建根据项目依赖组件量输出jar一般仅有一两百KB,基本可以做到秒传。这个是网上可见最常见的优化方案,还值得继续深入:假如有十来个微服务,每个服务一个jar和一个lib目录文件,首次部署也差不多需要传输一两个GB文件。Level2:合并所有模块依赖jar到同一个lib目录参考项目目录:package-optimize-level2解决问题:合并所有模块依赖jar到同一个lib目录,一般由于各模块项目依赖jar重叠程度很高,合并所有服务部署文件总计大小基本也就两三百MB但是如果采用-Djava.ext.dirs=lib加载所有jar到每个JVM,一来每个JVM都完整加载了所有jar耗费资源,二来各微服务组件版本不同会出现版本冲突问题主要配置:重点配置说明请详见如下注释说明:<build>
<finalName>${project.artifactId}finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<configuration>
<archive>
<manifest>
<addClasspath>trueaddClasspath>
<classpathPrefix>lib/classpathPrefix>
<useUniqueVersions>falseuseUniqueVersions>
manifest>
archive>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-dependency-pluginartifactId>
<executions>
<execution>
<id>copy-dependenciesid>
<phase>packagephase>
<goals>
<goal>copy-dependenciesgoal>
goals>
<configuration>
<outputDirectory>${boot-jar-output}/liboutputDirectory>
<excludeTransitive>falseexcludeTransitive>
<stripVersion>falsestripVersion>
<silent>falsesilent>
configuration>
execution>
executions>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<includes>
<include>
<groupId>nullgroupId>
<artifactId>nullartifactId>
include>
includes>
<layout>ZIPlayout>
<outputDirectory>${boot-jar-output}outputDirectory>
configuration>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>所有lib目录文件及各微服务构建jar聚合到devops公共目录。微服务jar文件中的META-INFO/MANIFEST文件中会生成根据模块依赖组件列表的Class-Path属性,从而避免了不同版本jar:Class-Path:
lib/spring-boot-starter-web-2.4.3.jar
lib/spring-boot-starte
r-2.4.3.jar
lib/spring-boot-2.4.3.jar
lib/spring-boot-autoconfigure-2.4
.3.jar
lib/spring-boot-starter-logging-2.4.3.jar
lib/logback-classic-1.
2.3.jar
lib/logback-core-1.2.3.jar
lib/slf4j-api-1.7.30.jar
lib/log4j-t
o-slf4j-2.13.3.jar
lib/log4j-api-2.13.3.jar
lib/jul-to-slf4j-1.7.30.jar
lib/jakarta.annotation-api-1.3.5.jar
lib/spring-core-5.3.4.jar
lib/spr
ing-jcl-5.3.4.jar
lib/snakeyaml-1.27.jar
lib/spring-boot-starter-json-2
.4.3.jar
lib/jackson-databind-2.11.4.jar
lib/jackson-annotations-2.11.4
.jar
lib/jackson-core-2.11.4.jar
lib/jackson-datatype-jdk8-2.11.4.jar
l
ib/jackson-datatype-jsr310-2.11.4.jar
lib/jackson-module-parameter-name
s-2.11.4.jar
lib/spring-boot-starter-tomcat-2.4.3.jar
lib/tomcat-embed-
core-9.0.43.jar
lib/jakarta.el-3.0.3.jar
lib/tomcat-embed-websocket-9.0
.43.jar
lib/spring-web-5.3.4.jar
lib/spring-beans-5.3.4.jar
lib/spring-
webmvc-5.3.4.jar
lib/spring-aop-5.3.4.jar
lib/spring-context-5.3.4.jar
lib/spring-expression-5.3.4.jar配置输出:cd
package-optimize-level2
mvn
clean
install
ls
-lh
devops/
total
912
drwxr-xr-x
34
lixia
wheel
1.1K
Feb
24
22:27
lib
-rw-r--r--
1
lixia
wheel
150K
Feb
24
22:31
package-optimize-app1.jar
-rw-r--r--
1
lixia
wheel
149K
Feb
24
22:31
package-optimize-app2.jar
-rw-r--r--
1
lixia
wheel
149K
Feb
24
22:31
package-optimize-app3.jar
java
-jar
devops/package-optimize-app1.jar实现效果:启动过程不再需要-Djava.ext.dirs=lib参数定义。所有微服务jar引用所有项目合并依赖组件的公共目录,部署文件总计大小一般在两三百MB。通过定制每个微服务jar文件中的META-INFO/MANIFEST文件中的Class-Path明确指明依赖版本组件类,解决各微服务不同组件版本冲突问题。Level3:支持system引入的非官方的三方依赖组件参考项目目录:package-optimize-level3解决问题:有些非官方三方的诸如sdkjar,一种做法是提交到Maven本地私服中去引用,那和普通依赖jar处理相同;但是在没有maven私服的情况下,常见的简化做法都是直接在项目中放置依赖jar然后在pom中以systemscope方式定义。对于在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件,如果不做特殊处理META-INFO/MANIFEST中不会出现这些scope定义的组件,导致运行时类找不到。主要配置:重点配置说明请详见如下注释说明:搜索公众号后端架构师回复关键字“架构整洁”,获取一份惊喜礼包。<build>
<finalName>${project.artifactId}finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<configuration>
<archive>
<manifest>
<addClasspath>trueaddClasspath>
<classpathPrefix>lib/classpathPrefix>
<useUniqueVersions>falseuseUniqueVersions>
manifest>
<manifestEntries>
<Class-Path>${jar-manifestEntries-classpath}Class-Path>
manifestEntries>
archive>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-dependency-pluginartifactId>
<executions>
<execution>
<id>copy-dependenciesid>
<phase>packagephase>
<goals>
<goal>copy-dependenciesgoal>
goals>
<configuration>
<outputDirectory>${boot-jar-output}/liboutputDirectory>
<excludeTransitive>falseexcludeTransitive>
<stripVersion>falsestripVersion>
<silent>falsesilent>
configuration>
execution>
executions>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<includes>
<include>
<groupId>nullgroupId>
<artifactId>nullartifactId>
include>
includes>
<layout>ZIPlayout>
<outputDirectory>${boot-jar-output}outputDirectory>
configuration>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>子模块主要配置:
<properties>
<boot-jar-output>../devopsboot-jar-output>
<jar-manifestEntries-classpath>.
lib/hik-sdk-1.0.0.jarjar-manifestEntries-classpath>
properties>
<dependencies>
<dependency>
<groupId>com.hikgroupId>
<artifactId>hik-sdkartifactId>
<version>1.0.0version>
<scope>systemscope>
<systemPath>${project.basedir}/lib/hik-sdk-1.0.0.jarsystemPath>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>微服务输出jar文件中的META-INFO/MANIFEST文件中会生成根据模块依赖组件列表的Class-Path属性,最前面会追加jar-manifestEntries-classpath属性定义值:Class-Path:
.
lib/hik-sdk-1.0.0.jar
lib/spring-boot-starter-web-2.4.3.ja
r
lib/spring-boot-starter-2.4.3.jar
lib/spring-boot-2.4.3.jar
lib/sprin
g-boot-autoconfigure-2.4.3.jar
lib/spring-boot-starter-logging-2.4.3.ja
r
lib/logback-classic-1.2.3.jar
lib/logback-core-1.2.3.jar
lib/slf4j-ap
i-1.7.30.jar
lib/log4j-to-slf4j-2.13.3.jar
lib/log4j-api-2.13.3.jar
lib
/jul-to-slf4j-1.7.30.jar
lib/jakarta.annotation-api-1.3.5.jar
lib/sprin
g-core-5.3.4.jar
lib/spring-jcl-5.3.4.jar
lib/snakeyaml-1.2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学信息科技人教版(新教材)三年级全一册第8单元 守护在线安全 教学设计
- 《建筑结构健康智慧监测技术规范》
- Unit 5 Section B Vocabulary in use课件英语新教材人教版八年级下册
- 衣物晾晒防变形与阳光直射利弊
- 2026交通银行深圳分行社会招聘笔试参考题库及答案解析
- 2026江苏常熟农村商业银行股份有限公司招聘笔试备考试题及答案解析
- 2026浙江苍南县人才科创有限公司招聘主办会计笔试备考试题及答案解析
- 国家管网集团工程技术创新有限公司(国家管网集团造价管理中心)2026届春季高校毕业生招聘考试模拟试题及答案解析
- 2026中国南水北调集团综合服务有限公司北京供应链管理分公司春季招聘9人考试备考试题及答案解析
- 2026年及未来5年市场数据中国肉类零食行业市场发展数据监测及投资潜力预测报告
- 2026广岩国际投资有限责任公司招聘14人备考题库附答案详解(综合卷)
- 2026年市场监管法律法规综合题库及答案
- 2025湖北武汉市江岸区公立学校招聘3人笔试历年参考题库附带答案详解
- 2026年广东学位英语考试试题及答案
- 品管部日常工作制度
- 智慧树 创造性思维与创新方法 章节测试答案
- 月亮是从哪里来的
- 2026年创新药挂网采购随时申报自主定价直接挂网流程
- 2026年商丘职业技术学院单招职业技能测试题库及答案详解(名师系列)
- 沐浴露课件教学课件
- 机械厂卫生管理制度
评论
0/150
提交评论