spring-boot-maven-plugin插件打包和java -jar命令执行原理

文章目录

  • 1. Maven生命周期
  • 2. jar包结构
    • 2.1 不可执jar包结构
    • 2.2 可执行jar包结构
  • 3. spring-boot-maven-plugin插件打包
  • 4. 执行jar原理

1. Maven生命周期

Maven的生命周期有三种:

  1. clean:清除项目构建数据,较为简单,不深入探讨;
  2. site:建立和部署项目站点,使用的较少,也不深入探讨;
  3. default:定义了项目构建时所需要的所有步骤,是Maven生命周期中最核心最重要的的部分。

本次要深入了解的便是default流程。其生命周期如下:

阶段可否执行说明
validate验证项目是否正确以及所有必要信息是否可用
initializeX初始化构建状态
generate-sourcesX生成编译阶段需要的所有源码文件
process-sourcesX处理源码文件,例如过滤某些值
generate-resourcesX生成项目打包阶段需要的资源文件
process-resourcesX处理资源文件,并复制到输出目录,为打包阶段做准备
compile编译源代码,并移动到输出目录
process-classesX处理编译生成的字节码文件
generate-test-sourcesX生成编译阶段需要的测试源代码
process-test-sourcesX处理测试资源,并复制到测试输出目录
test-compileX编译测试源代码并移动到测试输出目录中
test使用适当的单元测试框架(如junit)运行测试
prepare-packageX在真正打包前执行一些必要的操作
package获取编译后的代码,并按照可发布的格式进行打包,如jar、war或ear文件
pre-integration-testX在集成测试执行之前,执行所需的操作,例如设置环境变量
integration-testX处理和部署所需的包到集成测试能够运行的环境中
post-integration-testX在集成测试被执行后执行必要的操作,例如清理环境
verify对集成测试的结果进行检查,以保证质量达标
install安装打包的项目到本地仓库,以供本地其它项目使用
deploy拷贝最终的包文件到远程仓库中,以共享给其它开发人员和项目

其中可以在Maven常见的Lifecycle中直接执行的有validate、compile、test、package、verify和deploy七种,一般在Maven的plugin标签中,可以通过配置如下配置来指定插件在某个阶段生效,需要注意的是不可随意配置,每个插件可处理的阶段都是不同的。(不配置则执行插件默认的)

<executions><execution><phase>XX</phase><goals><goal>XXXX</goal></goals></execution>
</executions>

今天要深入了解的spring-boot-maven-plugin插件就是在package阶段中生效的。

2. jar包结构

通常而言,jar包分为可执行jar包和不可执行jar包,顾名思义,可执行jar包即可通过命令java -jar直接执行,不可执行jar包通过命令java -jar执行则会报错。

2.1 不可执jar包结构

|-- _jar包根目录|-- 原项目class文件和resource文件|-- _META-INF|-- MANIFEST.MF|-- _maven|-- _项目目录|-- pom.properties|-- pom.xml

上面是经典的不可执行jar包目录,其中MANIFEST.MF文件内容如下:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: xxxxx
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_151

这五项是最基本的,如果使用java -jar执行这些jar包,将会抛出错误码java.launcher.jar.error3,意为没找到Main-Class属性。不同语言展示的最终描述不同,由launcher+对应语言类转换,简体中文在launcher_zh_CN类中转换,{0}为jar包名称,内容如下:

{0}中没有主清单属性

英文在launcher类中转换,{0}为jar包名称,内容如下:

no main manifest attribute, in {0}

2.2 可执行jar包结构

可执行jar包结构挑选经典的springboot启动包来做示范:

|-- _jar包根目录|-- _BOOT-INF|-- _classes|-- 原项目class文件和resource文件|-- _lib|--原项目依赖的jar库文件|-- _META-INF|-- MANIFEST.MF|-- spring-configuration-metadata.json(springboot项目特有)|-- build-info.properties|-- _maven|-- _项目目录|-- pom.properties|-- pom.xml

上一节我们得知了如果在MANIFEST.MF中没有Main-Class属性,使用java -jar命令执行jar包会报错,接下来看看在可执行jar包的结构,MANIFEST.MF中具体有什么属性:

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: XXXX
Implementation-Version: 1.0-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.1.6.RELEASE
Created-By: Maven Archiver 3.4.0
Start-Class: XXX.XXX.XXX.XXXX
Main-Class: org.springframework.boot.loader.JarLauncher

里面有两个很重要的属性:Start-ClassMain-Class,其中Start-Class指的是项目中springboot的SpringApplication启动类,而Main-Class则是jar包的启动类入口。

3. spring-boot-maven-plugin插件打包

springboot插件打包流程

