转载

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~~~ 当然,项目中的代码一定达不到这个数量级
file
我们可以看一下jar的目录结构,主要关注下lib目录
file
可以看到,打包出的jar中,主要占用空间的都是写第三方的jar

为了方便,本例将在外部进行打包,原项目中的所有需要的文件,将都会copy到外部文件夹,下文将简称外部文件夹
外部文件夹:C:\Users\rxxzy\Desktop\blog

1、首先要将项目依赖的所有jar包提取出来,提取的方式有两种:

第一种:将上一步打包出的jar文件解压出来,然后将BOOT-INF下的lib文件夹复制到外部文件夹里
第二种:在对应项目下(本例拿blog-web模块做演示)执行mvn dependency:copy-dependencies

注:第二种方式可能会有些问题,需要我们优先处理一下。如下,执行命令
file
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.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<mainClass>com.zyd.blog.BlogWebApplicationmainClass>

<layout>ZIPlayout>
<includes>
<include>
<groupId>com.zydgroupId>
<artifactId>blog-coreartifactId>
include>
<include>
<groupId>com.zydgroupId>
<artifactId>blog-spiderartifactId>
include>
includes>
configuration>
<executions>
<execution>
<goals>
<goal>repackagegoal>
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] ------------------------------------------------------------------------

file
如上图所示,最终的项目jar文件只有2M多!!!
3、最后就是如何运行这个jar文件了
将blog-web-2.0.1.Beta.jar复制到外部文件夹下,和lib目录同级
file
然后执行以下命令

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 star是一款简洁美观、自适应的Java博客系统。使用springboot开发,前端使用Bootstrap。支持移动端自适应,配有完备的前台和后台管理功能。

  1. 支持wangEditor和Markdown两种富文本编辑器,可以自行选择
  2. 在线申请友情链接,无需站长手动配置,只需申请方添加完站长的连接后自行申请即可
  3. 支持将文件提交到百度站长收录平台,加快百度引擎的收录
  4. 自研评论系统
  5. 后台配备完善的权限管理
  6. 自带robots、sitemap等seo模板
  7. 集成七牛云,实现文件云存储
  8. 系统配置支持快速配置。可通过后台手动修改诸如域名信息、SEO优化、赞赏码、七牛云以及更新维护通知等。
  9. 管理员可向在线的用户发送==实时消息==(需用户授权 - 基于websocket实现,具体参考DBlog建站之Websocket的使用)
  10. 新增“博客迁移”功能,支持一键同步imooc、csdn或者iteye上的文章

后期更会添加诸如下列等功能

页面缓存
数据统计
cc防护
集成阿里云OSS
配套小程序

正文到此结束