Spring Boot - 瘦身大作战:优雅应对Spring Boot Fat Jar

文章目录

  • Fat Jar
  • 瘦身
    • pom修改
    • copy lib
    • 启动 -Dloader.path
    • 验证
  • 源码分析
    • 前置阅读
    • spring-boot-loader 依赖
    • 类继承关系
    • PropertiesLauncher属性配置
  • 附 pom.xml

在这里插入图片描述


Fat Jar

在这里插入图片描述
在这里插入图片描述
【pom.xml】

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.16</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.artisan</groupId><artifactId>thinBootJar</artifactId><version>0.0.1-SNAPSHOT</version><name>thinBootJar</name><description>thinBootJar</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image></configuration></plugin></plugins></build></project>

打包后观察目录
在这里插入图片描述

在这里插入图片描述

重点关注下Main-Class


瘦身

pom修改

 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 用来配置可执行jar包中Main-Class的类型,这里一定要设置为 ZIP,使打的jar包中的Main-Class为PropertiesLauncher--><layout>ZIP</layout><includes><!-- 不打依赖包 --><include><!-- nothing 代表不存在的依赖包,意思就是什么依赖包都不引入--><groupId>nothing</groupId><artifactId>nothing</artifactId></include><!--                        <include>--><!-- common是引入的公共服务模块 --><!--                            <groupId>com.xxx.xx.rpc</groupId>--><!--                            <artifactId>common</artifactId>--><!--                        </include>--></includes></configuration></plugin></plugins></build>

JAR,即通常的可执行jar
Main-Class: org.springframework.boot.loader.JarLauncher

WAR,即通常的可执行war,需要的servlet容器依赖位于WEB-INF/lib-provided
Main-Class: org.springframework.boot.loader.warLauncher

ZIP,即DIR,类似于JAR
Main-Class: org.springframework.boot.loader.PropertiesLauncher

MODULE,将所有的依赖库打包(scope为provided的除外),但是不打包Spring Boot的任何Launcher

NONE,将所有的依赖库打包,但是不打包Spring Boot的任何Launcher


打包后观察下 jar包 的大小 和 里面的内容
在这里插入图片描述

在这里插入图片描述

重点关注下Main-Class


copy lib

 <!-- 将依赖的jar包copy到lib目录下  --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><!-- 指定依赖的路径 --><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin>

打包后观察下

在这里插入图片描述


启动 -Dloader.path

为了让名字好看一点

在这里插入图片描述
在这里插入图片描述

java -Dloader.path=./lib  -jar  artisan-test-thin-boot-jar.jar

在这里插入图片描述

验证

在这里插入图片描述

通过启动参数loader.path配置外置依赖包的加载路径。 项目成功启动,说明我们配置的外包依赖包加载生效了


源码分析

前置阅读

SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动的

SpringBoot(二) 启动分析JarLauncher


spring-boot-loader 依赖

为了方便查看源码,我们引入如下依赖

  <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-loader --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-loader</artifactId></dependency>

类继承关系

在这里插入图片描述

org.springframework.boot.loader.Launcher类是特殊的引导程序类,用作可执行jar的主要入口点。它是jar文件中的实际Main-Class,用于设置适当的URLClassLoader并最终调用main()方法

  • 有三个启动器子类(JarLauncherWarLauncherPropertiesLauncher)。它们的目的是从目录中的嵌套jar文件或war文件(而不是在类路径中显式的文件)加载资源(.class文件等)。

  • 对于JarLauncherWarLauncher,嵌套路径是固定的。 JarLauncher位于BOOT-INF / lib /中,而WarLauncher位于WEB-INF / lib /WEB-INF / lib-provided /中。如果需要,可以在这些位置添加额外的罐子。

  • 默认情况下,PropertiesLauncher在应用程序存档中的BOOT-INF / lib /中查找。可以通过在loader.properties(这是目录,归档文件或归档文件中的目录的逗号分隔列表)中设置一个称为LOADER_PATHloader.path的环境变量来添加其他位置

概括一下: 启动器Launcher是为了项目启动加载依赖资源的,共有3个启动器 JarLauncher,WarLauncher和PropertiesLauncher ,

  • JarLauncher和WarLauncher加载资源的路径是固定的,
  • PropertiesLauncher可以通过环境变量loader.path来指定加载资源的位置

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

PropertiesLauncher属性配置

在这里插入图片描述

在这里插入图片描述

  1. loader.path: 用于定义lib包加载路径。
  2. loader.home: 解析loader.path中相对路径的基础路径,通常是类路径位置。
  3. loader.args: 设置main方法的默认参数,以空格分隔。
  4. loader.main: 指定要启动的主类的名称,例如com.xxx.Application。
  5. loader.config.name: 指定属性文件的路径,例如classpath:loader.properties。
  6. loader.system: 一个布尔值标志,指示是否将所有属性添加到系统属性,默认为false。

