SpringBoot打的jar包瘦身

news2024/11/24 8:26:05

文章目录

  • 正常打包
  • 瘦身方法一:Dloader.path指定依赖包位置
  • 瘦身方法二:配置文件里指定依赖包位置

正常打包

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

瘦身方法一:Dloader.path指定依赖包位置

  1. 修改maven打包参数
<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>
                    <include>
                        <groupId>com.huacloud.tax.rpc</groupId>
                        <artifactId>common</artifactId>
                    </include>
                </includes>
           </configuration>
       </plugin>
   </plugins>
</build>
  • layout
    用来配置可执行jar包中Main-Class的类型,一定要设置为 ZIP,使打的jar包中的Main-Class为PropertiesLauncher 。
  • includes
    将需要保留的jar包,按照groupId和artifactId(注意两个都是必填项)include进来。
    nothing 代表不存在的依赖包,意思就是什么依赖包都不引入
    common是引入的公共服务模块。
  1. maven打包
    在这里插入图片描述

命令:mvn clean package install ‘-Dmaven.test.skip=true’

查看xxxx.jar里面META-INF目录下的MANIFEST.MF文件:
在这里插入图片描述

Main-Class的值为:PropertiesLauncher

  1. 从瘦身前打包中拷贝中lib包
  2. 执行:java -Dloader.path=“D:\web\lib” -jar xxx-thin.jar

    启动参数loader.path配置外置依赖包的加载路径

瘦身方法二:配置文件里指定依赖包位置

  1. 配置
<build>
   <finalName>打出jar包的名称</finalName>
    <plugins>
      <!-- 1、编译出不带 lib 文件夹的Jar包 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!--表示编译版本配置有效-->
                <fork>true</fork>
                <!--引入第三方jar包时,不添加则引入的第三方jar不会被打入jar包中-->
                <includeSystemScope>true</includeSystemScope>
                <!--排除第三方jar文件-->
                <includes>
                    <include>
                        <groupId>nothing</groupId>
                        <artifactId>nothing</artifactId>
                    </include>
                </includes>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    
    	<!-- 2、完成对Java代码的编译,可以指定项目源码的jdk版本,编译后的jdk版本,以及编码 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <!-- 源代码使用的JDK版本 --> 
                <source>${java.version}</source>
                <!-- 需要生成的目标class文件的编译版本 -->
                <target>${java.version}</target>
                <!-- 字符集编码 -->
                <encoding>UTF-8</encoding>
                <!-- 用来传递编译器自身不包含但是却支持的参数选项 -->  
                <compilerArguments>
                        <verbose/>
                        <!-- windwos环境(二选一) -->
                        <!--<bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>-->
                        <bootclasspath>D:/App/jdk/jdk1.8.0_221/jre1.8.0_221/lib/rt.jar;D:/App/jdk/jdk1.8.0_221/jre1.8.0_221/lib/jce.jar</bootclasspath>
                        <!-- Linux环境(二选一) -->
                        <!--<bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>-->
                    </compilerArguments>
            </configuration>
        </plugin>

        <!-- 3、将所有依赖的jar文件复制到target/lib目录 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                      <!--复制到哪个路径,${project.build.directory} 缺醒为 target,其他内置参数见下面解释-->
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        
    	<!-- 4、指定启动类,指定配置文件,将依赖打成外部jar包 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <!-- 是否要把第三方jar加入到类构建路径 -->
                        <addClasspath>true</addClasspath>
                        <!-- 外部依赖jar包的最终位置 -->
                        <classpathPrefix>lib/</classpathPrefix>
                        <!-- 项目启动类 -->
                        <mainClass>org.jeecg.JeecgSystemApplication</mainClass>
                    </manifest>
                </archive>
                <!--资源文件不打进jar包中,做到配置跟项目分离的效果-->
                <excludes>
                    <!-- 业务jar中过滤application.properties/yml文件,在jar包外控制 -->
                    <exclude>*.properties</exclude>
                    <exclude>*.xml</exclude>
                    <exclude>*.yml</exclude>
                </excludes>
            </configuration>
        </plugin>

    </plugins>
</build>
  • includeSystemScope:jar包分两种
    • 一种是spring、mybatis等这种项目依赖的
    • 一种是手动引入的第三方 jar 依赖

    如果该参数不设置为 true 的话是不能被打包进来的

  • includes:排除项目中所有的 jar

