springboot打包目录解析

一、引言

Java开发中我们使用最多的便是spring框架,比如springboot应用。微服务模式下,每个服务都是一个springboot应用,都会被打包成一个可执行jar包。那么我们有多少人尝试去了解过这个可执行jar到底是什么?它的结构是什么样的,我认为大部分人是没有关注过这个的,今天笔者就通过探索的方式,揭开可执行jar的真面目。

二、打包项目

首先使用IDEA随便创建一个spring web项目,打包一下看下target目录
在这里插入图片描述

classes

展开看到如下结构,主要是把我们自己写的.java文件编译成的.class文件和一些配置文件.yaml或者.properties,我们常说的classpath路径,就是这个classes文件下的路径。
在这里插入图片描述

generated-sources

这个一般是用来存放框架或者工具自动生成的一些源码或者文件的地方,比如注解Lombok等。
在这里插入图片描述

generated-test-sources

这个没什么好说的,用来存放生成一些测试代码源或者文件的地方
在这里插入图片描述

maven-archiver

aven-archiver是Maven内部使用的一个组件,它属于org.apache.maven.archiver包,主要职责在于帮助Maven插件(如maven-jar-plugin, maven-war-plugin等)创建和管理归档文件(例如JAR, WAR, EAR等)。它处理诸如设置归档的元数据(如Manifest文件内容)、收集和归档项目资源和编译后的类文件等工作。在这里插入图片描述

maven-status

maven-status是Maven在构建过程中创建的一个临时目录,用于存储构建期间的中间状态信息。这个目录的内容主要是由Maven的maven-build-number-plugin或maven-checkstyle-plugin等插件生成的,特别是那些需要跟踪文件状态的插件。
在这里插入图片描述

surefire-reports

surefire-reports是Maven项目在执行单元测试时生成的测试报告目录
在这里插入图片描述

test-classes

这个就是测试类的生成目录
在这里插入图片描述
以上就是maven打包后的目录解析说明,接下来的这两个单独的文件是重点
在这里插入图片描述

三、可执行jar包

首先看这个.jar.original后缀的文件,
进入target目录下,用360解压缩解压下original文件解压到自己新建的original文件夹下
在这里插入图片描述
使用IDEA查看,看到文件结构如下
在这里插入图片描述
这个文件很小只有7kb,主要是应用的本地资源,并不包含第三方依赖。

再看.jar结尾的文件,这个就是我们打包好的可执行jar包,同样的解压到创建的jarExcutable文件中

在这里插入图片描述
在IDEA中查看结构如下
在这里插入图片描述

使用terminal控制台,输入tree
在这里插入图片描述
这个文件结构相对来说就比较复杂了,解释下关键部分

  • BOOT-INF/classes:存放的是应用编译后的class文件
  • BOOT-INF/lib:这个存放的是我们引用的所有第三方jar包依赖
  • META-INF/:存放应用相关的元信息
  • org/:存放的是springboot相关的class文件

这个和标准的java EE web应用很相似,在java EE web应用中class文件放在WEB-INF/classes下,依赖的jar包就放在WEB-INF/lib下,二者很相似,其实spring很多东西是在java EE web基础上发展而来。

java -jar yourapplicationName.jar命令可以启动我们的jar包,那么为什么能启动呢?打开这个MANIFEST.MF文件内容
在这里插入图片描述
内容如下
在这里插入图片描述

这个JarLauncher就是可执行JAR文件启动器,是由以下插件spring-boot-maven-plugin追加进去的,JarLauncher是专门装载引导类(启动类)的
在这里插入图片描述
pom文件中引入如下依赖(实际开发不需要引入,这里是为了看源码)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-loader</artifactId>
</dependency>

JarLauncher源码如下

