SpringBoot瘦身部署(15.9 MB - 92.3 KB)
1. 简介
SpringBoot项目部署虽然简单,但是经常因为修改了少量代码而需要重新打包上传服务器重新部署,而公网服务器的网速受限,可能整个项目的代码文件仅仅只有1-2MB甚至更少,但是需要上传几十MB甚至更大的jar包而受限整体的部署速度。
项目基本稳定后,lib引入的jar很少再有更新了,假如可以将项目所需的lib放到外部路径,仅仅打包代码文件,可将包大小缩小到几十倍甚至几百倍。
2. 正常打包
- 创建项目

- 修改pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.c3stones</groupId>
<artifactId>spring-boot-reduce</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-reduce</name>
<description>Spring Boot Reduce Weight</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 编写启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 启动类
*
* @author CL
*
*/
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 编写示例接口
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 示例Controller
*
* @author CL
*
*/
@RestController
public class DemoController {
/**
* 示例接口
*
* @return
*/
@RequestMapping(value = "/get")
public String get() {
return "demo";
}
}
- 项目打包
#进入项目根路径
mvn clean install
- 进入Maven仓库,查看信息

可以看到,整个包大小为15.9MB。使用解压工具打开:

可以看到,lib占用15.85MB。 - 启动项目,并请求示例接口
java -jar spring-boot-reduce-0.0.1-SNAPSHOT.jar
curl http://127.0.0.1:8080/get
3. 瘦身部署
- 从之前的包中拷贝jar
解压之前打的包,根据路径:spring-boot-reduce-0.0.1-SNAPSHOT.jar\BOOT-INF拷贝lib文件夹。 - 修改pom文件(build节点)
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.c3stones</groupId>
<artifactId>spring-boot-reduce</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-reduce</name>
<description>Spring Boot Reduce Weight</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
</project>
layout必须为ZIP。includes中配置需要包含的jar,nothing表示不包含任何jar,因此将全部jar包放到外部路径。
- 进入项目根路径,再次打包
mvn clean install
- 进入Maven仓库,查看信息

可以看到,整个包大小为92.3KB。使用解压工具打开:

可以看到,已经没有lib文件夹了。 - 启动项目,并请求示例接口
将之前拷贝的lib文件夹和下工程包放到统一文件夹。
java -Dloader.path=lib -jar spring-boot-reduce-0.0.1-SNAPSHOT.jar
curl http://127.0.0.1:8080/get
loader.path配置外部包的路径,可配置相对路径或绝对路径。
项目可以正常启动,成功瘦身。
4. 原理分析
首先查看正常打包文件夹META-INF下的MANIFEST.MF文件:
Manifest-Version: 1.0
Implementation-Title: spring-boot-reduce
Implementation-Version: 0.0.1-SNAPSHOT
Built-By: Administrator
Implementation-Vendor-Id: com.c3stones
Spring-Boot-Version: 2.1.4.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.c3stones.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_102
Implementation-URL: https://projects.spring.io/spring-boot/#/spring-bo
ot-starter-parent/spring-boot-reduce
再查看瘦身打包后文件夹META-INF下的MANIFEST.MF文件:
Manifest-Version: 1.0
Implementation-Title: spring-boot-reduce
Implementation-Version: 0.0.1-SNAPSHOT
Built-By: Administrator
Implementation-Vendor-Id: com.c3stones
Spring-Boot-Version: 2.1.4.RELEASE
Main-Class: org.springframework.boot.loader.PropertiesLauncher
Start-Class: com.c3stones.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_102
Implementation-URL: https://projects.spring.io/spring-boot/#/spring-bo
ot-starter-parent/spring-boot-reduce
注意两个文件中Main-Class的值。
在瘦身打包配置中,layout属性值必须为ZIP,特此说明layout属性值:
- JAR,即通常的可执行jar
Main-Class: org.springframework.boot.loader.JarLauncher - WAR,即通常的可执行war,需要的servlet容器依赖
Main-Class: org.springframework.boot.loader.warLauncher - ZIP,即DIR,类似于JAR
Main-Class: org.springframework.boot.loader.PropertiesLauncher
通过查看Spring Boot官网总结,org.springframework.boot.loader.Launcher是作为一个可执行的jar的主入口点一个特殊的启动类。它是Main-Class的实际值,用于设置适当URLClassLoader的main()方法并最终调用程序方法。它有三个子类,即JarLauncher,WarLauncher和PropertiesLauncher。