我们需要将打包插件替换为 maven-jar-plugin,然后使用该插件拷贝依赖到 jar 到外面的 lib 目录

  • maven-compiler-plugin:
    完成对Java代码的编译,可以指定项目源码的jdk版本、编译后的jdk版本,以及编码,如果不写这个插件也是没问题的,不写会使用默认的 jdk 版本来处理,只是这样容易出现版本不匹配的问题,比如本地maven环境用的3.3.9版本,默认会使用jdk1.5进行编译,而项目中用的jdk1.8的编译环境,那就会导致打包时编译不通过。
  • maven-dependency-plugin:
    作用就是将所有依赖的jar文件复制到指定目录下
  • maven-jar-plugin:
    主要作用就是将maven工程打包成jar包。
    • 打包时排除资源配置文件,
    • 排除了配置文件那么项目启动是怎么读取呢?配置文件有这么一个默认的优先级
      当前项目config目录下 > 当前项目根目录下 > 类路径config目录下 > 类路径根目录下
      因此只需要将配置文件复制一份到与 jar 包平级目录下,或者与jar包平行config目录下,就能优先使用此配置文件,达到了伪分离目的。
  1. 打包:clean package

在这里插入图片描述
MANIFEST.MF文件内容:
在这里插入图片描述
在这里插入图片描述

  1. 启动:java -jar xxx.jar

    MANIFEST.MF文件指定了依赖包位置所以不需要Dloader.path指定依赖包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Talk预告 | 香港理工大学计算机系助理教授杨波:无监督2D/3D物体实例分割

本期为TechBeat人工智能社区第462期线上Talk&#xff01; 北京时间12月14日(周三)20:00&#xff0c;香港理工大学计算机系助理教授——杨波的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “无监督2D/3D物体实例分割”&#xff0c;届时将介绍香港理…

PyTorch深度学习框架学习记录(1)--安装,MNIST手写数字识别

文章目录框架发展安装cpu版本GPU版本学习记录MNIST手写数字识别数据的准备工作框架发展 Caffe框架&#xff08;2015&#xff09; 优势&#xff1a;只写配置文件 劣势&#xff1a;运行环境配置繁琐 Tensorflow 1.x&#xff08;2016&#xff09; 开发成本高&#xff0c;上手较…

正则表达式教程

视频&#xff1a;null正则表达式进阶是正则表达式30分钟入门40分钟进阶&#xff08;绝对能学会&#xff09;的第2集视频&#xff0c;该合集共计2集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https://www.bilibili.com/video/BV19t4y1y7qP/?p2&…

如何用3D流体实现逼真水流效果?

华为应用市场在2022年HDC大会期间发布了一款3D水流主题&#xff0c;基于华为HMS Core Scene Kit服务能力&#xff0c;展现立体灵动的水流岛屿&#xff0c;可跟随用户指尖实现实时流体波动效果&#xff0c;既趣味又解压。 让变幻莫测的物质来实现我们在影视和游戏等多种应用场景…

sentinel 规则持久化

原始模式 如果不做任何修改&#xff0c;Dashboard 的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中&#xff1a; 这种做法的好处是简单&#xff0c;无依赖&#xff1b;坏处是应用重启规则就会消失&#xff0c;仅用于简单测试&#xff0c;不能用于生产环境。 se…

【Android】数据存储

一、文件存储 特点&#xff1a;openFileInput()和openFileOutput()读取设备上的文件。 优点&#xff1a;适用于存储大量的数据&#xff0c;可以存储图片、视频、文本等数据。 缺点&#xff1a;如果采用内部存储的方式&#xff0c;存储过量的数据可能会导致内存的不足&#xff…

2022年度手机行业排行榜(年度手机行业分析)

如今&#xff0c;随着手机普及率的不断增长&#xff0c;当前手机市场在逐渐饱和。在这一的态势下&#xff0c;手机行业中细分市场成为发展的必然趋势&#xff0c;随着市场细分和目标人群锁定的不断明确&#xff0c;手机市场中中小品牌手机的生存空间在逐渐被挤压&#xff0c;手…

消息队列,Unix的通信机制之一

最简单的消息内存的使用流程 ①ftok函数生成键值 ②msgget函数创建消息队列 ③msgsnd函数往消息队列发送消息 ④msgrcv函数从消息队列读取消息 ⑤msgctl函数进行删除消息队列 一个消息数据应该由以下一个结构体组成&#xff0c;举个例子 struct mymesg{long int mtype; /…

教你如何使用eBPF追踪Linux内核