附 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.16</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.artisan</groupId><artifactId>thinBootJar</artifactId><version>0.0.1-SNAPSHOT</version><name>thinBootJar</name><description>thinBootJar</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><finalName>artisan-test-thin-boot-jar</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 用来配置可执行jar包中Main-Class的类型,这里一定要设置为 ZIP,使打的jar包中的Main-Class为PropertiesLauncher--><layout>ZIP</layout><includes><!-- 不打依赖包 --><include><!-- nothing 代表不存在的依赖包,意思就是什么依赖包都不引入--><groupId>nothing</groupId><artifactId>nothing</artifactId></include><!--                        <include>--><!-- common是引入的公共服务模块 --><!--                            <groupId>com.xxx.xx.rpc</groupId>--><!--                            <artifactId>common</artifactId>--><!--                        </include>--></includes></configuration></plugin><!-- 将依赖的jar包copy到lib目录下  --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><!-- 指定依赖的路径 --><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin></plugins></build></project>

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理类联考——写作——考点+记忆篇——论证有效性分析——记忆

文章目录 论证有效性分析得分要点、寻找漏洞方法论证有效性分析五大逻辑漏洞类型论证有效性分析的具体写法论证有效性分析十大解题思路&#xff08;上&#xff09;方法一&#xff1a;理想法方法二&#xff1a;极端法方法三&#xff1a;其他因素法方法四&#xff1a;可行性法 论…

nginx反向代理解决跨域实践

需求实现 本地请求百度的一个搜索接口&#xff0c;用nginx代理解决跨域思路&#xff1a;前端和后端都用nginx代理到同一个地址8080&#xff0c;这样访问接口就不存在跨域限制 本地页面 查询一个百度搜索接口&#xff0c;运行在http://localhost:8035 index.js const path …

HarmonyOS4.0系列——02、汉化插件、声明式开发范式ArkTS和类web开发范式

编辑器调整 我们在每次退出编辑器后再次打开会直接进入项目文件中&#xff0c;这样在新建项目用起来很是不方便&#xff0c;所以这里跟着设置一下就好 这样下次进入就不会直接跳转到当时的文件项目中&#xff01;&#xff01; 关于汉化 settings → plugins → installe…

AI换脸教程

方法一、MJ换脸大法 1.点击这个网站添加一个机器人到自己的服务器 https://discord.com/oauth2/authorize?client_id1090660574196674713&permissions274877945856&scopebot 2. /saveid 回车选择你自己的照片&#xff0c;并且在名字框命名身份&#xff0c;回车 3.…

卷积神经网络(Inception-ResNet-v2)交通标志识别

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、构建一个tf.data.Dataset1.加载数据2. 配置数据集 三、构建Inception-ResNet-v2网络1.自己搭建2.官方模型 五、设置动态学习率六、训练模型七、模型评…

qt5.15.2及6.0以上版本安装

文章目录 下载在线安装器安装打开软件 下载在线安装器 因为从qt5.15开始不支持离线下载安装了&#xff0c;只能通过在线安装的方式进行安装。 下载在线安装下载器&#xff1a; 这个在线安装下载器网上也都是可以找到。 这里是其放到网盘上的下载地址&#xff1a; 链接&#x…

【持续更新】汇总了一份前端领域必看面试题

文章目录 1. 写在前面2. 前端面试汇总2.0.1. 如何提⾼webpack的打包速度2.0.2. 数组去重2.0.3. 前端有几种缓存方式&#xff1f;2.0.4. nextTick描述一下&#xff1f;2.0.5. Webpack层面的优化&#xff1f;2.0.6. 代码层面的优化&#xff1f;2.0.7. Web 技术的优化&#xff1f;…

Python基础语法之判断语句

1.布尔类型和比较运算符 布尔类型&#xff1a;数字类型的一种。 比较运算符&#xff1a; > < > < ! 2.if语句基本格式 if 要判断的条件&#xff1a; 条件成立&#xff0c;即做~ 例子&#xff1a; 注意&#xff1a;格式上冒号和缩进 3.if else组合…

超级应用平台的诞生

摘要&#xff1a;本文介绍了明道云的发展计划和商业模式。明道云将退出直营市场&#xff0c;专注于合作伙伴业务&#xff0c;提供更全面的支持&#xff0c;共同推动数字化能力的发展&#xff0c;实现业绩和终端客户收入的增长。文章强调了明道云与合作伙伴的紧密关系&#xff0…

C# 使用NPOI操作Excel的工具类

写在前面 NPOI是POI项目的.NET迁移版本。POI是一个开源的Java 读写 Excel、Word 等微软Ole2组件文档的项目&#xff1b;使用NPOI可以在没有安装Office或者相应环境的机器上对Word或Excel文档进行读写操作。 NPOI类库中操作EXCEL有两个模块分别是&#xff1a; 1️.HSSF模块&a…

centos7搭建ftp服务

一、安装 yum -y install vsftpd vi /etc/vsftpd/vsftpd.conf二、编辑配置文件 /etc/vsftpd/vsftpd.conf 内容如下 #是否允许匿名&#xff0c;默认no anonymous_enableNO#这个设定值必须要为YES 时&#xff0c;在/etc/passwd内的账号才能以实体用户的方式登入我们的vsftpd主机…

DGL的图数据处理管道

DGL在 dgl.data 里实现了很多常用的图数据集。它们遵循了由 dgl.data.DGLDataset 类定义的标准的数据处理管道。 DGL推荐用户将图数据处理为 dgl.data.DGLDataset 的子类。该类为导入、处理和保存图数据提供了简单而干净的解决方案。 DGL中的Dataset类 它是处理、导入以及保存…