前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Springboot的jar包分离

Springboot的jar包分离

作者头像
时光潜流
发布于 2022-12-26 11:56:17
发布于 2022-12-26 11:56:17
1.3K00
代码可运行
举报
文章被收录于专栏:博客专栏博客专栏
运行总次数:0
代码可运行

    上一次实现了前后端分包,每次可以单独管理前端或者后端程序的上线,从而方便维护。但是随着例行维护发现,springboot每次整体打包,都要往服务器传递近百来兆的一个大的jar包,非常费力,所以就想着进行一个简单的优化,从而使每次上传的量尽量小。

    造成jar包非常大的原因其实很简单,通过解压jar包,查看结构就会发现,占用大头在第三方jar包,比如说腾讯云的java-sdk约莫有二十多M等。而实际情况是:我的个人主页模块基本定型了,依赖基本不会产生大的变动了,所以想要将这个jar包分离,单独放在一个lib文件夹下,每次只需要打包核心代码上传即可!

基本方式概述

    使用spring-boot-maven-plugin插件来进行管理,相应的理论基础可以参考官方介绍:Spring Boot Maven Plugin Documentation。里面有着关于这个插件的详细描述与使用方式。

    大致上可以总结几个要点:

1. 如果依赖设置parent为spring-boot-starter-parent,那么默认配置了goal为repackage,无需再手动配置。

  不过有时候可能会使用自己的parent或者个人喜欢明确的引入依赖,那么可能需要自己配置goal。

  设置为repackage可以打包成可执行的jar包或者war。如果没有main函数,后续设置layout=NONE也可以实现打包不可执行的jar包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2. devtools默认是自动排除在外的,当然也可以使用excludeDevtools配置来显示的去除。若要再war包生效,需要设置spring-boot-devtools的optional为true或者scope为    provided。这个工具可以重写manifest文件,管理了启动类和主类集。如果不奏效需要再springboot插件配置,而非jar插件。MAIN-CLASS取决于layout的设置。

  其中layout有以下几种选择:

    - JAR :可执行jar

    - WAR :可执行war

    - ZIP :类似于jar,不过使用PropertiesLauncher。是DIR的别称。

    - NONE:打包依赖和资源,但是没有打包一个引导加载器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>${start.class}</mainClass>
                <layout>ZIP</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

3. excludes和includes可以去除或者加入指定依赖到最终包中。不配置默认加入全部。

4.可以自定义layer,可以拆分到不同layers中,具体的可以参考官方文档的配置介绍。

实际应用

    有了理论基础,那么接下来就是付诸实践。首先我们需要以ZIP作为layout,让生成的配置mainclass为PropertiesLauncher。然后把所有包都排除:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>top.dreamcenter.dreamcenter.DreamcenterApplication</mainClass>
                    <layout>ZIP</layout>
                    <includes>
                        <include>
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>

    等到clean+package后,我们查看MANIFEST文件的配置查看是否生效。确实生效了。

    接着,我们把第三方jar包全部放到lib中,之后使用 java -jar -Dloader.path=lib xxx.jar 执行测试:

    结果发现报错了,结果百度,发现BASE64Encoder已经在java后续版本取消掉了,而我开发默认的JAVA_HOME是16版本的,所以运行会找不到这个类。

    在命令行输入set path=... 临时改变path,然后测试运行成功了!

    要能使用-Dloader.path要先让layout设置为ZIP哦!     最后,来看一下最终jar包大小:

