前言
工作中终于遇到比较好玩的东西了,最近被给了一个需求,将pom中的第三方依赖移到外面而不直接打包进jar包 。那直接打包有什么问题吗?下面我们一起来看看 。
【SpringBoot:拒绝大文件,夏天到了,来给jar包瘦个身】
直接打包的缺点
首先宣读一下直接打包的“三大罪”!!!
- 如果项目依赖的第三方包非常多,那么最终提供出去的jar包将非常大,上传所需时间也非常多
- 如果依赖的第三方包版本升级了,想要直接用最新的版本就只能修改版本然后重新打包了
- 如果依赖的某个第三方包有安全漏洞,那么必须换版本,换版本的话就必须重新进行打包 。就暴露出fastjson的安全漏洞,版本小于1.2.68存在反序列化的漏洞
但是如果我们打包时不将依赖的第三方包打包进去,那么最后的jar包不仅小,而且当依赖的第三方版本发生变化时也不需要重新打包了,心动不如行动,现在对自己的项目手起刀落改造一下吧
pom文件的修改
在maven项目中配置打包相关的东西是在pom文件中的,一般情况下,在pom中如果不需要将第三方包排除在外,都是这样配置的:
<build><finalName>authsdk-service-${version}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><finalName>authsdk-service-${version}</finalName></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.Apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><encoding>${project.build.sourceEncoding}</encoding><source>8</source><target>8</target></configuration></plugin></plugins></build>
看一下打包后jar包的大小文章插图
大小为27515KB,可以发现jar包的内容中,在BOOT-INF/lib目录下都是依赖的第三方包
文章插图
发现了吗?真相只有一个!导致打包出来的jar包大的原因就是这些依赖的第三方包 。
那既然问题原因出现了,就可以开始对症下药解决问题了,我们对pom文件做一个改动,让它不将第三方依赖打包进去,修改后的配置:
<build><finalName>authsdk-service-${version}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 此处为项目的主类路径 --><mainClass>com.xxx.authsdk.AuthsdkServiceApplication</mainClass><layout>ZIP</layout><includes><include><!-- 排除所有的第三方依赖的Jar包 --><groupId>nothing</groupId><artifactId>nothing</artifactId></include></includes></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build>
修改完后重新打包文章插图
jar包大小变为1702KB,瘦身效果很明显!!!相比之前直接变小了94%,同时查看jar包内容/BOOT-INF下没有lib文件夹了,确实没有将第三方依赖打包进去 。
那到这里是不是已经完事了?不,其实还可以做得更好!因为打包时没有将第三方依赖打包进去,因此启动的时候需要指定第三方依赖的位置程序才能正常启动,这就要求我们必须从最开始未瘦身的jar包中将lib文件夹给抠出来,但这样的做法就稍微有点low了 。maven提供了一种显示指定lib文件夹保存路径的方法,在之前的pom文件基础上加下如下配置
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><goals><goal>copy-dependencies</goal></goals><configuration><!-- 复制第三方 jar 到指定路径下 下 --><outputDirectory>G:/JAVA工程/authorize_service/lib</outputDirectory><excludeScope>provided</excludeScope><!-- 配置的作用:跳过复制第三方依赖这一步 。这是在首次上传第三方依赖到服务器之后,启用这个选项,可以不用在打包时重复复制,节省时间 。--><skip>false</skip></configuration></execution></executions></plugin>
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Springboot 动态设置注解参数值
- 聊一聊 SpringBoot 中配置加载优先级?
- springboot三种拦截器
- SpringBoot集成多数据源
- 辛弃疾上书朝廷为何被朝廷拒绝,辛弃疾初来南方任职,对朝廷的怯懦和畏缩并不了解
- SpringBoot整合RabbitMQ四种交换机类型详解
- 程序员标配Springboot!终于有人把SpringBoot讲的通俗易懂了
- 天玑8000|LCD党难以抗拒的旗舰!OPPO K10上手:1999元不二之选
- 求职|35岁以上不好找工作?研究生招工被拒,年龄过大不好“画饼充饥”
- SpringBoot事件监听:应用监听接口的使用