【推荐阅读】 浅析linux内核网络协议栈--linux bridge 深入理解SR-IOV和IO虚拟化 深入linux内核架构--进程&线程 1. 还是先进入内核目录&#xff0c;执行下面的命令&#xff0c;确保内核代码是干净的。 $ make mrproper 2. 执行以下命令&#xff0c;开始对内核进行配…

Feign的性能优化

Feign底层的客户端实现有三种模式 1&#xff09;URLConnection&#xff1a;默认实现&#xff0c;不支持连接池&#xff1b;&#xff08;Feign发送http请求时&#xff0c;默认使用的客户端&#xff09; 2&#xff09;Apache HttpClient &#xff1a;支持连接池&#xff1b; 3&…

深度学习Week10-YOLOv5-Backbone模块实现(Pytorch)

● &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 ● &#x1f366; 参考文章&#xff1a;Pytorch实战 |第P9周&#xff1a;YOLOv5-Backbone模块实现(训练营内部成员可读) ● &#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 类似于上周内…

也谈特征值和特征向量的几何意义

在当前的大数据分析时代&#xff0c;数据降维是一个重要的分析技术。而谈到数据降维&#xff0c;就离不开一门最为抽象难懂的数学学科分支——线性代数。有人可能会问&#xff1a;一堆向量和矩阵符号的线性代数到底有鸟用&#xff1f;简单地不科学地说&#xff0c;线性代数就是…

【tiktok小店运营小知识】 tiktok小店也会被封吗?有哪些原因呢?

最近开tiktok小店的小伙伴越来越多&#xff0c;运营过程中也会碰到很多问题。有小伙伴问&#xff0c; tiktok小店也会被封吗&#xff1f;有哪些原因呢&#xff1f; tiktok小店也会被封吗&#xff1f;有哪些原因呢&#xff1f; 答案是肯定的。TikTok需要进一步规范店铺经营&…

SRM是什么意思?盘点4个顶级SRM系统

SRM是什么意思&#xff1f;SRM系统&#xff0c;一般指供应商关系管理系统。供应商管理系统是采购管理系统的一个重要模块&#xff0c;强调企业与供应商之间协作共赢。相信在市场动荡的今天&#xff0c;企业与供应商之间的强关联、共命运对于企业来说不失为稳固根基、扩张业务的…

JavaScript系列之ES6默认导出与默认导入

文章の目录一、默认导出二、默认导入三、按需导出四、按需导入五、直接导入并执行模块代码写在最后一、默认导出 语法&#xff1a; export default 默认导出的成员每个模块中&#xff0c;只允许使用唯一的一次 export default&#xff0c;否则会报错&#xff01; 二、默认导入…

Generative Modeling by Estimating Gradients of the Data Distribution阅读笔记

目录概述传统score-based generative modeling介绍score matchingLangevin dynamics传统score-based generative modeling存在的问题流型假设上的问题低密度区域的问题Noise Conditional Score Network噪声条件分数网络(Noise Conditional Score Networks)annealed Langevin dy…

Kafka 架构、核心机制和场景解读

摘要 Kafka 是一款非常优秀的开源消息引擎&#xff0c;以消息吞吐量高、可动态扩容、可持久化存储、高可用的特性&#xff0c;以及完善的文档和社区支持成为目前最流行的消息队列中间件。 Kafka 的开发社区一直非常活跃&#xff0c;在消息引擎的领域取的不俗成绩之后&#xf…

组装式应用新基建——小程序容器技术

近年来&#xff0c;面对不断变化的业务环境和快速迭代的业务需求&#xff0c;“组装式应用”凭借其灵活性、复用性等优势&#xff0c;成为了重要战略技术趋势。 一直以来&#xff0c;传统应用程序开发面临着诸多挑战&#xff1a;一是没有足够的开发能力&#xff1b;二是选错技…

sql中的!=操作符的天坑(务必警觉)(=在处理null时也是同样有坑)

最近在测试数据&#xff0c;偶尔需要写sql进行数据比对&#xff0c;例如这样的语句&#xff1a; if( column_a ! column_b, 1, 0)&#xff0c;万万没想到就是这样的sql语句差点要了我的命。 其实对一般的数据&#xff0c;这条校验语句是没有问题的&#xff0c;最后再筛选一下1的…

Stm32旧版库函数10——A4988 单个步进电机 16拍

#include "stm32f10x_lib.h" #include "motor.h" u8 Step; void GPIO_Key(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin GPIO_Pin_0|GPIO_Pin_1; // 选中管脚9 GPIO_InitStructure.GPIO_Mode …