搞了一个迭代发布下SpringBoot Jar瘦身方案,老大给我打了个A+互联网架构师共 5314字,需浏览 11分钟 ·2021-09-01 15:30 上一篇:一个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中抽离到单独的目录,如libs2. 在启动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.jarException in thread "main" java.lang.reflect.InvocationTargetException at 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/SpringApplication at com.nerve.huotong.web.WebApplication.main(WebApplication.java:21) ... 8 moreCaused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication at 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.txtbanner是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张图看懂瞎忙和高效的区别! 浏览 34点赞 评论 收藏 分享 手机扫一扫分享分享 举报 评论图片表情视频评价全部评论推荐 SpringBoot迭代发布下的Jar瘦身实践JAVA葵花宝典0SpringBoot 部署 Jar 文件,瘦身优化指南 !Java技术前线0SpringBoot 部署 Jar 文件,瘦身优化指南 !小哈学Java0SpringBoot 部署 Jar 文件,瘦身优化指南 !公众号程序猿DD0不错!SpringBoot发布Jar包优化瘦身指南!Java中文社群0发给我爱发给我爱0谈谈 iOS 包瘦身方案iOS开发0给我一个爸1988年的布拉格,大提琴手路卡(ZdenekSverák饰)丢掉了乐团的工作多时,只能靠为殡仪馆伴奏和修补墓碑为生。这位大龄单身汉在女人面前颇有魅力,他也乐此不疲,但困窘的生活让他不得不违背初衷,与给我一个吻给我一个吻0给我一个拥抱给我一个拥抱0点赞 评论 收藏 分享 手机扫一扫分享分享 举报