springboot打包插件执行原理:

  1. 读取原jar包:Maven插件都能读MavenProject对象内容,从中可以读取到Artifact信息,调用该对象的getFile()方法即可获取原jar包文件对象;
  2. 读取项目依赖jar库:直接使用MavenProject对象的getArtifacts()方法即可获取依赖的jar库;
  3. 加载launchScript:读取embeddedLaunchScript配置,并构建LaunchScript对象;
  4. 重新改写MANIFEST.MF:到此步骤开始为repackage的核心流程,改写清单文件时最主要的便是写入Start-ClassMain-Class属性,除此之外还会写入jar库和原项目文件目录属性;
  5. 写入spring-boot-loader包文件:该包是springboot对接java -jar执行命令的核心处理逻辑,springboot打包后加入的Main-Class: org.springframework.boot.loader.JarLauncher属性指向的类便是此包中的jar包启动类,如果war包则会写入war包启动类;
  6. 写入原项目文件:原项目文件会被挪到BOOT-INF/classes/目录下;
  7. 写入项目依赖jar库:原项目依赖的jar库会被写入到BOOT-INF/lib/目录下。

如果要看spring-boot-maven-plugin插件打包源码以分析原理,可导入插件的依赖,此时就能看到该插件的源码。如果使用的是IDEA,下载源码后打上断点,在执行package时,使用debug模式启动也能直接进行调试。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>XXXXX</version>
</dependency>

4. 执行jar原理

将会分析执行java -jar命令后,Java程序调用到Springboot启动类main方法的流程。

执行jar包到springboot入口流程

  1. JVM启动,执行加载主函数LoadMainClass:此时是在JVM底层实现的,里面指定了LauncherHelper类;
  2. 执行LauncherHelpercheckAndLoadMain方法:JVM将会调用LauncherHelpercheckAndLoadMain方法,解析并校验jar包,并获取主要的启动类;
  3. 解析jar的MANIFEST.MF文件:在此方法中会完成读取MANIFEST.MF文件,主要是读取其中的Main-Class属性,并做jar包启动的校验;
  4. GetStaticMethodID方法:JVM获取到Main-Class类对象,调用Main-Class类对象的main方法;
  5. 执行JarLauncher的main方法:JarLauncher继承自Launcher,main方法最后还是会调用到Launcher.launch()方法中;
  6. 读取jar的Start-Class:此时会读取jar包的Start-Class属性,该属性就是原项目的SpringApplication启动类;
  7. 调用启动类的main方法:调用MainMethodRunner的run方法,里面会调用Start-Class类的main方法
  8. 此时调入到自定义的启动类中,完成启动Springboot程序的入口程序。

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

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

相关文章

面试速通宝典——1

1. 内存有哪几种类型&#xff1f; ‌‌‌‌  内存分为五个区&#xff0c;堆&#xff08;malloc&#xff09;、栈&#xff08;如局部变量、函数参数&#xff09;、程序代码区&#xff08;存放二进制代码&#xff09;、全局/静态存储区&#xff08;全局变量、static变量&#…

Gitlab学习(008 gitlab开发工作流GitFlow)

尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab 总时长 5:42:00 共40P 此文章包含第27p-第p29的内容 文章目录 工作流分类集中式工作流功能开发工作流GitFlow工作流Forking工作流 各个分支的功能模拟工作环境创建分支登录领导&#xff08;项目管理者&#…

idea插件开发的第五天-今天不写工具

介绍 今天介绍一款插件,可以帮你调用spring容器里面的方法,并且可以执行脚本 Demo说明 本文基于maven项目开发,idea版本为2022.3以上,jdk为1.8本文在Tools插件之上进行开发本次demo将使用idea的一些组件优化 Tools插件说明 Tools插件是一个Idea插件,此插件提供统一Spi规范…

理解AAC和Opus的编码与解码流程

理解AAC和Opus的编码与解码流程及其在Android中的实现,对于音频开发非常重要。下面,我将详细解释这两种编码格式的原理、流程,并结合具体代码示例,帮助你在Android项目中合理地设计和使用它们。 一、AAC(Advanced Audio Coding) 1. AAC的原理与流程 AAC是一种有损音频压…

Linux实用命令 lsof命令

1.命令简介 lsof(list open files)用于查看进程打开的文件,是十分方便的系统监测工具。因为 lsof 命令需要访问核心内存和各种系统文件,所以需要root权限才可执行。 在 Linux 中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件,所以lsof不仅可…

Linux自主学习篇

用户及权限管理 sudo 是 "superuser do" 的缩写&#xff0c;是一个在类 Unix 操作系统&#xff08;如 Linux 和 macOS&#xff09;中使用的命令。它允许普通用户以超级用户&#xff08;root 用户&#xff09;的身份执行命令&#xff0c;从而获得更高的权限。 useradd…

学生管理系统1.0版本

学生管理系统1.0版本有5个功能&#xff0c;即添加学生、删除学生、修改学生、查看全部学生、退出系统。 里面对添加重复学号、删除和修改不存在的学号等问题都有相应的解决办法。 代码区&#xff1a; Student.java package student;//快捷键Altinsert public class Student …

