搞了一个迭代发布下SpringBoot Jar瘦身方案,老大给我打了个A+
上一篇:一个90后员工猝死的全过程
0、2T架构师学习资料干货分享
作者:集成显卡
来源:https://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-domain、ht-repository、ht-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
你还有什么想要补充的吗?
看完这篇文章,你有什么收获?欢迎在留言区与10w+Java开发者一起讨论~
最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理和创作的 Java 系列教程非常齐全。
推荐阅读
1、2019 年 9 月全国程序员工资统计,你是什么水平?
2、如何才能成为优秀的架构师?
3、从零开始搭建创业公司后台技术栈
4、程序员一般可以从什么平台接私活?
5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...
6、滴滴业务中台构建实践,首次曝光
7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事
8、15张图看懂瞎忙和高效的区别!
搞了一个迭代发布下SpringBoot Jar瘦身方案,老大给我打了个A+相关推荐
- SpringBoot迭代发布下的Jar瘦身实践
点击关注公众号,实用技术文章及时了解 作者:集成显卡 blog.csdn.net/ssrc0604hx/article/details/54175027 背景 随着Spring Boot的 ...
- Linux下 SpringBoot jar项目后台运行、查看、停用
运行java jar: nohup java -jar **-0.0.1-SNAPSHOT.jar & 查看进程: 采用top或者ps aux命令.一般 如果后台是springboot,jar ...
- SpringBoot快速瘦身,快速部署jar
文章目录 本片要点 正常打包部署的方式 瘦身部署 拿到lib目录 改变默认的打包方式 再次打包 上传lib和jar 源码下载 参考阅读 本片要点 介绍如何为jar包瘦身,方便部署. 正常打包部署的方式 ...
- gradle构建springboot项目瘦身,外部依赖jar的终极方法
1.为什么瘦身? 阿里云部署,每次改了代码,上传80多M到服务器,血与泪,如果把jar单独上传的话,那么影响就很小了,只需要传对应的jar上去就可以保证项目正常运行 2.方法build.gradle示 ...
- 基于clang插件的一种iOS包大小瘦身方案
引子 \ 包瘦身,包瘦身,包瘦身,重要的事情说三遍. \ 最近公司一款iOS APP(本文只讨论使用Objective C开发的iOS安装包)一直在瘦身,我们团队的APP也愈发庞大了.而要解决这个问题 ...
- linux系统下springboot jar方式启动后允许后台运行
2019独角兽企业重金招聘Python工程师标准>>> springboot 以jar方式打包运行时,ssh客户端或者xshell工具关闭后,程序会自动关闭! 解决方法:编写sh脚本 ...
- 一个三线程序员的2020年,CSDN 10 万粉里程碑达成,SpringBoot项目瘦身指南
先说说我身边的几个朋友吧,他们无一例外,都是通过写作建立起来的影响力. 第一个,我想到的就是纯洁的微笑.我在写作方面之所以能突飞猛进,除了源于我自身的努力,微笑哥在初期给了我不少无私的帮助. 微笑哥是 ...
- SpringBoot 项目瘦身指南,瘦到不可思议!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:yjgithub blog.csdn.net/yjgithu ...
- SpringBoot项目瘦身指南,大厂如何面试看出你的水平
其实初级开发升级到高级开发还是相对容易的,只要主观上态度上端正,别固步自封,然后到处看些资料多和人交流即可.如果进互联网公司,在大压力环境下,身边大牛再多些,升级过程会更加顺利. ####2 高级程序 ...
- springBoot打包瘦身
springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很 ...
最新文章
- EVEREST Corporate Edition 使用SQL保存数据的简易方法
- 阿里巴巴云原生应用安全防护实践与 OpenKruise 的新领域
- 产品说,我只需要一个有亿点复杂的查询界面
- 很喜欢VS.NET 2003对条件编译的代码提示
- 还在头痛被黑客劫持? 五步帮你摆脱烦恼!
- linux下面修改默认的shell
- 深度学习笔记_基本概念_神经网络中的epoch、batch_size和iteration
- Web Service-第一篇什么是Web Service
- springboot的配置文件加载的顺序,以及在不同位置配置下,加载的顺序
- url中文传参乱码问题
- 即时网络通讯系统的设计与实现(QQ)
- 《勿忘初心,勿忘前行》——2016年度总结
- 怎么把图片做成pdf文件?
- SQL-2008函数大全
- java咖啡是研磨的吗_咖啡的研磨程度,真的很重要吗?
- 作为成年人的基本道德之一,就是不…
- windows server 2008r2 更新失败解决方案
- Virustotal——上传样本保存扫描结果
- 计算机应用数字多媒体,多媒体技术基础计算机应用专业系列教材 主讲:薛文涛【精品-ppt】.ppt...
- 工作中常用的Linux命令(持续更新)