寻找最终发现是项目中我们的build.gradle文件中,引入的org.springframework.boot:spring-boot-gradle-plugin依赖,而这个依赖位于classpath下,说明引入的这个插件仅仅是在项目构建时才起作用,当项目进行打包后,并不会把插件包打入到项目的依赖库中,也就是BOOT-INF/lib/路径下 如何去研究在org/springframework/boot/load...
Spring Boot Loader的作用 SpringBoot在可执行jar包中定义了自己的一套规则,比如第三方依赖jar包在/lib目录下,jar包的URL路径使用自定义的规则并且这个规则需要使用org.springframework.boot.loader.jar.Handler处理器处理。它的Main-Class使用JarLauncher,如果是war包,使用WarLauncher执行。这些Launcher内部都会另起一个线...
1.1方式一: 以 maven 插件方式使用 SpringLoader 1.1.1 在 pom 文件中添加插件配置 1.1.2 使用 maven 的命令起来启动spring-boot:run 1.2方式二:在项目中直接使用 jar 包的方式 1.2.1添加 springloader 的 jar 包 1.2.2启动方式 2. DevTools 工具 2.1 简介 2.1.1 属性默认值 2.1.2 自动重启 2.1.3 Live...
上面这一段代码是在 Launcher 这个类里,所以 getClass().getProtectionDomain() 等同于 org.springframework.boot.loader.Launcher.class.getProtectionDomain() 最终获取到的path就是spring-boot-maven-plugin 打出的fat jar的绝对路径。 第二步,调用 launch() 方法 构建完Launcher之后,就开始进行第二步,调用 launc...
spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。 其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方...
LaunchedURLClassLoader的作用是在FAT JAR(Jar in Jar)这样的目录结构中,能够找到要load的class(依赖中的类或者应用自己的类),并且load他们。 我们看看这个class load是怎么load 我们在springboot应用中定义的main class,也就是应用的入口程序的。 在org.springframework.boot.loader.MainMethodRunner中,通过LaunchedURL...
如下图所示是一个Spring Boot应用启动过程的内存快照,可以看到,在“配置列表对象”中除了Spring自带的配置类,还有第三方的自动配置类。我们可以根据SpringFactoriesLoader规定的协议自定义配置类。上面框线标注的配置类对应下面的META-INF/spring.factories配置文件,这个Properties格式的文件中主键(Key)可以是接口、注解...
URLClassLoader 是一种特殊的类加载器,可以从指定的 URL 中加载类和资源。它的主要作用是动态加载外部的 JAR 包或者类文件,从而实现动态扩展应用程序的功。为了便于管理动态加载的jar包,自定义类加载器继承URLClassloader。 /** * 自定义类加载器 * * @author lijianyu * @date 2023/04/03 17:54 **/publi...
最终的执行方法就是下面这个方法,通过注释可以看出,该方法的作用就是将 spring-boot-loader 的classes 写入到 FatJar 中。 JarLaunch 基本原理 基于前面的分析,这里考虑一个问题,能否直接通过 java BootStrap 来直接运行 SpringBoot 工程呢?这样在不需要 -jar 参数和 JarLaunch 引导的情况下,直接使用最原始的 java...