当前位置: 首页 > news >正文

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版本不同&…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Java 加密常用的各种算法及其选择

在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...