原创

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.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] ------------------------------------------------------------------------

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
配套小程序

欢迎关注,欢迎star

我的公众号 我的小程序
正文到此结束