基于JDK8的SpringBoot-2.7.6应用程序的jar包能直接通过java -jar 命令运行的原因

文章目录

  • 前言
  • 一、JAR是什么?
  • 二、嵌套JAR
    • 1.java官方不支持嵌套jar读取和加载
    • 2.嵌套“shade” jar 方案
    • 3.SpringBoot的解决方案
  • 三、SpringBoot的Executable Jars
    • 1.核心支持模块(spring-boot-loader)
    • 2.运行调试工具(JDWP)
      • 2.1.保姆级IDEA添加JDWP远程调试示例
    • 3.运行调试(java -jar)
      • 3.1.JAR启动入口:org.springframework.boot.loader.JarLauncher.main(String[] args)
      • 3.2.主启动方法:Launcher.launch(String[] args)
      • 3.3.应用自身启动实际执行的方法:MainMethodRunner.run()
  • 四、总结
    • 1.SpringBoot应用程序jar包可以通过java -jar 直接运行的原因?
    • 2.SpringBoot应用程序通过java -jar运行和直接在IDEA里面运行在类加载上最大的区别?
    • 3.MainMethodRunner的run() 方法的“mainMethod.invoke(null, new Object[] { this.args });”代码行中调用反射方法对象传“null”为什么能够正确执行?


前言

Spring Boot Maven 插件在 Apache Maven 中提供 Spring Boot 支持。 它允许您打包可执行的 jar 或战争存档、运行 Spring Boot 应用程序、生成构建信息并在运行集成测试之前启动 Spring Boot 应用程序。该插件可以创建包含应用程序所有依赖项的可执行存档(jar 文件和 war 文件),然后可以使用 “java -jar”命令运行应用程序。本文的JAR规范参照的版本为JDK8,SpringBoot调试的版本为2.7.6,参照本文调试的时候注意版本之间的差异。


一、JAR是什么?

JAR(Java Archive)是一种独立于平台的文件格式,是一种基于流行的ZIP文件格式, 用于将多个文件聚合为一个文件。多个 Java 小程序及其 必要的组件(.class 文件、图像和声音)可以是 捆绑在 JAR 文件中,随后下载到浏览器中 单个HTTP事务,大大提高了下载速度。这 JAR 格式还支持压缩,从而减小文件大小, 进一步缩短下载时间。此外,小程序作者 可以对 JAR 文件中的各个条目进行数字签名以进行身份验证 他们的起源,它是完全可扩展的。
JAR 文件是 本质上是一个包含可选 META-INF 的 zip 文件 目录。JAR 文件可以通过命令行 jar 工具创建,也可以使用 Java 平台中的 java.util.jar API 创建。对名称没有限制 JAR 文件,它可以是特定平台上的任何合法文件名。在许多情况下,JAR 文件不仅仅是简单的 java 存档 类文件和/或资源。它们被用作构建块 用于应用程序和扩展。META-INF 目录,如果 exists,用于存储包和扩展配置数据, 包括安全性、版本控制、扩展和服务。

  • oracle官方关于JDK8的Java Archive (JAR) Files的介绍文档

  • oracle官方关于JDK8版本将程序打包到JAR文件的介绍文档


二、嵌套JAR

嵌套JAR就是将很多依赖的JAR包打成到一个大的JAR包中,即JAR包中包含JAR包,Apache Maven提供了maven-shade-plugin插件支持这种嵌套打包。

1.java官方不支持嵌套jar读取和加载

Java 不提供任何标准方法来加载嵌套的 jar 文件(即本身包含在 jar 中的 jar 文件)。 如果您需要分发一个独立的应用程序,而该应用程序可以从命令行运行而无需解压缩,这可能会有问题(ClassNotFoundException),主要有如下两个:

  • java官方没有提供嵌套JAR读取的API实现
  • java官方没有提供嵌套JAR的类加载实现

java官方关于使用RMI下载动态java代码到VM进程运行的描述如下:
java.rmi.server.codebase 指定的类加载位置URL可以是jar包,也可以是‘/’结尾的类路径,但不可以是嵌套式的uber-jar包中的jar
在这里插入图片描述

2.嵌套“shade” jar 方案

为了解决这个问题,许多开发人员使用“shaded”jar。 一个“shaded” jar 将所有 jar 中的所有类打包到一个“uber jar”中。 “shaded” jar 的问题在于,很难看到应用程序中实际存在哪些库。 如果在多个 jar 中使用相同的文件名(但内容不同),也可能有问题,Apache Maven提供了maven-shade-plugin插件支持“shade”jar的打包。

  • Apache Maven Shade Plugin参照文档
    在这里插入图片描述

