Spring Boot独立运行的jar包是如何工作的
2023-02-19 12:22:26 时间
Spring Boot使用Spring Boot Gradle Plugin或者Spring Boot Maven Plugin将程序打包成可以独立运行的jar包的。
Spring Boot使用Spring Boot Loader通过java -jar来启动jar包。
我们来解压一下Spring Boot的jar包(jar其实是一个zip文件)
我们可以看到解压的目录下有三个子目录:BOOT-INF,META-INF,org
BOOT-INF
- BOOT-INF/classes: 应用程序的classes文件
- BOOT-INF/lib: 内嵌依赖包
- BOOT-INF/classpath.idx: jar包添加到classpath的顺序
- BOOT-INF/layers.idx: 允许将 jar 拆分为逻辑层以创建Docker/OCI镜像
META-INF
META-INF/MANIFEST.MF: 有关jar中包含的文件的信息
org
Spring Boot Loader的classes
探索Spring Boot的魔法
我们将通过一步一步的jar包启动步骤来分析这个过程:
- java -jar
- 在META-INF/MANIFEST.MF文件中寻找可执行jar包的入口类:
- Main-Class: org.springframework.boot.loader.JarLauncher 是主入口类.
- JarLauncher extends ExecutableArchiveLauncher并且ExecutableArchiveLauncher extends Launcher
- JarLauncher 的main方法:
- 所以真正的 launch(args) 方法在 Launcher 类中:
① classLoader - 创建LaunchedURLClassLoader 实例. 所有的 BOOT-INF/classes 和 BOOT-INF/jar classes 都是由 LaunchedURLClassLoader 加载。
② launchClass - 从 META-INF/MANIFEST.MF 获取Start-Class。
③ 使用 args,launchClass,classLoader 启动应用。
文章出自:爱科学的卫斯理,作者:汪云飞。如有转载本文请联系爱科学的卫斯理今日头条号。
相关文章
- Java 多线程(七):线程池
- Java 多线程(五):锁(三)
- Java 多线程(四):锁(二)
- Java 多线程(三):锁(一)
- Java 多线程(二):并发编程的三大特性
- Java 多线程(一):基础
- Java SE 18 新增特性
- Java SE 17 新增特性
- Java SE 16 新增特性
- Java SE 15 新增特性
- Java SE 14 新增特性
- Java SE 10 Application Class-Data Sharing 示例
- Java SE 13 新增特性
- Java SE 12 新增特性
- Java SE 11 新增特性
- Java SE 10 新增特性
- Java SE 9 模块化示例
- Java SE 9 多版本兼容 JAR 包示例
- Java SE 9 新增特性
- Java SE 8 新增特性