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()方法并最终调用程序方法。它有三个子类,即JarLauncherWarLauncherPropertiesLauncher



  子类目的是从包引入的jar包或war包中加载资源。其中JarLauncherWarLauncher加载资源的路径是固定的,即为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)的更多相关文章

  1. SpringBoot瘦身

    1.介绍 本教程中,我们将研究如何使用spring-boot-thin-launcher项目来将Spring Boot项目瘦身. Spring Boot出了名的把所有依赖打包成单个可执行的Fat JA ...

  2. 【转】SpringBoot系列之—瘦身部署

    一.前言 SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼: 编译出来的 Jar 包很大,如果工程引入了许多开源组件 ...

  3. SpringBoot-Maven打包压缩瘦身

    SpringBoot-Maven打包压缩瘦身 一.Spring Boot 可执行 jar 分析 1.1 打包 1.2 两种 jar 的比较 1.3 一次打包两个 jar 二.SpringBoot迭代发 ...

  4. SpringBoot Jar包瘦身 - 跟大文件说再见!

    前言 SpringBoot部署起来配置非常少,如果服务器部署在公司内网,上传速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼.就是 编译出来的 Jar 包很大,如果工程引入了许多开 ...

  5. springboot项目打包瘦身

    默认情况下,Spring Boot 项目发布时会将项目代码和项目的所有依赖文件一起打成一个可执行的 jar 包.但如果项目的依赖包很多,那么这个文件就会非常大.这样每次即使只改动一点东西,就需要将整个 ...

  6. Excel催化剂开源第6波-Clickonce部署之自动升级瘦身之术

    Clickonce无痛自动更新是我最喜欢使用VSTO开发并Clickonce部署的特性之一,但这个自动更新,通常会更新整个程序文件,包含所有的引用dll和一些资源文件等. 一般来说,我们更新的都是主程 ...

  7. springboot 打包插件去除jar包瘦身

    1.pom文件配置 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>s ...

  8. Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置

    springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很 ...

  9. 如何给你的Android 安装文件(APK)瘦身

    如何给你的Android 安装文件(APK)瘦身 本文翻译自:Putting Your APKs on Diet           原作者:Cyril Mottier Android的apk文件越来 ...

随机推荐

  1. [LeetCode题解]19. 删除链表的倒数第N个节点 | 双指针 + 一次遍历

    解题思路 双指针:第一个指针先走 n 步,然后两个指针同时走. 这里要注意当链表长度<=n,要删除头节点. 代码 /** * Definition for singly-linked list. ...

  2. 从 Webpack 到 Snowpack, 编译速度提升十倍以上——TRPG Engine迁移小记

    动机 TRPG Engine经过长久以来的迭代,项目已经显得非常臃肿了.数分钟的全量编译, 每次按下保存都会触发一次10s到1m不等的增量编译让我苦不堪言, 庞大的依赖使其每一次编译都会涉及很多文件和 ...

  3. 网络拓扑实例之VRRP负载分担(四)

    组网图形  VRRP负载分担简介 负载分担方式是指多台设备同时承担业务,因此负载分担方式需要两个或者两个以上的虚拟路由器,每个虚拟路由器都包括一个Master路由器和若干个Backup路由器,各虚拟路 ...

  4. phpmyadmin反序列化漏洞(WooYun-2016-199433)

    简介 环境复现:https://github.com/vulhub/vulhub 线上平台:榆林学院内可使用协会内部的网络安全实验平台 phpMyAdmin是一套开源的.基于Web的MySQL数据库管 ...

  5. CA证书与https讲解

    最近面试问到这个问题,之前了解过但答的不是很好,再补充补充一下https方面的知识. 备注:以下非原创文章. CA证书与https讲解 1.什么是CA证书. ◇ 普通的介绍信 想必大伙儿都听说过介绍信 ...

  6. 解决adober reader已停止工作的问题

    公司电脑出现打开pdf阅读器后没到1分钟就闪退,应该是adobe做了什么正版审核策略,让安装了这个软件的电脑自动连接到adobe服务器验证导致. 解决方法:在C:\Windows\System32\d ...

  7. mock模拟接口返回数据

    mock,是python中模拟接口返回数据 1.安装 pip install mock import unittest from mock import Mock def add(a,b): pass ...

  8. python中操作数据库

    python中要操作数据库,要使用该数据库在python中对应的驱动库,本文介绍python操作mysql数据库 1.首先安装pymysql 2.导入库 3.建立连接 4.建立游标 5.发起请求 6. ...

  9. Leetcode1 - 10

    1. 两数之和 class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { ...

  10. 【Updating】汇编语言学习记录02

    换码指令.字符的输出 前置知识: XLAT 指令:将BX指定的缓冲区中.AL指定的位移处的一个字节数据取出赋给AL,实际相当于(AL) = (DS:(BX+AL)).注意,不是单纯地赋予AL+BX,而 ...