3.SpringBoot的解决方案

Spring Boot 采用了一种不同的方法,可以让你直接嵌套 jar。通过约定目录结构(layers.idx),约定类路径索引(classpath.idx)等方式,定义了SpringBoot的“uber jar”目录结构。通过扩展JarFile、自定义JarFileArchive归档模型,扩展官方JarURLConnection的jar读取器(JarURLConnection),扩展官方的URLClassLoader类加载器(LaunchedURLClassLoader),自定义引导类作为可执行 jar 的主入口(JarLauncher)等一系列扩展,实现了对嵌套jar的读取和类加载支持。

  • SpringBoot关于可执行的“uber jar”的工作原理的介绍文档
  • SpringBoot 为 Maven 和 Gradle 提供了构建工具插件
    在这里插入图片描述

三、SpringBoot的Executable Jars

1.核心支持模块(spring-boot-loader)

spring-boot-loader模块使 Spring Boot 支持可执行的 jar 和 war 文件。 如果您使用 Maven 插件或 Gradle 插件,则会自动生成可执行 jar,您通常不需要知道它们工作原理的详细信息。如果需要了解改模块的代码实现,需要在SpringBoot项目中引入如下依赖并下载源码资源:

<dependencies><dependency><groupId>org.springframework.boot

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

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

相关文章

vue3之echarts3D环柱饼图

vue3之echarts3D环柱饼图 效果&#xff1a; 版本 "echarts": "^5.4.1", "echarts-gl": "^2.0.9" 核心代码&#xff1a; <template><div class"content"><div ref"eCharts" class"chart&…

运动耳机怎么选?运动耳机什么牌子的好?2024运动无线耳机推荐

科学有规律的锻炼对身体有很多好处。很多人选择通过跑步来保持健康&#xff0c;而在跑步时&#xff0c;戴上耳机听音乐已经成为了许多人的习惯。这不仅可以放松心情&#xff0c;还可以提高身心免疫力。在健身房里&#xff0c;也会看到很多人选择佩戴运动耳机来增强他们的锻炼体…

elk之安装和简单配置

写在前面 本文看下elk的安装和简单配置&#xff0c;安装我们会尝试通过不同的方式来完成&#xff0c;也会介绍如何使用docker&#xff0c;docker-compose安装。 1&#xff1a;安装es 1.1&#xff1a;安装单实例 下载es安装包 在这里 下载&#xff0c;下载后解压到某个目录…

Idea设置代理后无法clone git项目

背景 对于我们程序员来说&#xff0c;经常上github找项目、找资料是必不可少的&#xff0c;但是一些原因&#xff0c;我们访问的时候速度特别的慢&#xff0c;需要有个代理&#xff0c;才能正常的访问。 今天碰到个问题&#xff0c;使用idea工具 clone项目&#xff0c;速度特…

Java入门高频考查基础知识8(腾讯18问1.5万字参考答案)

刷题专栏&#xff1a;http://t.csdnimg.cn/gvB6r Java 是一种广泛使用的面向对象编程语言&#xff0c;在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性&#xff0c;适用于多种应用场景&#xff0c;包括企业应用、移动应用、嵌入式系统等。 以下是几个面试技巧&…

Django模型(四)

一、数据操作初始化 from django.db import models# Create your models here. class Place(models.Model):"""位置信息"""name = models.CharField(max_length=32,verbose_name=地名)address = models.CharField(max_length=64,null=True,verbo…

【日常总结】如何快速迁移Navicat中的全部连接设置到新安装的Navicat中?

一、场景 二、需求 三、解决方案 Stage 1&#xff1a;“文件”-->“导出连接”。 Stage 2&#xff1a;获取备份文件 connections.ncx Stage 3&#xff1a;导入connections.ncx 四、不足 一、场景 公司电脑换新&#xff0c;所有软件需要重装&#xff0c;包括navicat 1…

深度学习(7)--卷积神经网络项目详解

一.项目介绍&#xff1a; 用Keras工具包搭建训练自己的一个卷积神经网络(Simple_VGGNet&#xff0c;简单版VGGNet)&#xff0c;用来识别猫/狗/羊三种图片。 数据集&#xff1a; 二.卷积神经网络构造 查看API文档 Convolution layers (keras.io)https://keras.io/api/layers/…

