SpringBoot开发系列之打包瘦身
一、前言
随着微服务的流行,越来越多的开发者开始使用springboot开发web应用。springboot不同于普通web应用的最大特点就是:只需要打包成一个可执行的jar即可运行。万事万物都有两面性,springboot在带来便捷的同时,随着项目的发展最终导致jar包越来越庞大, 而如此庞大的jar文件也让应用部署时异常困难,更谈不上快速迭代了。本文就介绍如何优化springboot打包,减少最终jar包的体积。
注:本文不讨论单体应用和微服务之间的优缺点,只针对如何优化springboot打包,部分同学不可较真。
二、实践
本文以DBlog作为演示项目
优化前
在优化前,先看一下未优化的情况下打包项目后的的结果
在DBlog项目根目录下执行sh build.sh dev
编译打包项目
$ cd xx/DBlog
$ sh build.sh
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: E:\server\apache-maven-3.5.4-local
Java version: 1.8.0_181, vendor: Oracle Corporation, runtime: E:\server\Java\jdk1.8.0_181\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
[DEBUG] Created new class realm maven.api
...
[INFO] Layout: JAR
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] blog 2.0.1.Beta .................................... SUCCESS [ 0.494 s]
[INFO] blog-spider ........................................ SUCCESS [ 5.147 s]
[INFO] blog-core .......................................... SUCCESS [ 10.631 s]
[INFO] blog-web ........................................... SUCCESS [ 10.410 s]
[INFO] blog-admin 2.0.1.Beta .............................. SUCCESS [ 8.647 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 36.020 s
[INFO] Finished at: 2018-08-31T16:02:39+08:00
[INFO] ------------------------------------------------------------------------
如下图,blog-web打包后的文件居然能达到60+M~~~ 当然,项目中的代码一定达不到这个数量级
我们可以看一下jar的目录结构,主要关注下lib目录
可以看到,打包出的jar中,主要占用空间的都是写第三方的jar
开始优化
为了方便,本例将在外部进行打包,原项目中的所有需要的文件,将都会copy到外部文件夹,下文将简称外部文件夹
外部文件夹:C:\Users\rxxzy\Desktop\blog
1、首先要将项目依赖的所有jar包提取出来,提取的方式有两种:
第一种:将上一步打包出的jar文件解压出来,然后将
BOOT-INF
下的lib文件夹复制到外部文件夹里
第二种:在对应项目下(本例拿blog-web模块做演示)执行mvn dependency:copy-dependencies
注:第二种方式可能会有些问题,需要我们优先处理一下。如下,执行命令
Maven报错,提示找不到 com.zyd:blog-web:jar:2.0.1.Beta
依赖。在DBlog根目录下执行命令
mvn -Dmaven.test.skip=true install
$ mvn -Dmaven.test.skip=true install
[INFO] Scanning for projects...
...
--- maven-install-plugin:2.5.2:install (default-install) @ blog-admin ---
[INFO] Installing D:\project\zyd-project\▒▒Դ▒▒Ŀ\Gitee\DBlog\blog-admin\target\blog-admin-2.0.1.Beta.jar to D:\mvn-repo\local\com\zyd\blog-admin\2.0.1.Beta\blog-admin-2.0.1.Beta.jar
[INFO] Installing D:\project\zyd-project\▒▒Դ▒▒Ŀ\Gitee\DBlog\blog-admin\pom.xml to D:\mvn-repo\local\com\zyd\blog-admin\2.0.1.Beta\blog-admin-2.0.1.Beta.pom
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] blog 2.0.1.Beta .................................... SUCCESS [ 0.530 s]
[INFO] blog-spider ........................................ SUCCESS [ 2.015 s]
[INFO] blog-core .......................................... SUCCESS [ 1.031 s]
[INFO] blog-web ........................................... SUCCESS [ 4.774 s]
[INFO] blog-admin 2.0.1.Beta .............................. SUCCESS [ 1.811 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.731 s
[INFO] Finished at: 2018-08-31T16:31:16+08:00
[INFO] ------------------------------------------------------------------------
再次按照第二种方式执行mvn dependency:copy-dependencies
命令即可,如下
$ mvn dependency:copy-dependencies
[INFO] Scanning for projects...
...
[INFO] Copying xmlunit-core-2.5.1.jar to D:\project\zyd-project\▒▒Դ▒▒Ŀ\Gitee\DBlog\blog-web\target\dependency\xmlunit-core-2.5.1.jar
[INFO] Copying spring-boot-test-2.0.1.RELEASE.jar to D:\project\zyd-project\▒▒Դ▒▒Ŀ\Gitee\DBlog\blog-web\target\dependency\spring-boot-test-2.0.1.RELEASE.jar
[INFO] Copying spring-boot-2.0.1.RELEASE.jar to D:\project\zyd-project\▒▒Դ▒▒Ŀ\Gitee\DBlog\blog-web\target\dependency\spring-boot-2.0.1.RELEASE.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.292 s
[INFO] Finished at: 2018-08-31T16:34:35+08:00
[INFO] ------------------------------------------------------------------------
通过命令可以看到,已经将blog-web
依赖的jar包copy到了blog-web\target\dependency
目录下,我们只需要将该目录下的所有jar包,复制到外部文件夹下的lib目录中即可。
注:这些jar包中包含DBlog依赖的blog-spider.jar和blog-core.jar,需要将这两个文件删除掉。因为这两个文件是本项目自身的依赖模块,经常会变动,为了方便需要每次都打包最新的。
2、修改pom.xml文件,过滤掉第三方jar
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.zyd.blog.BlogWebApplication</mainClass>
<!-- layout 必须是 ZIP,includes为需要打包到项目jar中的内容,其余都忽略掉 -->
<layout>ZIP</layout>
<includes>
<include>
<groupId>com.zyd</groupId>
<artifactId>blog-core</artifactId>
</include>
<include>
<groupId>com.zyd</groupId>
<artifactId>blog-spider</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
修改完成后,再次在DBlog项目根目录下执行sh build.sh dev
编译打包项目,或者在blog-web模块下执行mvn -Dmaven.test.skip=true clean package
$ mvn -Dmaven.test.skip=true clean package
[INFO] Scanning for projects...
...
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ blog-web ---
[INFO] Building jar: D:\project\zyd-project\▒▒Դ▒▒Ŀ\Gitee\DBlog\blog-web\target\blog-web-2.0.1.Beta.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.0.1.RELEASE:repackage (default) @ blog-web ---
[INFO] Layout: ZIP
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.019 s
[INFO] Finished at: 2018-08-31T16:50:25+08:00
[INFO] ------------------------------------------------------------------------
如上图所示,最终的项目jar文件只有2M多!!!
3、最后就是如何运行这个jar文件了
将blog-web-2.0.1.Beta.jar复制到外部文件夹下,和lib目录同级
然后执行以下命令
java -Dloader.path=lib -jar blog-web-2.0.1.Beta.jar
...
2018-08-31 16:55:04 [org.springframework.scheduling.quartz.SchedulerFactoryBean:687] INFO - Starting Quartz Scheduler now
2018-08-31 16:55:04 [org.quartz.core.QuartzScheduler:547] INFO - Scheduler quartzScheduler_$_NON_CLUSTERED started.
2018-08-31 16:55:04 [org.apache.juli.logging.DirectJDKLog:180] INFO - Starting ProtocolHandler ["http-nio-8443"]
2018-08-31 16:55:04 [org.apache.juli.logging.DirectJDKLog:180] INFO - Using a shared selector for servlet write/read
2018-08-31 16:55:05 [org.springframework.boot.web.embedded.tomcat.TomcatWebServer:206] INFO - Tomcat started on port(s): 8443 (http) with context path ''
2018-08-31 16:55:05 [org.springframework.boot.StartupInfoLogger:59] INFO - Started BlogWebApplication in 17.749 seconds (JVM running for 18.941)
2018-08-31 16:55:05 [com.zyd.blog.framework.runner.BlogApplicationRunner:46] INFO - ▒▒▒Ͳ▒▒▒▒▒ɣ▒▒▒ǰʱ▒䣺2018-08-31 16:55:05
服务启动成功!浏览器访问http://localhost:8443/
三、参考
https://www.cnblogs.com/yueli/p/7810796.html
https://www.jianshu.com/p/ed34ba4a5c12
四、编后语
DBlog 是一款简洁美观、自适应的Java博客系统。使用springboot开发,前端使用Bootstrap。支持移动端自适应,配有完备的前台和后台管理功能。
- 支持wangEditor和Markdown两种富文本编辑器,可以自行选择
- 在线申请友情链接,无需站长手动配置,只需申请方添加完站长的连接后自行申请即可
- 支持将文件提交到百度站长收录平台,加快百度引擎的收录
- 自研评论系统
- 后台配备完善的权限管理
- 自带robots、sitemap等seo模板
- 集成七牛云,实现文件云存储
- 系统配置支持快速配置。可通过后台手动修改诸如域名信息、SEO优化、赞赏码、七牛云以及更新维护通知等。
- 管理员可向在线的用户发送==实时消息==(需用户授权 - 基于websocket实现,具体参考DBlog建站之Websocket的使用)
- 新增“博客迁移”功能,支持一键同步imooc、csdn或者iteye上的文章
后期更会添加诸如下列等功能
页面缓存
数据统计
cc防护
集成阿里云OSS
配套小程序
欢迎关注,欢迎star
我的公众号 | 我的小程序 |
---|---|
- 本文标签: Spring Boot Maven OneBlog 码一码
- 本文链接: https://zhyd.me/article/118
- 版权声明: 本文由张亚东原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权