NICE!甚至不到1M,以后传输上来说就方便不少啦!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot Jar包瘦身 - 跟大文件说再见!
SpringBoot部署起来配置非常少,如果服务器部署在公司内网,上传速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼、就是 编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud等),那就更大了。这个时候如果想要对线上运行工程有一些微调,则非常痛苦
云扬四海
2019/08/06
1.9K0
Spring Boot Maven Plugin打包异常及三种解决方法:Unable to find main class
【背景】spring-boot项目,打包成可执行jar,项目内有两个带有main方法的类并且都使用了@SpringBootApplication注解(或者另一种情形:你有两个main方法并且所在类都没有使用@SpringBootApplication注解),pom.xml如下 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <v
庞小明
2018/07/06
16.2K0
记录一次将Springboot打包瘦身
瘦身: thinBody 又称 "减肥"、"减重"。 就是合理、科学的减轻自身重量的。SpringBoot 应用瘦身顾名思议:就是将 SpringBoot 应用打包的 jar 利用合理的方式、方法减小体积。
JokerDJ
2023/11/27
6110
Spring Boot 项目瘦身指南,瘦到不可思议!
版权声明:本文为CSDN博主「yjgithub」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/yjgithub/article/details/80475521
开发者技术前线
2020/11/24
2040
Spring Boot 项目瘦身指南,瘦到不可思议!
Spring Boot 项目瘦身指南,瘦到不可思议!
SpringBoot 部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼:编译出来的 Jar 包很大,如果工程引入了许多开源组件(SpringCloud 等),那就更大了。
好好学java
2020/09/24
3570
Spring Boot 项目瘦身指南,瘦到不可思议!
Spring Boot - 瘦身大作战:优雅应对Spring Boot Fat Jar
通过启动参数loader.path配置外置依赖包的加载路径。 项目成功启动,说明我们配置的外包依赖包加载生效了
小小工匠
2023/11/26
9310
Spring Boot - 瘦身大作战:优雅应对Spring Boot Fat Jar
SpringBoot 2.0 开发案例之百倍级减肥瘦身之旅
为了存我的小黄图,最近在做一款图床服务,集成了各种第三方云存储服务,目前正在内部测试阶段。项目是以Jar的形式运行在腾讯云上,不要问我为什么使用腾讯云了,因为阿里云老用户和狗不得入内。
小柒2012
2019/12/05
7340
jeecgBoot框架 实现瘦身打包 lib和程序分开
经过我翻越github的Issues记录时 发现有这个问题 并经过我的尝试解决方法有如下
@依然范特西
2022/12/12
1.1K0
jeecgBoot框架 实现瘦身打包 lib和程序分开
SpringBoot项目多模块打包
直接开始吧 先对整个项目的父工程(root)进行clean和install 中途可能会遇到clean失败的情况,大概率是循环依赖的问题,根据报错内容自己好好检查某个模块的依赖问题 在公共模块的pom文件底部加入核心代码 <build> <plugins> <!-- 资源文件拷贝插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifa
shaoshaossm
2023/03/15
1.2K0
SpringBoot项目多模块打包
springboot maven项目引入并打包本地JAR
之前在 springboot maven项目打包SAPJCO3.JAR一文中介绍的打包方案会导致jar包改名,这里介绍另一种方法。
路过君
2020/09/14
1.2K0
SpringBoot实现lib包与代码本体分离
最近在编写自己项目的时候,发现部署的过程中,打的Jar包过大,导致传输到服务器上的时候速度有点缓慢。
半月无霜
2025/01/19
2310
聊聊springboot项目引用第三平台私有jar踩到的坑
最近和朋友闲聊,他说他遇到一个问题,他引用了第三方公司私有API包,他在本地项目启动没问题,打包运行却找不到这个API包,于是我就问他怎么引用这个jar。
lyb-geek
2022/01/07
3400
聊聊springboot项目引用第三平台私有jar踩到的坑
现在的工程结构能满足你的需求吗?
创建单模块工程相信很多人都手到擒来。但如果项目很大,功能很多,你还能继续使用单模块工程吗?项目过大,结构肯定也越来越复杂这时候如果你继续使用单模块工程,进展就会遇到各种问题。同时维护起来也是很麻烦的事情。这个时候你就可以考虑将功能细化,使用多模块工程来替代单模块了。
田维常
2019/09/12
1K0
现在的工程结构能满足你的需求吗?
SpringBoot-打包&部署
SpringBoot 项目支持两种打包方式,一种是 WAR 包,然后在 Tomcat 上部署运行,一种是 JAR 包,内置了 Tomcat,可以直接运行。
每周聚焦
2025/02/11
2830
SpringBoot-打包&部署
Spring Boot 打包插件,真是太有用了!
Spring Boot 对 Maven 一直支持很友好,栈长也一直在用 Maven 进行依赖和项目管理,那么今天就讲一下这个插件的作用,非常有用!
Java技术栈
2020/05/06
2.7K0
Spring Boot 打包插件,真是太有用了!
Springboot打包 依赖包到单独文件夹
在使用Springboot开发项目时,打包好的jar包是可以直接运行的,但是通常情况下,这个jar都会很大,因为它默认打包了所有的依赖jar包。此时,就可以通过maven-dependency-plugin插件将依赖包复制到独立的文件夹,在启动jar包的时候引用即可。
I Teach You 我教你
2023/07/18
1.2K0
Maven对Springboot项目配置文件、依赖分离打包
Springboot项目有多种打包方法,可以直接打成一个完整jar包,由于spring cloud微服务的流行,这种方法也越来越多,当然这种方法也很简单。但是单个项目中实际部署需要修改某些参数配置,如果如此重复打包那就太麻烦了!
Java开发者之家
2021/06/17
2.8K0
springboot2.0 打jar没有主清单 异常 springboot打jar包先加入依赖jar包运行报没有主清单异常原因
springboot打jar包先加入依赖 <plugin> <groupId>org.apache.maven.plugins</groupId> <arti
用户5899361
2020/12/07
5860
springboot2.0 打jar没有主清单 异常 springboot打jar包先加入依赖jar包运行报没有主清单异常原因
SpringBoot打包资源文件
一、配置pom文件进行jar包瘦身 1、排除SpringBoot jar包中的其他依赖包 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layout>ZIP</layout> <includes> <!-- jar中不包含其他依赖包
ruochen
2021/12/16
2.2K0
【工具系列】常用maven命令介绍
一般情况下是用不到这些命令的,因为 idea 集成 maven 后,可以直接在 idea 进行 maven 的操作,只是最近不是换了 mvnd 了嘛,所以需要使用到 maven 命令,发现很多都忘记了,在这里重新记录下。
框架师
2022/03/08
1.1K0
推荐阅读
相关推荐
SpringBoot Jar包瘦身 - 跟大文件说再见!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验