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
example.jar | +-META-INF |+-MANIFEST.MF +-org |+-springframework |+-boot |+-loader |+-<spring boot loader classes> +-BOOT-INF+-classes|+-mycompany|+-project|+-YourClasses.class+-lib+-dependency1.jar+-dependency2.jarBOOT-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包的入口类:
Manifest-Version: 1.0Main-Class: org.springframework.boot.loader.JarLauncherStart-Class: top.wisely.springasync.SpringAsyncApplicationSpring-Boot-Version: 2.7.2Spring-Boot-Classes: BOOT-INF/classes/Spring-Boot-Lib: BOOT-INF/lib/Spring-Boot-Classpath-Index: BOOT-INF/classpath.idxSpring-Boot-Layers-Index: BOOT-INF/layers.idx- Main-Class: org.springframework.boot.loader.JarLauncher 是主入口类.
- JarLauncher extends ExecutableArchiveLauncher 并且 ExecutableArchiveLauncher extends Launcher
- JarLauncher 的main方法:
public class JarLauncher extends ExecutableArchiveLauncher {//... public static void main(String[] args) throws Exception {new JarLauncher().launch(args); }//...}- 所以真正的 launch(args) 方法在 Launcher 类中:
public abstract class Launcher {protected void launch(String[] args) throws Exception {if (!isExploded()) {JarFile.registerUrlProtocolHandler();}ClassLoader classLoader = createClassLoader(getClassPathArchivesIterator()); //①String jarMode = System.getProperty("jarmode");String launchClass = (jarMode != null && !jarMode.isEmpty()) ? JAR_MODE_LAUNCHER : getMainClass(); //②launch(args, launchClass, classLoader);//③ }}① classLoader - 创建LaunchedURLClassLoader 实例. 所有的 BOOT-INF/classes 和 BOOT-INF/jar classes 都是由 LaunchedURLClassLoader 加载 。② launchClass - 从 META-INF/MANIFEST.MF 获取Start-Class 。
③ 使用 args,launchClass,classLoader 启动应用 。
【Spring Boot独立运行的jar包是如何工作的】
推荐阅读
- |专家建议:大城市30岁还未实现经济独立的女性,趁早回老家!
- Intel|Intel独立显卡驱动已成噩梦!一次评测发现43个Bug
- 华擎|Intel独立显卡不再中国独享:海外卖出“超低价”
- 国产|独立上游!国产系统deepin V23 Preview发布:六大新特性
- 大学生|独立学院大学生冒充985高校考编,被拆穿后自导自演,结局真尴尬
- 专家|建议30岁未经济独立女性尽早回老家引热议:专家本人回应 真相更无语
- 专家|专家建议30岁未经济独立女性尽早回老家:网友集体反怼
- SpringSecurity登陆受权出现This object has not been built问题解决
- SpringBoot的六边形架构案例
- Spring 场景下突破 pebble 模板注入限制
