前言

写完maven的加密插件后,尝试在boot启动时的类加载过程中编写解密代码时,发现了一个平常没有注意的地方.
那就是boot-jar的启动方式与我们平常编写的可执行jar是存在很大差别的.
所以在这里进行简单的记录,暂时不对一些复杂机制进行.如repackage阶段对jar文件进行的额外处理,boot-jar加载资源的的实现方式,classLoader实现的扩展等

开始

整体流程直接使用时序图进行如下表示

分步描述(必要的)

  • 步骤1 - 由虚拟机触发,调用类org.springframework.boot.loader.JarLauncher.main方法.

    这一步完全等同于我们使用java -jar hello.jar时,调用了自己面写的main方法.
    而我们所打包的boot-jar,不论如何,最终都会执行语句java -jar boot-jar.jar,并调用方法org.springframework.boot.loader.JarLauncher.main

  • 步骤4-10 - 注册JarUrl协议.

    这一步的主要作用是向系统注册新的协议,使boot可以使用自己的方式获取资源信息(针对boot-jar)

  • 步骤11 - 获取boot-jar内的所有资源定位

    结合JarUrl协议,就可以获取资源了

  • 步骤13 - 创建并配置类加载器

    这个加载器的实现,使用了字节码技术.达到了越过JVM并对class进行了读取的效果.
    这么做的目的,个人推测应该是为了能够在扫描所有可能需要加载的类时,保证不让虚拟机加载它们,以较少虚拟机负担.

  • 14-end - 准备并执行我们编写的main方法

    找到我们所表写的main方法所处的类,并直接使用反射进行调用.
    随着main方法的调用,方法体内的SpringApplication相关方法也意味着容器的初始化,应用正式启动

  • end -

SpringBoot系列随笔 - BootJar的启动方式的更多相关文章

  1. SpringBoot系列之集成Dubbo的方式

    SpringBoot系列之集成Dubbo的方式 本博客介绍Springboot框架集成Dubbo实现微服务的3种常用方式,对于Dubbo知识不是很熟悉的,请先学习我上一篇博客:SpringBoot系列 ...

  2. SpringBoot系列-整合Mybatis(注解方式)

    目录 一.常用注解说明 二.实战 三.测试 四.注意事项 上一篇文章<SpringBoot系列-整合Mybatis(XML配置方式)>介绍了XML配置方式整合的过程,本文介绍下Spring ...

  3. springboot系列(三) 启动类中关键注解作用解析

    一.Springboot:请求入口 @SpringBootApplication @EnableAspectJAutoProxy @EnableScheduling @EnableTransactio ...

  4. springboot的mvn与gradle启动方式

    1 很简单,直接鼠标右击项目,run启动项目 2 项目目录下的命令行  mvn spring-boot:run 或者  gradlew bootRun 3 进入libs下或者target下 java ...

  5. SpringBoot系列: Spring支持的异常处理方式

    ===================================视图函数返回 status code 的方式===================================Spring 有 ...

  6. spring-boot的三种启动方式[z]

    https://blog.csdn.net/u011425751/article/details/79507386 有段时间没有写博客了,也在努力的从传统单机开发向分布式系统过度,所以再次做一些笔记, ...

  7. SpringBoot系列: 极简Demo程序和Tomcat war包部署

    =================================SpringBoot 标准项目创建步骤================================= 使用 Spring IDE( ...

  8. SpringBoot系列之学习教程汇总

    对应SpringBoot系列博客专栏,例子代码,本博客不定时更新 一.配置篇 SpringBoot系列之@PropertySource读取yaml文件     >> source down ...

  9. SpringBoot系列之从入门到精通系列教程

    对应SpringBoot系列博客专栏,例子代码,本博客不定时更新 Spring框架:作为JavaEE框架领域的一款重要的开源框架,在企业应用开发中有着很重要的作用,同时Spring框架及其子框架很多, ...

随机推荐

  1. 基于Docker快速搭建ELK【华为云技术分享】

    [摘要] 本文基于自建的Docker平台速搭建一套完整的ELK系统,相关的镜像直接从Docker Hub上获取,可以快速实现日志的采集和分析检索. 准备镜像 l 获取ES镜像:docker pull ...

  2. 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)

    题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...

  3. 淘宝适配 flexible.js

    1.引入 阿里cdm文件,也可以自己下载下来引用,不需要在添加<meta name="viewport"">标签了 <script src=" ...

  4. 2018HDU多校训练一 C -Triangle Partition

    Chiaki has 3n3n points p1,p2,-,p3np1,p2,-,p3n. It is guaranteed that no three points are collinear.  ...

  5. 深入理解 Java 方法

    方法(有的人喜欢叫函数)是一段可重用的代码段.

  6. RequireJS 打包工具

    r.js是RequireJS的一个附产品,支持在 NodeJS环境下运行AMD程序,并且其包含了一个名为RequireJS Optimizer的工具,可以为项目完成合并脚本等优化操作 RequireJ ...

  7. springboot自动装配(3)---条件注解@Conditional

    之前有说到springboot自动装配的时候,都是去寻找一个XXXAutoConfiguration的配置类,然而我们的springboot的spring.factories文件中有各种组件的自动装配 ...

  8. WinForm 自定义控件 - RooF

    由3个标签组成 直接代码 public partial class Roof : UserControl { public Roof() { InitializeComponent(); } priv ...

  9. flash插件

    偶尔见到别人的博客侧边栏 有一些很有意思的flash插件,也想加入到自己博客里面,这里来大概讲一下~ 一.支持js代码 首先要在  博客设置 >开启博客侧边栏公告的js代码支持,提交审核后 很快 ...

  10. CCF-CSP题解 201903-3 损坏的RAID5

    先吐槽先吐槽!因为输入太大,需要用fgets,读n个字符或读到回车终止. char *fgets(char *str, int n, FILE *stream) 因为scanf模拟考试T了10+次.因 ...