/** Copyright 2012-2023 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package org.springframework.boot.loader.launch;/*** {@link Launcher} for JAR based archives. This launcher assumes that dependency jars are* included inside a {@code /BOOT-INF/lib} directory and that application classes are* included inside a {@code /BOOT-INF/classes} directory.** @author Phillip Webb* @author Andy Wilkinson* @author Madhura Bhave* @author Scott Frederick* @since 3.2.0*/
public class JarLauncher extends ExecutableArchiveLauncher {public JarLauncher() throws Exception {}protected JarLauncher(Archive archive) throws Exception {super(archive);}@Overrideprotected boolean isIncludedOnClassPath(Archive.Entry entry) {return isLibraryFileOrClassesDirectory(entry);}@Overrideprotected String getEntryPathPrefix() {return "BOOT-INF/";}static boolean isLibraryFileOrClassesDirectory(Archive.Entry entry) {String name = entry.name();if (entry.isDirectory()) {return name.equals("BOOT-INF/classes/");}return name.startsWith("BOOT-INF/lib/");}public static void main(String[] args) throws Exception {new JarLauncher().launch(args);}}

其中的BOOT-INF/lib/和BOOT-INF/classes/对应我们解压jar包后的相关文件目录,说明JarLauncher 会从中加载文件

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

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

相关文章

泪目!网络连接中断的原因,终于找到了!

朋友们&#xff0c;出大事了&#xff01; 不知道多少朋友玩过 DNF 这个游戏&#xff0c;这个我从小学玩到大学的 “破” 游戏&#xff0c;昨天竟然出手游了&#xff01; 我都忘了自己曾几何时预约过这个手游通知&#xff0c;昨天给我发了条通知信息说游戏已开服。 老玩家直接…

Gitee好用的浏览器插件【GiteeTree】

使用gitee的时候&#xff0c;可能拉到别人的项目后&#xff0c;只是想看下某些文件的代码&#xff0c;但是不得不全部都拉下来&#xff0c;每次点又很麻烦。这个插件【GiteeTree】就很好用了&#xff0c;只需要搜索GiteeTree&#xff0c;然后把插件下载下来

git revert 和 git reset

文章目录 工作区 暂存区 本地仓库 远程仓库需求&#xff1a;已推送到远程仓库&#xff0c;想要撤销操作git revert &#xff08;添加新的提交来“反做”之前的更改&#xff0c;云端会残留上次的提交记录&#xff09;git reset&#xff08;相当于覆盖上次的提交&#xff09;1.--…

中国科学院植物研究所宋献军课题组揭示不同的翻译后修饰协作调控水稻种子大小的新机制

公众号&#xff1a;生信漫谈&#xff0c;获取最新科研信息&#xff01; 中国科学院植物研究所宋献军课题组揭示不同的翻译后修饰协作调控水稻种子大小的新机制https://mp.weixin.qq.com/s/ycNgYzACwkYZbo6k0Zqtcw 未来20年&#xff0c;我国将决战全面建成社会主义现代化国家&…

MySQL笔记第三天(从小白到入门)

文章目录 MySQL笔记SQL语言介绍数据库系统关系型数据库非关系型数据库SQL和数据库系统的关系数据库系统架构 MySQL的介绍概念MySQL的版本 MySQL的DDL操作-重点基本数据库操作基本表操作 MySQL的DML操作-重点insert-插入数据update-更新数据delete-删除数据 MySQL的约束-了解概述…

工厂生产管理系统

为应对一些国内验厂&#xff0c;如大疆等&#xff0c;他们需要客户有自己的生产管理系统的&#xff0c;但实际很多公司是没有引入ERP这类的系统的&#xff0c;从而想开发一套简单的生产管理系统。 参考了网上一个比较古老的StorageMange项目&#xff0c;此项目用到DevExpress的…

数字签名:确保信息完整性和身份验证的关键技术

在数字时代&#xff0c;信息的安全性和真实性变得至关重要。数字签名作为一种电子形式的签名&#xff0c;提供了一种验证信息来源和确保信息完整性的方法。本文将深入探讨数字签名的概念、工作原理、应用场景以及它如何帮助提高网络安全性。 数字签名的概念 数字签名是一种加密…

