点击关注公众号,实用技术文章及时了解

   作者:集成显卡

   blog.csdn.net/ssrc0604hx/article/details/54175027

背景

随着Spring Boot的流行,越来越多开发者选择使用Spring Boot来发布Web应用。不同于传统的War包发布,Spring Boot把整个项目打包成一个可运行的Jar包(即所谓的Flat Jar),导致了这个Jar包很大(通常有40M+)。如今迭代发布时常有的事情,每次都上传一个如此庞大的文件,会浪费很多时间。

下面就以一个小项目为例,简述小弟所用的瘦身方案。当然如果是内网发布或者你用的宽带异常给力,瘦身就没有多大意义了。

实践

项目简介

新建一个练习用的项目,其结构如下

  • ht-cdn存放的是静态资源(如第三方js、css、images等)

  • ht-domain项目中的数据实体定义

  • ht-repository数据层接口及实现

  • ht-service业务逻辑接口及实现

  • ht-ui-webWeb管理

其中ht-ui-web依赖于ht-domainht-repositoryht-service,实现了一个简单的GetMapping。

接着打包项目,整个jar包24M这样

瘦身准备

首先我们要对Jar包有一个初步认识,它的内部结构如下

example.jar|+-META-INF|  +-MANIFEST.MF+-org|  +-springframework|     +-boot|        +-loader|           +-<spring boot loader classes>+-BOOT-INF+-classes|  +-mycompany|     +-project|        +-YourClasses.class+-lib+-dependency1.jar+-dependency2.jar

运行该Jar时默认从BOOT-INF/classes加载class,从BOOT-INF/lib加载所依赖的Jar包。如果想要加入外部的依赖Jar,可以通过设置环境变量LOADER_PATH来实现。

如此一来,就可以确认我们的思路了:

  1. 把那些不变的依赖Jar包(比如spring依赖、数据库Driver等,这些在不升级版本的情况下是不会更新的)从Flat Jar中抽离到单独的目录,如libs

  2. 在启动Jar时,设置LOADER_PATH使用上一步的libs

这样,我们最终打包的jar包体积就大大减少,每次迭代后只需要更新这个精简版的Jar即可。

具体步骤

打包时瘦身

通常我们是用spring-boot-maven-plugin进行打包,通过阅读文档发现可以通过配置使得该插件在打包时忽略特定的依赖,文档在spring-boot-maven-plugin

首先备份一下原先的依赖:编译打包成Flat Jar,然后将BOOT-INF/lib下的除去ht-*相关的jar文件全部解压出来,另存到libs目录下。

接着修改pom.xml配置如下

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><layout>ZIP</layout><!--去除在生产环境中不变的依赖--><excludeGroupIds>org.springframework.boot,org.springframework,org.springframework.data,org.mongodb,com.github.0604hx,com.fasterxml.jackson.core,commons-beanutils,commons-codec,org.apache.commons,org.apache.tomcat.embed,org.hibernate,org.slf4j,com.jayway,org.jboss,com.alibaba,com.fasterxml,commons-collections,ch.qos.logback,org.scala-lang,org.yaml,org.jboss.logging,javax.validation,nz.net.ultraq.thymeleaf,org.thymeleaf,ognl,org.unbescape,org.javassist</excludeGroupIds></configuration></plugin></plugins>
</build>

此时打包好的ht-ui-web.jar只有117kb这样

BOOT-INF/lib下只有ht相关的jar

但是由于没有其他依赖,ht-ui-web.jar是不能如期运行起来的

java -jar ht-ui-web-1.0.jar
Exception in thread "main" java.lang.reflect.InvocationTargetExceptionat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:521)
Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplicationat com.nerve.huotong.web.WebApplication.main(WebApplication.java:21)... 8 more
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplicationat java.net.URLClassLoader.findClass(Unknown Source)at java.lang.ClassLoader.loadClass(Unknown Source)at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:94)at java.lang.ClassLoader.loadClass(Unknown Source)... 9 more

至此我们要设置LOADER_PATH,如下

java -Dloader.path="libs/" -jar ht-ui-web.jar

便可以看到熟悉的Spring Boot 启动信息了。

继续瘦身

上面的项目结构介绍提到了ht-cdn,我是把前端用到的库都放在这里。然后单独启动一个Web Application。其他项目需要用到静态资源就直接使用。

还有另外一个做法是,把resources/public直接丢到libs下(就是跟上一步剥离出来的jar包放在一起),结构如下:

这样也是可以的(不过要注意不能跟真实项目中自己写的静态资源重名)。

结语

经过上面的瘦身,每次迭代开发开的Jar包就显得苗条多了。

插些题外话

Spring Boot 中的banner.txt

banner是spring boot 应用启动时打印在控制台的彩蛋信息,默认是这样的

.   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::        (v1.4.3.RELEASE)

想要修改这个文本的话,只需要在resources下新建banner.txt即可。

这里可以自定义banner:

