18-SpringBootLoader原理

张开发
2026/6/2 13:00:16 15 分钟阅读
18-SpringBootLoader原理
Spring Boot Loader 原理详解一、概述Spring Boot Loader 是 Spring Boot 可执行 JAR 的核心组件,它允许将应用及其所有依赖打包成一个独立的可执行 JAR 文件,无需外部容器即可运行。二、可执行 JAR 结构2.1 JAR 内部结构myapp.jar ├── META-INF/ │ ├── MANIFEST.MF # JAR 清单文件 │ └── spring/ # Spring 配置 ├── BOOT-INF/ │ ├── classes/ # 应用类文件 │ │ └── com/example/... │ ├── classpath.idx # 类路径索引 │ ├── layers.idx # 分层索引(可选) │ └── lib/ # 依赖库 │ ├── spring-boot-4.x.x.jar │ ├── spring-core-6.x.x.jar │ └── ... └── org/springframework/boot/loader/ ├── Launcher.class # 启动器基类 ├── MainMethodRunner.class ├── JarLauncher.class # JAR 启动器 ├── WarLauncher.class # WAR 启动器 ├── archive/ │ ├── Archive.class │ ├── JarFileArchive.class │ └── ExplodedArchive.class └── jar/ ├── Handler.class # URL 协议处理器 └── JarFile.class # 嵌套 JAR 支持2.2 MANIFEST.MF 示例Manifest-Version: 1.0 Main-Class: org.springframework.boot.loader.launch.JarLauncher Start-Class: com.example.MyApplication Spring-Boot-Version: 4.0.0 Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/三、核心类分析3.1 Launcher 类层次Launcher (抽象基类) ├── JarLauncher - 用于可执行 JAR ├── WarLauncher - 用于可执行 WAR └── PropertiesLauncher - 支持外部配置3.2 JarLauncher 源码publicclassJarLauncherextendsExecutableArchiveLauncher{staticfinalStringBOOT_INF_CLASSES="BOOT-INF/classes/";staticfinalStringBOOT_INF_LIB="BOOT-INF/lib/";publicJarLauncher()throwsException{}protectedJarLauncher(Archivearchive){super(archive);}@OverrideprotectedbooleanisNestedArchive(Archive.Entryentry){if(entry.isDirectory()){returnentry.getName().equals(BOOT_INF_CLASSES);}returnentry.getName().startsWith(BOOT_INF_LIB);}publicstaticvoidmain(String[]args)throwsException{newJarLauncher().launch(args);}}3.3 ExecutableArchiveLauncherpublicabstractclassExecutableArchiveLauncherextendsLauncher{privatefinalArchivearchive;publicExecutableArchiveLauncher()throwsException{this.archive=createArchive();}protectedExecutableArchiveLauncher(Archivearchive){this.archive=archive;}@OverrideprotectedClassLoadercreateClassLoader(IteratorArchivearchives)throwsException{ListURLurls=newArrayList();while(archives.hasNext()){urls.add(archives.next().getUrl(

更多文章