Spring Boot打出的jar包为什么可以独立运行
闲来无事,浏览网页看到有人说jar包为什么可以独立运行,想起前端时间写的jar打包后无法正常运行处理。jar解压缩后有多个文件夹,内部存放运行所需jar包和一些配置文件,本文做一个简单介绍。
JAR包和WAR包区别
在Java开发中,JAR(Java ARchive)包和WAR(Web Application ARchive)包都是用来打包文件和资源的归档文件,但它们的用途和内容有所不同。
1. 用途
- JAR包:通常用于存储Java类文件、与应用程序相关的元数据和资源(如文本、图片等)。JAR包可以作为库被其他应用程序依赖,或者包含可执行的Java应用程序。
- WAR包:专门用于分发Java Web应用程序。它包含Servlet、JSP、HTML、JavaScript、CSS等Web应用所需的所有组件。
2. 结构
- JAR包:可以包含任意的文件和文件夹,通常包含一个
META-INF目录,里面包含了MANIFEST.MF文件,这个文件定义了包的版本、主类等信息。 - WAR包:具有特定的目录结构,必须包含一个
WEB-INF文件夹,其中包含web.xml(描述了Web应用的结构和内容)、应用程序库(/WEB-INF/lib目录下的JAR文件)和类文件(/WEB-INF/classes目录)。
3. 使用场景
- JAR包:适用于任何Java应用,无论是桌面应用还是服务器端应用。
- WAR包:仅用于Web应用服务器如Tomcat、Jetty等,用于部署Web应用。
4. 执行
- JAR包:如果包含主类,可以直接通过
java -jar命令运行。 - WAR包:需要部署到支持Servlet和JSP的Web服务器或应用服务器上,不能直接运行。
JAR包和WAR包都是Java环境中用于打包文件的格式,但JAR包更通用,而WAR包专门用于Web应用的分发和部署。
解压缩后文件目录
JAR 包结构示例
myapp.jar
├── META-INF
│ ├── MANIFEST.MF
│ └── ...
├── com
│ └── example
│ ├── Main.class
│ ├── utils
│ │ ├── Helper.class
│ │ └── Constants.class
│ └── services
│ ├── UserService.class
│ └── ProductService.class
└── resources├── config.properties└── messages.properties
各个文件夹功能
1.META-INF:
- MANIFEST.MF: 这个文件包含关于 JAR 包的元数据,比如版本信息、主类(Main-Class)等。可以在这里指定程序的入口点。
Manifest-Version: 1.0
Main-Class: com.example.Main
Class-Path: lib/dependency1.jar lib/dependency2.jar
Implementation-Title: My Application
Implementation-Version: 1.0.0
Implementation-Vendor: Example Corp
常见属性及功能解释:
Manifest-Version:
- 功能: 指定清单文件的版本。通常是
1.0。 - 示例:
Manifest-Version: 1.0
Main-Class:
- 功能: 指定JAR文件的主类,即包含
public static void main(String[] args)方法的类。当使用java -jar命令运行JAR文件时,Java虚拟机(JVM)会从这个类开始执行。 - 示例:
Main-Class: com.example.Main
Class-Path:
- 功能: 指定运行时类路径。如果JAR文件依赖于其他JAR文件,可以在此处列出这些依赖。路径可以是相对路径或绝对路径。
- 示例:
Class-Path: lib/dependency1.jar lib/dependency2.jar
Implementation-Title:
- 功能: 指定JAR文件的标题或名称。通常用于标识应用程序的名称。
- 示例:
Implementation-Title: My Application
Implementation-Version:
- 功能: 指定JAR文件的版本。通常用于标识应用程序的版本号。
- 示例:
Implementation-Version: 1.0.0
Implementation-Vendor:
- 功能: 指定JAR文件的供应商或开发者。通常用于标识开发该应用程序的公司或个人。
- 示例:
Implementation-Vendor: Example Corp
2.com/example:
- Main.class: 主类,程序的入口点。通常包含
public static void main(String[] args)方法。 - utils: 实用工具类文件夹。
- Helper.class: 一些辅助方法,可能用于日志记录、数据处理等。
- Constants.class: 常量定义类,存储全局常量。
- services: 业务逻辑类文件夹。
- UserService.class: 用户相关的服务类,可能包含用户注册、登录等方法。
- ProductService.class: 产品相关的服务类,可能包含产品查询、添加等方法。
3.resources:
- config.properties: 配置文件,存储应用程序的配置信息,比如数据库连接、API 密钥等。
- messages.properties: 国际化消息文件,存储应用程序中的文本信息,用于多语言支持。
为什么可以独立运行
Spring Boot 允许创建可独立运行的 JAR 文件,这种 JAR 文件被称为 “可执行 JAR” 或 “fat JAR”(有时也称为 “uber JAR”)。这种 JAR 文件包含了所有必要的依赖库、类文件和资源,使得应用可以通过一个简单的 java -jar 命令运行,而无需额外的类路径设置。这是通过以下几个关键的配置和技术实现的:
1. 内嵌容器
Spring Boot 应用通常内嵌一个 Web 服务器(如 Tomcat、Jetty 或 Undertow),这意味着不需要部署到外部服务器。应用启动时,内嵌的 Web 服务器也会被启动,从而处理 HTTP 请求。
2. Spring Boot Starter
Spring Boot 使用一系列的 “starters” 来简化依赖管理。这些 starters 负责将应用所需的依赖库自动包含在最终的 JAR 文件中。例如,spring-boot-starter-web 会添加 Tomcat 和 Spring MVC 的依赖。
3. Spring Boot Maven 插件
这些插件负责构建过程中的重要任务,如打包应用和依赖项。特别是,它们会创建一个包含所有依赖的 JAR 文件,并且配置好 META-INF/MANIFEST.MF 文件,使其指向一个特殊的类加载器,这个类加载器能够从 JAR 文件内部加载类和资源。
4. 类加载器
Spring Boot 使用自定义的类加载器来从 JAR 文件内部的嵌套 JAR 文件中加载类。这意味着,尽管所有的库都被打包在一个单一的 JAR 文件中,Spring Boot 仍然能够从这些库中加载类。
5. MANIFEST.MF 配置
在 META-INF/MANIFEST.MF 文件中,Spring Boot 配置了 Main-Class 属性,该属性指向了 org.springframework.boot.loader.JarLauncher。这是一个特殊的启动器,负责初始化 Spring Boot 应用。此外,还有 Start-Class 属性,它指定了包含 main 方法的实际入口类。
示例:MANIFEST.MF 中的关键配置
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.MyApplication
这种配置方式使得 Spring Boot 应用可以作为一个独立程序运行,而不需要任何外部依赖,除了 Java 运行时环境。这极大地简化了部署和分发过程,使得开发者可以轻松地在不同环境中部署和运行他们的应用。
相关文章:
Spring Boot打出的jar包为什么可以独立运行
闲来无事,浏览网页看到有人说jar包为什么可以独立运行,想起前端时间写的jar打包后无法正常运行处理。jar解压缩后有多个文件夹,内部存放运行所需jar包和一些配置文件,本文做一个简单介绍。 JAR包和WAR包区别 在Java开发中&#…...
“微软蓝屏”事件:网络安全与稳定性的深刻反思
🌈所属专栏:【其它】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…...
【技术升级】Docker环境下Nacos平滑升级攻略,安全配置一步到位
目前项目当中使用的Nacos版本为2.0.2,该版本可能存在一定的安全风险。软件的安全性是一个持续关注的问题,尤其是对于像Nacos这样的服务发现与配置管理平台,它在微服务架构中扮演着核心角色。随着新版本的发布,开发团队会修复已知的…...
[题解]CF1401E.Divide Square(codeforces 05)
题目描述 There is a square of size 106106106106 on the coordinate plane with four points (0,0)(0,0) , (0,106)(0,106) , (106,0)(106,0) , and (106,106)(106,106) as its vertices. You are going to draw segments on the plane. All segments are either horizonta…...
软考高级第四版备考--第32天(新一代信息技术及应用)
1、物联网 1.1技术基础 1.1.1感知层:由各种传感器构成,包括温度传感器,二维码标签、RFID标签和读写器,摄像头,GPS等感知终端。感知层是物联网识别物体、采集信息的来源。 1.1.2网络层:由各种网络&#x…...
【RabbitMQ】MQ相关概念
一、MQ的基本概念 定义:MQ全称为Message Queue,是一种提供消息队列服务的中间件,也称为消息中间件。它允许应用程序通过读写队列中的消息来进行通信,而无需建立直接的连接。作用:主要用于分布式系统之间的通信&#x…...
【MySQL是怎样运行的 | 第二篇】MySQL三大日志文件
文章目录 2.MySQL三大日志文件2.1日志文件列表2.1.1 redo log2.1.2 bin log2.1.3 undo log 2.2redo log日志详讲2.3 binglog和redo log有什么区别?2.4一条更新语句的执行过程 2.MySQL三大日志文件 2.1日志文件列表 redo log:重做日志,记录了…...
视图、存储过程、触发器
一、视图 视图是从一个或者几个基本表(或视图)导出的表。它与基 本表不同,是一个虚表,视图只能用来从查询,不能做增删改(虚拟的表) 1.创建视图 创建视图的语法: create view 视图名【view_xxx / v_xxx】 a…...
【学习笔记】解决Serial Communication Library编译问题
【学习笔记】解决编译 Serial Communication Library 时的 Catkin 依赖问题 Serial Communication Library 是一个用 C 编写的用于连接类似 rs-232 串口的跨平台库。它提供了一个现代的 C 接口,它的工作流程设计在外观和感觉上与 PySerial 相似,但串口速…...
在 Windows 环境下实现负载均衡:提升系统性能与可靠性的关键技术
Windows 环境下的负载均衡:提升系统性能与可靠性的关键技术 负载均衡(Load Balancing)是现代网络架构中不可或缺的一部分,通过将请求分配到多台服务器上来提高系统的性能和可靠性。本文将介绍在 Windows 环境下使用负载均衡的基本…...
【Linux】-----工具篇(自动化构建工具make/makefile)
目录 前言 一、是什么? 二、怎么样的? 三、原理及细节 图解代码 细节1:make工作规则 ①依赖文件存在 ②依赖文件不存在 ③依赖文件列表为空(特殊) .PHONY关键字 细节2:makefile识别程序需要重新编译? 四、…...
图的遍历:深度优先搜索(DFS)
引言 图遍历是指按照一定的顺序访问图中的每个顶点。遍历图的两种主要方法是深度优先搜索(Depth-First Search, DFS)和广度优先搜索(Breadth-First Search, BFS)。本文将详细介绍深度优先搜索的定义、算法及其实现。 深度优先搜…...
普元EOS学习笔记-某些版本的EOS提供的maven获取依赖失败的问题解决
前言 普元EOS的开发包中,提供了maven,因为EOS项目的某些依赖只能从普元官方仓库获取,因此,编译EOS项目必须使用EOS提供的maven。 maven拉取依赖失败 某些版本的EOS提供的maven在编译EOS项目的时候会出现拉取失败的现象。 [FATA…...
Pycharm + Pyside6
1. 使用 Qt designer 创建 UI 文件 2. 使用 UIC 工具生成 ui_.py 文件 3. 自定义类导入ui.py 文件的窗口类 4.自定义窗口继承UI窗体类 5. self.setupUi(self) from PySide6.QtWidgets import QApplication, QWidget, QComboBox, QVBoxLayout from ui_test import Ui_Formc…...
强化学习之价值迭代算法动态规划求解悬崖漫步环境(CliffWalking)最优策略及最优状态价值函数
class CliffWalkingEnv:def __init__(self,ncol12,nrow4):self.ncolncol#定义网格世界的列self.nrownrow#定义网格世界的行self.Pself.createP()#转移矩阵P[state][action][(p,next_state,reward,done)]包含下一个状态和奖励def createP(self):P[[[]for i in range(4)]for j in…...
javascript deriveKey和deriveBits()由主密钥派生出新的密钥进行加密
deriveKey 方法的完整示例,演示如何使用 HMAC 作为密钥派生函数(KDF)来从一个给定的秘密(如密码)派生出一个新的 AES 加密密钥。 //创建一个函数来生成随机盐function getRandomSalt(length){let arraynew Uint8Array…...
基于微信小程序的自习室选座系统/基于Java的自习室选座系统/自习室管理系统的设计与实现
获取源码联系方式请查看文章结尾🍅 摘要 自习室选座是学校针对用户必不可少的一个部分。在学校的整个过程中,学生担负着最重要的角色。为满足如今日益复杂的管理需求,各类微信小程序自习室选座也在不断改进。本课题所设计的小程序自习室选座系…...
echarts所遇到的问题,个人记录
TreeMap 矩形树图,label设置富文本之后,无法垂直居中 font-size 支持rem,其余不支持 font-size 支持 rem,但是其余的属性如height,width等不支持 echarts-for-react 绑定事件,会覆盖实例上绑定的 当给cha…...
Skyeye云智能制造企业版源代码全部开放
智能制造一体化管理系统 [SpringBoot2 - 快速开发平台],适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…...
Springboot 整合Elasticsearch
1 java操作ES方式 1.1 操作ES 9300端口(TCP) 但开发中不在9300进行操作 ES集群节点通信使用的也是9300端口如果通过9300操作ES,需要与ES建立长连接 可通过引入spring-data-elasticsearch:transport-api.jar不在9300操作原因:1.springboot版本不同&…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