子类目的是从包引入的jar包或war包中加载资源。其中JarLauncher和WarLauncher加载资源的路径是固定的,即为BOOT-INF/lib和WEB-INF/lib。如果需要加载自定义位置的资源包,则需要使用PropertiesLauncher,它默认的加载位置是BOOT-INF/lib,但可以使用loader.path来指定外部资源包的路径。PropertiesLauncher具有可以通过外部属性(系统属性、环境变量、启动清单(MANIFEST.MF文件)、loader.properties)启用的一些特殊功能,具体请查阅SpringBoot官网:Launching Executable Jars
SpringBoot瘦身部署(15.9 MB - 92.3 KB)的更多相关文章
- SpringBoot瘦身
1.介绍 本教程中,我们将研究如何使用spring-boot-thin-launcher项目来将Spring Boot项目瘦身. Spring Boot出了名的把所有依赖打包成单个可执行的Fat JA ...
- 【转】SpringBoot系列之—瘦身部署
一.前言 SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼: 编译出来的 Jar 包很大,如果工程引入了许多开源组件 ...
- SpringBoot-Maven打包压缩瘦身
SpringBoot-Maven打包压缩瘦身 一.Spring Boot 可执行 jar 分析 1.1 打包 1.2 两种 jar 的比较 1.3 一次打包两个 jar 二.SpringBoot迭代发 ...
- SpringBoot Jar包瘦身 - 跟大文件说再见!
前言 SpringBoot部署起来配置非常少,如果服务器部署在公司内网,上传速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼.就是 编译出来的 Jar 包很大,如果工程引入了许多开 ...
- springboot项目打包瘦身
默认情况下,Spring Boot 项目发布时会将项目代码和项目的所有依赖文件一起打成一个可执行的 jar 包.但如果项目的依赖包很多,那么这个文件就会非常大.这样每次即使只改动一点东西,就需要将整个 ...
- Excel催化剂开源第6波-Clickonce部署之自动升级瘦身之术
Clickonce无痛自动更新是我最喜欢使用VSTO开发并Clickonce部署的特性之一,但这个自动更新,通常会更新整个程序文件,包含所有的引用dll和一些资源文件等. 一般来说,我们更新的都是主程 ...
- springboot 打包插件去除jar包瘦身
1.pom文件配置 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>s ...
- Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置
springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很 ...
- 如何给你的Android 安装文件(APK)瘦身
如何给你的Android 安装文件(APK)瘦身 本文翻译自:Putting Your APKs on Diet 原作者:Cyril Mottier Android的apk文件越来 ...
随机推荐
- ctf-工具-binwalk
binwalk在玩杂项时是个不可缺的工具.1.最简单的,在玩隐写时,首先可以用它来找到其中的字符串例如:在铁人三项,东北赛区个人赛中,有一道题它直接给了一个文件,没有后缀,不知道是什么文件先binwa ...
- C# 中的本地函数
今天我们来聊一聊 C# 中的本地函数.本地函数是从 C# 7.0 开始引入,并在 C# 8.0 和 C# 9.0 中加以完善的. 引入本地函数的原因 我们来看一下微软 C# 语言首席设计师 Mads ...
- netsniff使用
1 netsniff安装与使用 首先直接下载源码包进行部署 安装一些前置包(安装完成的自动忽略) sudo apt install pkg-config sudo apt install libcli ...
- 怎么用MindManager制作议论文思维导图
大家都写过作文吧,做小学到高考到大学,这是谁也摆脱不了的,但是大家写作文会提前把自己的思路整理出来吗?让自己行文更为顺畅,作文更为流利吗?特别是关于议论文,一直是高考写作的一个重点篇目,写好议论文,就 ...
- Mac电脑疑似中毒该怎么应对处理
Mac电脑作为相对封闭的一个系统,它会中毒吗?如果有一天Mac电脑产生了疑似中毒或者遭到恶意不知名攻击的现象,那又应该如何从容应对呢?这些问题都是小编使用Mac系统一段时间后产生的疑惑,通过一番搜索研 ...
- MyBatis的一二级缓存
一级缓存 一级缓存默认是开启的,生命周期和SqlSession相同.一个会话中每次执行一个查询操作时,会先查询二级缓存,如果二级缓存没查到或者二级缓存未开启就会从一级缓存中查询,如果一级缓存也未查到就 ...
- 牛客 2020.10.20 TG 前两题
T1 GCD 数学水题... 对于每个数,如果这个数有两个及以上的质因数的话,它所有除 \(1\) 之外的因数求 \(GCD\) 的值一定为 \(1\).那么判断是否是质数或质数的次方即可(质数除 \ ...
- CentOS7.X 下安装MySQL8.0(附文件)
这是64位的安装包.如果需要32位的可以去官网下载哦.步骤一样 1 获取安装资源包 mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar 链接: https://pan.b ...
- 【译】用 React 和 D3 创建图表
本文翻译自:https://dzone.com/articles/charts-with-modern-react-and-d3 本文将介绍如何利用 D3JS 和 ReactJS 来创建基础图表. R ...
- java基础之一:基本数据类型
在java中有基本数据类型和引用类型两种,今天来说下基本数据类型和其对应的包装类的之间的关系. 一.概述 java中的基本数据类型有八种,分别是char.byte.short.int.long.flo ...