【Tomcat与网络1】史前时代—没有Spring该如何写Web服务

在前面我们介绍了网络与Java相关的问题&#xff0c; 最近在调研的时候发现这块内容其实非常复杂&#xff0c;涉及的内容多而且零碎&#xff0c;想短时间梳理出整个体系是不太可能的&#xff0c;所以我们还是继续看Tomcat的问题&#xff0c;后面有网络的内容继续补充吧。 目录 …

酒店|酒店管理小程序|基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)

酒店管理小程序目录 目录 基于微信小程序的酒店管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 (1) 用户信息管理 (2) 酒店管理员管理 (3) 房间信息管理 2、小程序序会员模块的实现 &#xff08;1&#xff09;系统首页 &#xff0…

Visual Studio 2022 打开“程序包管理器控制台”失败

Visual Studio 2022 打开“程序包管理器控制台”失败 昨天下午&#xff0c;正在用Visual studio 2022写代码&#xff0c;当使用EF core 做数据迁移时&#xff0c;需要用到“程序包管理器控制台”&#xff0c;打开失败&#xff0c;前一秒还好好的&#xff0c;怎么突然就用不了了…

excel给数据库初始化/旧数据处理(自动sql拼装)

思路&#xff1a; 首先导出数据到excel编写单条数据操作的sql利用excel CONCATENATE 函数自动生成&#xff0c;每一行数据的操作sql 小技巧:对于需要套娃的字段值&#xff0c;可以加一个临时列同样使用CONCATENATE函数进行sql拼装 案例&#xff1a; 1.临时列:CONCATENATE(C2, …

【计算机网络】网络的网络

网络的网络 客户 customer 接入ISP提供商 provider 全球承载ISP多个ISP的层级结构 第一层ISP &#xff08;tier-1 ISP &#xff09; 位于顶部 区域ISP &#xff08;reginal ISP&#xff09;Level 3通信 &#xff0c;AT&T&#xff0c;Sprint &#xff0c;NTT存在点&#x…

嘿嘿,vue之输出土味情话

有点好玩&#xff0c;记录一下。通过按钮调用网站接口&#xff0c;然后解构数据输出土味情话。 lovetalk.vue: <!--vue简单框架--> <template> <!-- 这是一个div容器&#xff0c;用于显示土味情话 --> <div class"talk"> <!-- 当点…

记录springboot bug

mybatis bug mapper 自动生成xml 产生错误 首先我这个bug十分奇怪,不管是报错,还是解决方法 首先,我还原我bug的过程 我首先要在 ordersMapper生成一个方法 本来是这样的方法 Mapper public interface OrdersMapper extends BaseMapper<Orders> {List<GoodsSales…

故障诊断 | 一文解决,LSTM长短期记忆神经网络故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现LSTM长短期记忆神经网络故障诊断 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

扫地机器人(二分算法+贪心算法)

1. if(robot[i]-len<sweep)这个代码的意思是——如果机器人向左移动len个长度后&#xff0c;比现在sweep的位置&#xff08;现在已经覆盖的范围&#xff09;还要靠左&#xff0c;就是覆盖连续不起来&#xff0c;呢么这个len就是有问题的&#xff0c;退出函数&#xff0c;再…

React Native学习记录

一、创建RN项目的时候是空文件夹的问题 1.使用npx react-native init RNDemos初始化项目的时候&#xff0c;会报错&#xff0c;模版错误&#xff0c;然后创建出来一个空的文件夹 2.如果出现这种情况&#xff0c;需要设置npm install -g react-native-cli 3.安装完成以后再次初…

iOS开发Xcode中的ld64和-ld_classic是什么意思

在iOS应用程序开发中&#xff0c;Xcode是一款广泛使用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;而链接器是构建应用程序的关键组成部分之一。在Xcode中&#xff0c;我们常常会遇到两个重要的概念&#xff1a;ld64和-ld_classic。它们分别代表了默认链接器和经典链…

【大厂AI课学习笔记】1.3 人工智能产业发展(1)

我国人工智能政策&#xff0c;分为5个阶段。从探索期&#xff0c;到后面的4个阶段。 MORE:&#xff08;以下为文心一言4.0的参考内容&#xff0c;和腾讯课程资料的分阶段&#xff0c;略有不同&#xff09; 我国的人工智能政策发展可以大致分为以下几个阶段&#xff0c;每个阶段…