一、普通jar包和SpringBoot jar包有什么区别?什么是jar包??

(1)什么是Jar包?

定义:

        JAR 包(Java Archive) 是 Java 平台标准的归档文件格式,用于将多个 Java 类文件、资源文件(如配置文件、图片等)、元数据(如清单文件)和其他依赖打包成一个独立的压缩文件。它是 Java 生态中代码分发、部署和运行的核心载体。

结构:
  • 类文件:包含 Java 类的字节码文件,扩展名为 .class。这些类文件是 Java 程序的核心,包含了程序的逻辑代码。
  • 资源文件:如配置文件(.properties.xml 等)、图片文件(.jpg.png 等)、音频文件(.mp3.wav 等)。这些资源文件可以被 Java 程序在运行时读取和使用。
  • 清单文件:位于 META - INF/MANIFEST.MF,它是一个文本文件,包含了 JAR 包的元数据信息,如版本号、主类、依赖的库等。清单文件在 JAR 包的使用和管理中起着重要的作用。

JAR 文件本质是一个 ZIP 压缩包,可通过标准 ZIP 工具(如 jarunzip)创建、解压或查看内容

jar tf example.jar    # 查看 JAR 内容
unzip -l example.jar  # 解压查看结构

(2) 普通jar包和SpringBoot jar包有什么区别