基于STM32设计的烘干车间远程控制系统(腾讯云IOT)(228)

文章目录 一、前言1.1 项目介绍【1】项目背景【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】项目背景【5】摘要1.4 开发工具的选择【1】设备端开发【2】上…

微信小程序加载H5页面及与H5页面通信的实战教程

在微信小程序的开发过程中&#xff0c;我们有时需要在小程序中嵌入H5页面。本文将详细介绍如何在微信小程序中通过webview加载H5页面&#xff0c;并实现小程序与H5页面的通信。 一、准备工作 搭建微信小程序开发环境&#xff0c;具体步骤请参考官方文档&#xff1a;https://d…

【中国留学网-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

来!一起探索 2024 年数据和 AI 的奇妙世界

来&#xff01;一起探索 2024 年数据和 AI 的奇妙世界 前言2024 年数据和 AI 的奇妙世界 前言 生成式 AI 的问世&#xff0c;让世界正在经历一场前所未有的变革&#xff0c;就像是一把神奇的钥匙&#xff0c;正在开启一扇通往无限可能的大门。数据和 AI 的融合&#xff0c;将为…

【更新日志】拉克丝大战亚索-2024.09.23

2024.9.23更新 本次主要是修复了大量bug&#xff0c;改善了画面表现&#xff0c;减少了不必要的杂乱的音效&#xff0c;在此感谢bobo的美术支持。 战斗 战斗视角相机切换为第三人称。新增技能指示器。亚索的 Boss AI 行为&#xff0c;增加一个半血狂暴机制&#xff0c;亚索新…

Neo4j 简单使用

在 Neo4j 项目中&#xff0c;搭建和使用主要包括以下几个步骤&#xff1a; 1. 安装 Neo4j 首先&#xff0c;安装 Neo4j 可以选择多种方式&#xff0c;包括&#xff1a; 本地安装&#xff1a;在 Windows、macOS 或 Linux 系统中&#xff0c;通过官网下载对应的 Neo4j 安装包。…

微服务注册中⼼1

1. 微服务的注册中⼼ 注册中⼼可以说是微服务架构中的”通讯录“ &#xff0c;它记录了服务和服务地址的映射关系。在分布式架构中&#xff0c; 服务会注册到这⾥&#xff0c;当服务需要调⽤其它服务时&#xff0c;就这⾥找到服务的地址&#xff0c;进⾏调⽤。 1.1 注册中⼼的…

算法之逻辑斯蒂回归(Logistic regression)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 逻辑斯蒂回归&#xff08;Logistic Regression&#xff09;是统计学中一种广泛应用于二分类问题的算法。它的主要目标是预测二分类问题中的事件发生的概率。尽管名字里有“回归”&#xff0c;但逻…

全栈项目小组【算法赛】题目及解题

题目&#xff1a;全栈项目小组【算法赛】 题目&#xff1a; 解题思路 1.遍历简历信息&#xff1a;我们需要读取所有简历&#xff0c;根据期望薪资和岗位类型进行分类和统计。 2.分类统计&#xff1a;使用哈希表来存储每个薪资下的前端&#xff08;F&#xff09;和后端&#…

re题(38)BUUCTF-[FlareOn6]Overlong

BUUCTF在线评测 (buuoj.cn) 运行一下.exe文件 查壳是32位的文件&#xff0c;放到ida反汇编 对unk_402008前28位进行一个操作&#xff0c;我们看到运行.exe文件的窗口正好是28个字符&#xff0c;而unk_402008中不止28个数据&#xff0c;所以猜测MessageBoxA&#xff08;&#x…

《论软件架构建模技术与应用》写作框架,软考高级系统架构设计师

论文真题 软件架构风格是描述一类特定应用领域中系统组织方式的惯用模式&#xff0c;反映了领域中诸多系统所共有的结构特征和语义特征&#xff0c;并指导如何将各个模块和子系统有效组织成一个完整的系统。分层架构是一种常见的软件架构风格&#xff0c;能够有效简化设计&…

0基础跟德姆(dom)一起学AI 数据处理和统计分析07-分组和会员数据分析

向量化函数及Lambda表达式 * 分组操作相关 * 分组聚合 * 分组转换 * 分组过滤 * DataFrameGroupBy对象介绍 * 会员分析案例-数据透视表 --- 1.向量化函数 * 分析代码 python def avg_test2(x,y): if x20: return np.NaN else: retu…

[杂谈-黑神话:悟空] 中国3A游戏的崛起之路:挑战与机遇并存

[杂谈-黑神话:悟空] 中国3A游戏的崛起之路&#xff1a;挑战与机遇并存 《黑神话&#xff1a;悟空》的出现&#xff0c;让我们看到了中国3A游戏的希望和未来。对于中国游戏产业的从业者和爱好者来说&#xff0c;这是一个值得关注和期待的领域。 在游戏产业蓬勃发展的今天&#…