http://patorjk.com/software/taag/

推荐好文

>>【练手项目】基于SpringBoot的ERP系统,自带进销存+财务+生产功能

>>分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!

>>能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

SpringBoot迭代发布下的Jar瘦身实践相关推荐

  1. 京东商城iOS客户端安装包瘦身实践

    一.概述 随着业务的快速增加,商城app的大小也在迅速增加,一度超过了300M.安装包大小的不断增加对app下载成本,推广效率产生了比较大的影响.从2018年9月份我们对商城app开始了为期二期的专项 ...

  2. Android-APK瘦身实践

    [个人总结]APK瘦身实践 因为推广的需要,公司需要把APK的大小再"减小"一下,4M以内! 当达到4M以内之后,公司建议说,能否再压压?2M如何? 瘦身前 因为平时就考虑到大小的 ...

  3. newduba首页怎么去掉_京喜小程序首页瘦身实践

    前言 在 web 开发场景,减少代码体积虽然是性能优化的一个方向,还没到锱铢必较的程度.但是在小程序场景,由于代码包上传阶段限制了主包 2M 和总包 16M(近期微信官方正在内测将总包上限调整至 20 ...

  4. Android-APK瘦身实践:二次瘦身如何再减少大小?,2021年安卓开发进阶课程

    support库可能还算好的,就怕有些库引用了一些大图而不自知,可以在/build/intermediates/exploded-aar/下的各个aar库的res目录查找检验. apk减小了18k. ...

  5. iOS App 瘦身实践总结

    文章最后有我的 12 条小总结. 原文始发地址:我的 GitHub 写在前面 最近公司需求不多,正好研究一下 App 瘦身的办法,写了点小总结. 如果你不知道下面几个问题,不妨可以看看文章. 使用 . ...

  6. Unity3D_NGUI_安卓APK安装包瘦身实践

    减包瘦身是个精细活.本文整理了0907版本操作过程,以备日后参考. 经过一番折腾,各位攻城狮的努力,美术设计师的支持,策划爷的理解,UI资源(图集.字体.单局外模型贴图)从45.4MB减少到24.5M ...

  7. maven jar包瘦身

    springCloud项目系统瘦身记录 第一章 **尝试spring-boot-thin-launcher** Spring Boot项目可以通过spring-boot-maven-plugin插件打 ...

  8. SpringBoot-Maven打包压缩瘦身

    SpringBoot-Maven打包压缩瘦身 一.Spring Boot 可执行 jar 分析 1.1 打包 1.2 两种 jar 的比较 1.3 一次打包两个 jar 二.SpringBoot迭代发 ...

  9. 我的Android进阶之旅------gt;Android APP终极瘦身指南

    首先声明,下面文字转载于: APK瘦身实践 http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ APP ...

最新文章

  1. MFC调用CFileDialog之后目录居然会改变,调试了好久终于发现是这个问题
  2. 亿级流量架构之服务器扩容思路及问题分析
  3. 二分于最大流之间的关系
  4. 这个回答让我错失offer!offer拿到手软
  5. 黑客攻防技术宝典Web实战篇第2版—第11章 攻击应用程序逻辑
  6. 处理The Network Adapter could not establish the connection
  7. Android入门笔记08
  8. 泰安出差,使用产品有所感触
  9. Codejock Suite Pro _16.3.X.国内最新版来了!
  10. MATLAB图形用户界面设计(GUI)
  11. 大三学生关于实习和考研的安排
  12. MediBang Paint Pro 漫画及插画工作软件
  13. 计算机考试试题的问题,与计算机等级考试试题有关的几个问题
  14. 云计算的概念、原理和关键技术
  15. 2023北京理工大学考研介绍
  16. 怎么对document.write写出来的内容调整对齐方式_干不过写PPT的?麦肯锡老阿姨教你4招...
  17. 第13章 网络设备文件管理1-(H3CNE)
  18. 自动车速度闭环控制器设计
  19. Python爬取、分析全球最美Top100女神榜单的数据
  20. 20个CAD绘图技巧问答

热门文章

  1. 中国联通联合中国电信在福建开通首个共享5G基站
  2. 《巴伦周刊》评选出全球最佳30位CEO:马化腾再次上榜
  3. 新iPhone全贴合保护壳曝光:“浴霸”造型恐已成定局
  4. 2018安卓应用安全白皮书:超98%安卓应用存有安全风险
  5. 5月21日伦敦见!荣耀20官宣:P30“同款”ToF镜头加持?
  6. 拒绝PPT手机?魅族首款真无孔手机将开启众筹
  7. 最好用的虚拟机软件----VMware详细图文教程
  8. 计算机科学与技术文理兼收吗,哪些专业是文理兼收的专业?
  9. Unity3D研究院之获取摄像机的视口区域(转)
  10. oracle唯一索引能删除吗,Oracle:ora-02429:无法用于删除强制唯一/主键的索引 解决...