特性普通 JAR可执行 JAR(如 Spring Boot)
入口类Main-Class 或仅为库入口必须指定 Main-Class
依赖管理依赖需外部配置,需手动配置(如 -cp所有依赖内嵌在 BOOT-INF/lib
启动方式java -cp example.jar MainClassjava -jar example.jar
类加载器系统类加载器自定义类加载器(优化资源加载)LaunchedURLClassLoader
典型场景第三方库、工具类集合独立运行的 Spring Boot 应用
服务器依赖需外部服务器部署 WAR内嵌服务器,无需外部容器

ps: Spring Boot JAR 的特殊结构

example.jar
├── META-INF
│   └── MANIFEST.MF          // 包含 Main-Class 和 Start-Class
├── BOOT-INF
│   ├── classes              // 项目编译后的类文件
│   └── lib                  // 所有依赖的第三方库
├── org
│   └── springframework
│       └── boot
│           └── loader       // Spring Boot 的类加载器实现
└── ...

二、Maven配置打包/Gradle 配置(使用 org.springframework.boot 插件)打包

(1)Maven

Step 1: 添加插件到 <build> 节点
<build><plugins><plugin><groupId>org.springframework.boot</groupId>```html spring-boot-maven-plugin</artifactId><version>3.1.0</version> <!-- 使用最新版本 --><executions><execution><goals><!-- 绑定插件到 Maven 的打包阶段 --><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>
Step 2: 执行打包命令
mvn clean package
打包结果
  • 生成的 JAR 文件位于 target/ 目录,名称格式为 {project-name}-{version}.jar
  • 该 JAR 包含:
    • BOOT-INF/classes:项目的编译文件。
    • BOOT-INF/lib:所有依赖的库。
    • 自定义类加载器(org/springframework/boot/loader)。
    • 修改后的 MANIFEST.MF(指定 Main-Class: JarLauncher)。

(2)Gradle

假设项目基于 Gradle 构建,需在 build.gradle 文件中配置:

Step 1: 应用 Spring Boot 插件
plugins {id 'org.springframework.boot' version '3.1.0' // 最新版本id 'io.spring.dependency-management' version '1.1.0'id 'java'
}
Step 2: 执行打包命令
gradle bootJar
打包结果
  • 生成的 JAR 文件位于 build/libs/ 目录。
  • 结构和内容与 Maven 生成的相同。

(3) 插件核心功能(原理)

spring-boot-maven-pluginorg.springframework.boot 插件会完成以下操作:

(1) 重新打包(Repackage)
  • 将 Maven/Gradle 默认生成的普通 JAR(*.jar.original)重新组装为 可执行 JAR
  • 默认 JAR 会被重命名为 *.jar.original,可执行 JAR 替换为原名称。
(2) 依赖内嵌
  • 将所有依赖的第三方库(包括 spring-boot-starter-*)打包到 BOOT-INF/lib 目录。
  • 项目自身的编译文件(.class 和资源)放在 BOOT-INF/classes
(3) 分层打包(Layered JAR)

从 Spring Boot 2.3+ 开始,插件支持 分层打包,优化 Docker 镜像构建:

  • 将依赖分为不同层级(如 dependenciesspring-boot-loadersnapshot-dependenciesapplication)。
  • 通过 <layers> 配置自定义分层规则(Maven):
    <plugin><groupId>org.springframework.boot</groupId>```html spring-boot-maven-plugin</artifactId><configuration><layers><enabled>true</enabled><!-- 自定义层配置 --><configuration>${project.basedir}/layers.xml</configuration></layers></configuration>
    </plugin>
    
    (4) 自定义 MANIFEST.MF
  • 修改清单文件,指定 Main-Class: JarLauncherStart-Class: 用户的主类
  • 例如:
    Main-Class: org.springframework.boot.loader.JarLauncher
    Start-Class: com.example.MyApplication
    

    总结 SpringBoot Jar 实现了:

  • 依赖内嵌:将所有依赖和资源打包到单个 JAR。
  • 自定义类加载器:通过 JarLauncher 加载嵌套的 JAR 文件。只需简单配置,即可将 Spring Boot 项目快速部署为生产级独立应用。
  • 分层优化:提升 Docker 镜像构建的缓存效率。
  • 一键运行:无需外部配置,直接通过 java -jar 启动应用。

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

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

相关文章

算法-基础算法-递归算法(Python)

文章目录 前言递归和数学归纳法递归三步走递归的注意点避免栈溢出避免重复运算 题目斐波那契数反转链表 前言 递归&#xff08;Recursion&#xff09;&#xff1a;指的是一种通过重复将原问题分解为同类的子问题而解决的方法。在绝大数编程语言中&#xff0c;可以通过在函数中再…

TVFEMD-CPO-TCN-BiLSTM多输入单输出模型

47-TVFEMD-CPO-TCN-BiLSTM多输入单输出模型 适合单变量&#xff0c;多变量时间序列预测模型&#xff08;可改进&#xff0c;加入各种优化算法&#xff09; 时变滤波的经验模态分解TVFEMD时域卷积TCN双向长短期记忆网络BiLSTM时间序列预测模型 另外以及有 TCN-BILSTM …

深入浅出Node.js中间件机制

我们用一个实际的例子来看看中间件是如何运作的。假设我们有一个非常简单的Express应用&#xff0c;它只有两个中间件函数&#xff1a; const express require(express); const app express();app.use((req, res, next) > {console.log(第一个中间件);next(); });app.use…

Vue-15-前端框架Vue之应用基础编程式路由导航

文章目录 1 RouterLink的replace属性1.1 App.vue1.2 应用效果2 编程式路由导航2.1 场景一Home.vue2.2 场景二News.vue3 路由重定向3.1 index.ts3.2 Detail.vue3.3 About.vue1 RouterLink的replace属性 路由每次跳转都有记录,默认是push,可以改为replace。 RouterLink支持两…

android14 设置下连续点击5次Settings标题跳转到拨号界面

部分项目隐藏了拨号器&#xff0c;但开发者需要间距跳转到拨号界面 设置一级界面&#xff1a; packages/apps/Settings/src/com/android/settings/homepage/SettingsHomepageActivity.java 通过dispatchTouchEvent方法先获取Settings标题的区域X,Y数据。 import java.util.Set…

MP分页和连表常用写法

1. 分页查询 方案一&#xff1a;MyBatis XML MyBatis 内置的使用方式&#xff0c;步骤如下&#xff1a; ① 创建 AdminUserMapper.xml 文件&#xff0c;编写两个 SQL 查询语句&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE m…

使用 Spring AI Alibaba构建 AI Code Review 应用

很早的时候就想着用AI来做Code Review&#xff0c;最近也看到了一些不错的实现&#xff0c;但是没有一个使用Java来构建的&#xff0c;看的比较费劲&#xff0c;虽然说语言只是一种工具&#xff0c;但是还是想用Java重新写一遍&#xff0c;正好最近Spring AI Alibaba出了正式版…

力扣1590. 使数组和能被 P 整除

这一题的难点在于模运算&#xff0c;对模运算足够了解&#xff0c;对式子进行变换就很容易得到结果&#xff0c;本质上还是一道前缀和哈希表的题 这里重点讲一下模运算。 常见的模运算的用法 (a-b)%k0等价于 a%kb%k 而在这一题中由于多了一个len&#xff0c;&#xff08;数组的…

FPGA内部资源介绍

FPGA内部资源介绍 目录 逻辑资源块LUT&#xff08;查找表&#xff09;加法器寄存器MUX&#xff08;复用器&#xff09;时钟网络资源 全局时钟网络资源区域时钟网络资源IO时钟网络资源 时钟处理单元BLOCK RAMDSP布线资源接口资源 用户IO资源专用高速接口资源 总结 1. 逻辑资源…

CSS 列表

CSS 列表 引言 CSS 列表是网页设计中常用的一种布局方式&#xff0c;它能够帮助我们以更灵活、更美观的方式展示数据。本文将详细介绍 CSS 列表的创建、样式设置以及常用技巧&#xff0c;帮助您更好地掌握这一重要技能。 CSS 列表概述 CSS 列表主要包括两种类型&#xff1a…

spring中的@Cacheable缓存

1. 使用方法 在方法上面加上注解Cacheable&#xff0c; OverrideCacheable(cacheNames "userCache", key "#id")public User getUserById(Long id) {System.out.println("查询数据库了");return getById(id);}如果你的项目中引入了&#xff…

Node.js特训专栏-实战进阶:9.MySQL连接池配置与优化

🔥 欢迎来到 Node.js 实战专栏!在这里,每一行代码都是解锁高性能应用的钥匙,让我们一起开启 Node.js 的奇妙开发之旅! Node.js 特训专栏主页 专栏内容规划详情 MySQL连接池配置与优化:提升数据库交互性能的关键 一、MySQL连接池基础概念 1.1 什么是连接池? 连接池是…

【innovus基础】- 如何手动画线?

后端实现的过程就是将逻辑连线变为物理的金属连线的过程。 1、打开Pin shape的Visible 和 Selected开关&#xff0c;使其可见并可选 2、选中想要画线的IOCell 3、鼠标选中对应的pin 4、使用dbGet 获取此pin脚逻辑连线net的名字&#xff1b; dbGet selected.net.name 5、使用画…

element-plus限制日期可选范围(这里以7天为例)

element-plus日期范围限制功能实现逻辑 1. 需求&#xff1a;通过限制时间的可选范围减少请求的数据量 2. 实现效果&#xff1a; 日期选择器做限制 3. 代码逻辑&#xff1a; 思路&#xff1a;通过calendar-change获取开始日期&#xff0c;然后通过disabled-date禁用不满足条件…

机器学习2-梯度下降与反向传播

损失函数 与 平均方差函数 傻傻分不清 损失函数是概念&#xff1b;平均方差函数是具体的实现 损失函数&#xff08;如均方误差 MSE&#xff09;用于衡量模型预测值与真实值之间的差距。损失越小&#xff0c;说明模型对当前数据的拟合越好。 但模型并非拟合度越高越好&#xf…

安全生产风险管控平台:企业安全管理的智能化解决方案

在工业生产、建筑施工、能源化工等领域&#xff0c;安全生产是企业可持续发展的基石。然而&#xff0c;传统安全管理模式依赖人工巡检、纸质记录和事后处理&#xff0c;难以满足现代化企业的高效风险管控需求。安全生产风险管控平台应运而生&#xff0c;它利用物联网、大数据、…

如何保证数据库与 Redis 缓存的一致性?

在现代互联网应用中&#xff0c;Redis 缓存几乎是性能优化的标配。但在使用过程中&#xff0c;一个绕不过去的问题就是&#xff1a; 如何保证 Redis 缓存与数据库之间的数据一致性&#xff1f; 特别是在高并发场景下&#xff0c;读写操作错位可能导致缓存中出现脏数据&#xff…

现代 JavaScript (ES6+) 入门到实战(三):字符串与对象的魔法升级—模板字符串/结构赋值/展开运算符

在前两篇&#xff0c;我们升级了变量和函数。今天&#xff0c;我们要给 JavaScript 中最常用的两种数据类型——字符串&#xff08;String&#xff09;和对象&#xff08;Object&#xff09;——装备上 ES6 带来的强大魔法。 准备好告别丑陋的 号拼接和重复的对象属性赋值了吗…

GitLab 备份恢复与配置迁移详尽教程(实战版)

&#x1f6e0; GitLab 备份恢复与配置迁移详尽教程&#xff08;实战版&#xff09; &#x1f9f1; 一、环境准备 1.1 检查版本一致性 恢复目标机 GitLab 版本必须与备份文件所用版本一致或兼容&#xff08;推荐相同版本&#xff09; 查看当前 GitLab 版本&#xff1a; sudo g…

英飞凌高性能BMS解决方案助力汽车电动化

随着电动汽车越来越被大众接受&#xff0c;车辆电气化、智能化程度越来越高&#xff0c;如何提高电动汽车的续航里程&#xff0c;同时保障车辆安全可靠持久运行是当前最主要的技术难题之一。而先进的电池管理系统 (BMS)有助于克服电动汽车广泛普及的关键障碍&#xff1a;续航里…