主题
spring-boot-loader
spring-boot-loader
是 Spring Boot 中用于处理可执行 JAR 文件的模块,帮助实现了 Spring Boot "开箱即用" 的核心理念
shell
java -jar myapp.jar
包含了必要的类和逻辑,可以加载嵌套的 JAR 文件(也称为“依赖JAR”),这些文件通常被打包在一个更大的可执行 JAR 内。
工作原理
当使用 spring-boot-maven-plugin
或 spring-boot-gradle-plugin
构建 Spring Boot 应用时,最终生成的 JAR 文件会有一个特定的结构。这个结构包括:
- 引导类加载器:
spring-boot-loader
模块中的类充当了引导类加载器的角色。 - /BOOT-INF/classes/:这是你应用程序的主要代码存放的地方,类似于普通 JAR 文件的根目录。
- /BOOT-INF/lib/:这里存放的是你的应用所依赖的所有第三方库。
- /META-INF/MANIFEST.MF:清单文件中包含了一个
Start-Class
属性,指定了应用程序的入口点(主类)。
类加载机制
Java 默认的类加载机制是基于委托模式的,即子类加载器在尝试加载一个类之前,先委托给父类加载器。但是,在 Spring Boot 的可执行 JAR 中,由于 /BOOT-INF/classes/
和 /BOOT-INF/lib/
中的类不在标准的类路径上,所以需要一种特殊的方式来加载它们。spring-boot-loader
提供了一组自定义的类加载器来处理这种情况,比如 LaunchedURLClassLoader
,它能够正确地从 JAR 内部的位置加载类。
使用场景
当你构建一个独立的、可执行的 Spring Boot 应用程序,并希望将所有依赖打包到一个单独的 JAR 文件中时,spring-boot-loader
就发挥了作用。这不仅简化了部署过程,还确保了所有必要的依赖都与应用程序捆绑在一起,从而减少了版本冲突的可能性。