C++与Android处理16进制大端/小端数据实例(二百七十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

数据库DCL语句

数据库DCL语句 介绍&#xff1a; DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访 问权限。 管理用户&#xff1a; 查询用户: select * from mysql.user;创建用户: create user 用户名主机名 identified by 密码;修改用…

《计算机网络微课堂》课程概述

​ 课程介绍 本专栏主要是 B 站课程《计算机网络微课堂》的文字版&#xff0c;作者是湖南科技大学的老师。 B 站地址&#xff1a;https://www.bilibili.com/video/BV1c4411d7jb 该课程好评如潮&#xff0c;包含理论课&#xff0c;实验课&#xff0c;考研真题分析课&#xf…

Jenkins在windows上进行安装

今天为了实现jmeter接口测试脚本的持续性集成安装了jenkins&#xff0c;主要记录jenkins的安装和端口的修改。 前提条件&#xff1a;安装了jdk&#xff0c;我本机安装的jdk1.8。 1.下载jenkins安装包 安装jenkins我们需要先下载安装包&#xff0c;可以通过下面的链接进行下载&a…

JavaSE--基础语法(第一期)

Java是一种优秀的程序设计语言&#xff0c;它具有令人赏心悦目的语法和易于理解的语义。不仅如此&#xff0c;Java还是一个有一系列计算机软件和规范形成的技术体系&#xff0c;这个技术体系提供了完整的用于软件开发和 跨平台部署的支持环境&#xff0c;并广泛应用于嵌入式系统…

基于Docker的ElasticSearch、Kibana服务搭建并开启用户鉴权

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;云原生与服务部署专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 服务搭建 2.1. 部署ElasticSearch 2.2. 部署Kibana 3. …

安全态势管理的六大挑战:态势感知

德迅云安全鉴于如今的安全威胁不断变幻&#xff0c;企业对实施态势管理策略至关重要&#xff0c;可以让安全团队根据需要进行安全策略的动态调整。如果企业在研究构建态势感知管理&#xff0c;需要特别关注以下六个方面的挑战。 如果企业正在使用一个或多个平台&#xff0c;那么…

IS-IS链路状态数据库

原理概述 一个OSPF链路状态数据库是若干条LSA的集合。与此相似&#xff0c;一个IS-IS链路状态数据库是由若干条LSP的集合。与OSPF链路状态数据库不同&#xff0c;IS-IS链路状态数据库有Level-1和Level-2之分。 在IS-IS协议中&#xff0c;每一条LSA都有一条剩余生存时间、一个…

safetensors介绍

1 介绍 safetensors 是 Huggingface 推出的一种可靠、易移植的机器学习模型存储格式&#xff0c;用于安全地存储 Tensor&#xff0c;而且速度很快&#xff08;零拷贝&#xff09;。 safetensors 格式结构&#xff1a; 8 bytes&#xff1a;一个无符号的整数&#xff0c;表示…

Dubbo源码及总结

Springboot整合Dubbo启动解析Bean定义 根据springboot启动原理&#xff0c;会先把启动类下的所有类先进行解析bean定义&#xff0c;所以要先EnableDubbo这个注解&#xff0c;再根据这个注解里面的注解&#xff0c;可以知道import的两个类DubboComponentScanRegistrar和DubboCo…

输入一串字符,输入想要字符串前*的个数n,判断字符串前*的个数是大于n还是小于n,如果大于n则删除多余的*其它保持不变,如果小于n,则字符串也保持不变

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void fun(char* a, int n) {int i 0, j 0, m 0,b0,c0;char* p;p a;//第一步&#xff0c;判断字母前面有多少个*while (p[i] *){j;}printf("字母前*的个数%d\n",j);//求总的字符串长度while (a[m] !…

【全开源】沃德商协会管理系统源码(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的商协会系统&#xff0c;新一代数字化商协会运营管理系统&#xff0c;以“智慧化会员体系、智敏化内容运营、智能化活动构建”三大板块为基点&#xff0c;实施功能全场景覆盖&#xff0c;一站式解决商协会需求壁垒&#xff0c;有效快速建立…

护眼小贴士:学生如何正确使用台灯?

随着电子设备的普及和长时间的用眼&#xff0c;长时间盯着屏幕或学习&#xff0c;眼睛需要不断调节焦距&#xff0c;导致眼睛肌肉疲劳&#xff0c;进而引发视力下降。这种现象在年轻一代甚至青少年中尤为普遍&#xff0c;这种疲劳状态不仅影响眼睛的舒适度&#xff0c;还会导致…